From a9993d428cf8b66aecae3616311702cb882647a7 Mon Sep 17 00:00:00 2001 From: "Colin P. Mccabe" Date: Wed, 20 Jun 2018 11:20:44 -0700 Subject: [PATCH 1/3] MINOR: Avoid using a big lock in pool#getAndMaybePut Avoid using a big createLock in pool#getAndMaybePut by using the ConcurrentHashMap#computeIfAbsent function. --- core/src/main/scala/kafka/utils/Pool.scala | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/core/src/main/scala/kafka/utils/Pool.scala b/core/src/main/scala/kafka/utils/Pool.scala index 742d3dc66fd1f..8944527265a72 100644 --- a/core/src/main/scala/kafka/utils/Pool.scala +++ b/core/src/main/scala/kafka/utils/Pool.scala @@ -27,7 +27,6 @@ import collection.JavaConverters._ class Pool[K,V](valueFactory: Option[K => V] = None) extends Iterable[(K, V)] { private val pool: ConcurrentMap[K, V] = new ConcurrentHashMap[K, V] - private val createLock = new Object def put(k: K, v: V): V = pool.put(k, v) @@ -57,21 +56,10 @@ class Pool[K,V](valueFactory: Option[K => V] = None) extends Iterable[(K, V)] { * @param createValue Factory function. * @return The final value associated with the key. */ - def getAndMaybePut(key: K, createValue: => V): V = { - val current = pool.get(key) - if (current == null) { - createLock synchronized { - val current = pool.get(key) - if (current == null) { - val value = createValue - pool.put(key, value) - value - } - else current - } - } - else current - } + def getAndMaybePut(key: K, createValue: => V): V = + pool.computeIfAbsent(key, new java.util.function.Function[K,V] { + override def apply(k:K):V = createValue + }) def contains(id: K): Boolean = pool.containsKey(id) From 1dbc5ca28ad08573badf199f9383e6c8a3651148 Mon Sep 17 00:00:00 2001 From: "Colin P. Mccabe" Date: Fri, 22 Jun 2018 14:58:32 -0700 Subject: [PATCH 2/3] improve formatting --- core/src/main/scala/kafka/utils/Pool.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/kafka/utils/Pool.scala b/core/src/main/scala/kafka/utils/Pool.scala index 8944527265a72..d0081b8b54839 100644 --- a/core/src/main/scala/kafka/utils/Pool.scala +++ b/core/src/main/scala/kafka/utils/Pool.scala @@ -58,7 +58,7 @@ class Pool[K,V](valueFactory: Option[K => V] = None) extends Iterable[(K, V)] { */ def getAndMaybePut(key: K, createValue: => V): V = pool.computeIfAbsent(key, new java.util.function.Function[K,V] { - override def apply(k:K):V = createValue + override def apply(k:K): V = createValue }) def contains(id: K): Boolean = pool.containsKey(id) From 520d7ee87a37b007a539cf50837374b3090a1c7a Mon Sep 17 00:00:00 2001 From: Ismael Juma Date: Sat, 23 Jun 2018 16:02:21 -0700 Subject: [PATCH 3/3] Formatting fixes --- core/src/main/scala/kafka/utils/Pool.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/kafka/utils/Pool.scala b/core/src/main/scala/kafka/utils/Pool.scala index d0081b8b54839..5dd61946f0d29 100644 --- a/core/src/main/scala/kafka/utils/Pool.scala +++ b/core/src/main/scala/kafka/utils/Pool.scala @@ -57,9 +57,9 @@ class Pool[K,V](valueFactory: Option[K => V] = None) extends Iterable[(K, V)] { * @return The final value associated with the key. */ def getAndMaybePut(key: K, createValue: => V): V = - pool.computeIfAbsent(key, new java.util.function.Function[K,V] { - override def apply(k:K): V = createValue - }) + pool.computeIfAbsent(key, new java.util.function.Function[K, V] { + override def apply(k: K): V = createValue + }) def contains(id: K): Boolean = pool.containsKey(id)