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

                 Key: ZOOKEEPER-1018
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1018
             Project: ZooKeeper
          Issue Type: Improvement
          Components: c client
    Affects Versions: 3.3.2
            Reporter: Stephen Tyree
            Priority: Minor


After determining all of the addresses in the get_addrs function in the C 
client, the connection is permuted using the following code:

        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;
            }
        }

Not only does this shuffle produce an uneven permutation, but it is half as 
efficient as the Fisher-Yates shuffle which produces an unbiased one. It seems 
like it would be a simple fix to increase the randomness and efficiency of the 
shuffle by switching over to using Fisher-Yates.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to