Author: camille Date: Fri Feb 14 00:34:30 2014 New Revision: 1568176 URL: http://svn.apache.org/r1568176 Log: ZOOKEEPER-1861. ConcurrentHashMap isn't used properly in QuorumCnxManager (Ted Yu via camille)
Modified: zookeeper/trunk/CHANGES.txt zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java Modified: zookeeper/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1568176&r1=1568175&r2=1568176&view=diff ============================================================================== --- zookeeper/trunk/CHANGES.txt (original) +++ zookeeper/trunk/CHANGES.txt Fri Feb 14 00:34:30 2014 @@ -554,6 +554,9 @@ BUGFIXES: unregister failed jmxbeans (Rakesh R via michim) ZOOKEEPER-1844. TruncateTest fails on windows (Rakesh R via fpj) + + ZOOKEEPER-1861. ConcurrentHashMap isn't used properly in QuorumCnxManager + (Ted Yu via camille) IMPROVEMENTS: Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java?rev=1568176&r1=1568175&r2=1568176&view=diff ============================================================================== --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java (original) +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java Fri Feb 14 00:34:30 2014 @@ -207,10 +207,8 @@ public class QuorumCnxManager { vsw.finish(); senderWorkerMap.put(sid, sw); - if (!queueSendMap.containsKey(sid)) { - queueSendMap.put(sid, new ArrayBlockingQueue<ByteBuffer>( + queueSendMap.putIfAbsent(sid, new ArrayBlockingQueue<ByteBuffer>( SEND_CAPACITY)); - } sw.start(); rw.start(); @@ -304,10 +302,8 @@ public class QuorumCnxManager { senderWorkerMap.put(sid, sw); - if (!queueSendMap.containsKey(sid)) { - queueSendMap.put(sid, new ArrayBlockingQueue<ByteBuffer>( + queueSendMap.putIfAbsent(sid, new ArrayBlockingQueue<ByteBuffer>( SEND_CAPACITY)); - } sw.start(); rw.start(); @@ -335,19 +331,13 @@ public class QuorumCnxManager { /* * Start a new connection if doesn't have one already. */ - if (!queueSendMap.containsKey(sid)) { - ArrayBlockingQueue<ByteBuffer> bq = new ArrayBlockingQueue<ByteBuffer>( - SEND_CAPACITY); - queueSendMap.put(sid, bq); - addToSendQueue(bq, b); - + ArrayBlockingQueue<ByteBuffer> bq = new ArrayBlockingQueue<ByteBuffer>( + SEND_CAPACITY); + ArrayBlockingQueue<ByteBuffer> oldq = queueSendMap.putIfAbsent(sid, bq); + if (oldq != null) { + addToSendQueue(oldq, b); } else { - ArrayBlockingQueue<ByteBuffer> bq = queueSendMap.get(sid); - if(bq != null){ - addToSendQueue(bq, b); - } else { - LOG.error("No queue for server " + sid); - } + addToSendQueue(bq, b); } connectOne(sid);