Browse Source

ZOOKEEPER-1018. The connection permutation in get_addrs uses a weak and inefficient shuffle

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1088792 13f79535-47bb-0310-9956-ffa450edef68
Benjamin Reed 14 năm trước cách đây
mục cha
commit
b1dc6a62d4
3 tập tin đã thay đổi với 9 bổ sung8 xóa
  1. 2 0
      CHANGES.txt
  2. 6 7
      src/c/src/zookeeper.c
  3. 1 1
      src/c/tests/TestZookeeperInit.cc

+ 2 - 0
CHANGES.txt

@@ -194,6 +194,8 @@ BUGFIXES:
 
   ZOOKEEPER-880. QuorumCnxManager$SendWorker grows without bounds (vishal via breed)
 
+  ZOOKEEPER-1018. The connection permutation in get_addrs uses a weak and inefficient shuffle (Stephen Tyree via breed)
+
 IMPROVEMENTS:
   ZOOKEEPER-724. Improve junit test integration - log harness information 
   (phunt via mahadev)

+ 6 - 7
src/c/src/zookeeper.c

@@ -605,13 +605,12 @@ int getaddrs(zhandle_t *zh)
     if(!disable_conn_permute){
         setup_random();
         /* Permute */
-        for(i = 0; i < zh->addrs_count; i++) {
-            struct sockaddr_storage *s1 = zh->addrs + random()%zh->addrs_count;
-            struct sockaddr_storage *s2 = zh->addrs + random()%zh->addrs_count;
-            if (s1 != s2) {
-                struct sockaddr_storage t = *s1;
-                *s1 = *s2;
-                *s2 = t;
+        for (i = zh->addrs_count - 1; i > 0; --i) {
+            long int j = random()%(i+1);
+            if (i != j) {
+                struct sockaddr_storage t = zh->addrs[i];
+                zh->addrs[i] = zh->addrs[j];
+                zh->addrs[j] = t;
             }
         }
     }

+ 1 - 1
src/c/tests/TestZookeeperInit.cc

@@ -279,7 +279,7 @@ public:
         const char EXPECTED[][5]={"\0\0\0\0","\1\1\1\1","\2\2\2\2","\3\3\3\3"};
         const int EXPECTED_ADDR_COUNT=COUNTOF(EXPECTED);
 
-        const int RAND_SEQ[]={0,1,2,3,1,3,2,0,-1};
+        const int RAND_SEQ[]={0,1,1,-1};
         const int RAND_SIZE=COUNTOF(RAND_SEQ);
         Mock_random randomMock;
         randomMock.randomReturns.assign(RAND_SEQ,RAND_SEQ+RAND_SIZE-1);