Browse Source

ZOOKEEPER-1861. ConcurrentHashMap isn't used properly in QuorumCnxManager (Ted Yu via camille)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1568176 13f79535-47bb-0310-9956-ffa450edef68
Camille Fournier 11 years ago
parent
commit
d88a04ffdf

+ 3 - 0
CHANGES.txt

@@ -554,6 +554,9 @@ BUGFIXES:
   unregister failed jmxbeans (Rakesh R via michim)
   unregister failed jmxbeans (Rakesh R via michim)
 
 
   ZOOKEEPER-1844. TruncateTest fails on windows (Rakesh R via fpj)
   ZOOKEEPER-1844. TruncateTest fails on windows (Rakesh R via fpj)
+  
+  ZOOKEEPER-1861. ConcurrentHashMap isn't used properly in QuorumCnxManager 
+  (Ted Yu via camille)
 
 
 IMPROVEMENTS:
 IMPROVEMENTS:
 
 

+ 8 - 18
src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java

@@ -207,10 +207,8 @@ public class QuorumCnxManager {
                 vsw.finish();
                 vsw.finish();
             
             
             senderWorkerMap.put(sid, sw);
             senderWorkerMap.put(sid, sw);
-            if (!queueSendMap.containsKey(sid)) {
-                queueSendMap.put(sid, new ArrayBlockingQueue<ByteBuffer>(
+            queueSendMap.putIfAbsent(sid, new ArrayBlockingQueue<ByteBuffer>(
                         SEND_CAPACITY));
                         SEND_CAPACITY));
-            }
             
             
             sw.start();
             sw.start();
             rw.start();
             rw.start();
@@ -304,10 +302,8 @@ public class QuorumCnxManager {
             
             
             senderWorkerMap.put(sid, sw);
             senderWorkerMap.put(sid, sw);
             
             
-            if (!queueSendMap.containsKey(sid)) {
-                queueSendMap.put(sid, new ArrayBlockingQueue<ByteBuffer>(
+            queueSendMap.putIfAbsent(sid, new ArrayBlockingQueue<ByteBuffer>(
                         SEND_CAPACITY));
                         SEND_CAPACITY));
-            }
             
             
             sw.start();
             sw.start();
             rw.start();
             rw.start();
@@ -335,19 +331,13 @@ public class QuorumCnxManager {
              /*
              /*
               * Start a new connection if doesn't have one already.
               * 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 {
              } 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);
              connectOne(sid);