You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by ij...@apache.org on 2018/06/23 23:34:04 UTC
[kafka] branch 1.1 updated: MINOR: Avoid coarse lock in
Pool#getAndMaybePut (#5258)
This is an automated email from the ASF dual-hosted git repository.
ijuma pushed a commit to branch 1.1
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/1.1 by this push:
new dc3acb0 MINOR: Avoid coarse lock in Pool#getAndMaybePut (#5258)
dc3acb0 is described below
commit dc3acb065a62972b43988b6a26f1b85c12e648ad
Author: Colin Patrick McCabe <co...@cmccabe.xyz>
AuthorDate: Sat Jun 23 16:33:04 2018 -0700
MINOR: Avoid coarse lock in Pool#getAndMaybePut (#5258)
Use `ConcurrentHashMap#computeIfAbsent` which relies on
per key locks.
Reviewers: Ismael Juma <is...@juma.me.uk>
---
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 4ddf557..f19dd98 100644
--- a/core/src/main/scala/kafka/utils/Pool.scala
+++ b/core/src/main/scala/kafka/utils/Pool.scala
@@ -26,7 +26,6 @@ import kafka.common.KafkaException
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)
@@ -56,21 +55,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)