STORM-497: don't modify the mapping while the someone could be reading it.

Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/f259f1da
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/f259f1da
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/f259f1da

Branch: refs/heads/security
Commit: f259f1da288171a9393fb500150d034ccca0d146
Parents: 5aae768
Author: Robert (Bobby) Evans <[email protected]>
Authored: Wed Sep 17 13:07:42 2014 +0000
Committer: Robert (Bobby) Evans <[email protected]>
Committed: Wed Sep 17 13:07:42 2014 +0000

----------------------------------------------------------------------
 .../jvm/backtype/storm/messaging/netty/Server.java    | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/f259f1da/storm-core/src/jvm/backtype/storm/messaging/netty/Server.java
----------------------------------------------------------------------
diff --git a/storm-core/src/jvm/backtype/storm/messaging/netty/Server.java 
b/storm-core/src/jvm/backtype/storm/messaging/netty/Server.java
index 20a147d..2499e65 100644
--- a/storm-core/src/jvm/backtype/storm/messaging/netty/Server.java
+++ b/storm-core/src/jvm/backtype/storm/messaging/netty/Server.java
@@ -56,7 +56,7 @@ class Server implements IConnection {
     final ServerBootstrap bootstrap;
     
     private int queueCount;
-    HashMap<Integer, Integer> taskToQueueId = null;
+    private volatile HashMap<Integer, Integer> taskToQueueId = null;
     int roundRobinQueueId;
        
     boolean closing = false;
@@ -131,18 +131,18 @@ class Server implements IConnection {
     
     private Integer getMessageQueueId(int task) {
       // try to construct the map from taskId -> queueId in round robin manner.
-      
       Integer queueId = taskToQueueId.get(task);
       if (null == queueId) {
-        synchronized(taskToQueueId) {
-          //assgin task to queue in round-robin manner
-          if (null == taskToQueueId.get(task)) {
+        synchronized (this) {
+          queueId = taskToQueueId.get(task);
+          if (queueId == null) {
             queueId = roundRobinQueueId++;
-            
-            taskToQueueId.put(task, queueId);
             if (roundRobinQueueId == queueCount) {
               roundRobinQueueId = 0;
             }
+            HashMap<Integer, Integer> newRef = new HashMap<Integer, 
Integer>(taskToQueueId);
+            newRef.put(task, queueId);
+            taskToQueueId = newRef;
           }
         }
       }

Reply via email to