[
https://issues.apache.org/jira/browse/ZOOKEEPER-1861?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13871657#comment-13871657
]
Ted Yu commented on ZOOKEEPER-1861:
-----------------------------------
To avoid allocating extra ArrayBlockingQueue, I am thinking of the following:
* create a singleton ArrayBlockingQueue which serves as marker
* if queueSendMap.putIfAbsent(sid, singleton) returns null, create the real
ArrayBlockingQueue, named bq, and call queueSendMap.replace(sid, bq)
* if queueSendMap.putIfAbsent(sid, singleton) returns non-null value, check
whether the return is singleton, if so, wait till queueSendMap.get(sid) returns
a value which is not singleton.
> ConcurrentHashMap isn't used properly in QuorumCnxManager
> ---------------------------------------------------------
>
> Key: ZOOKEEPER-1861
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1861
> Project: ZooKeeper
> Issue Type: Bug
> Reporter: Ted Yu
> Assignee: Ted Yu
> Priority: Minor
> Attachments: zookeeper-1861-v1.txt, zookeeper-1861-v2.txt
>
>
> queueSendMap is a ConcurrentHashMap.
> At line 210:
> {code}
> if (!queueSendMap.containsKey(sid)) {
> queueSendMap.put(sid, new ArrayBlockingQueue<ByteBuffer>(
> SEND_CAPACITY));
> {code}
> By the time control enters if block, there may be another concurrent put with
> same sid to the ConcurrentHashMap.
> putIfAbsent() should be used.
> Similar issue occurs at line 307 as well.
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)