Benedict Jin created ZOOKEEPER-2840:
---------------------------------------

             Summary: Should using `System.nanoTime() ^ this.hashCode()` for 
StaticHostProvider
                 Key: ZOOKEEPER-2840
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2840
             Project: ZooKeeper
          Issue Type: Bug
          Components: java client
    Affects Versions: 3.5.3
            Reporter: Benedict Jin
            Assignee: Benedict Jin


Should using `System.nanoTime() ^ this.hashCode()` for StaticHostProvider 
instead of `System.currentTimeMillis()`. Because if we have three Zookeeper 
server nodes and set the `zookeeper.leaderServes` as `no`, then those 
connections from client will always connect with the first Zookeeper server 
node. Due to...

```java
    @Test
    public void testShuffle() throws Exception {
        LinkedList<InetSocketAddress> inetSocketAddressesList = new 
LinkedList<>();
        inetSocketAddressesList.add(new InetSocketAddress(0));
        inetSocketAddressesList.add(new InetSocketAddress(1));
        inetSocketAddressesList.add(new InetSocketAddress(2));
        /*
        1442045361
        currentTime: 1499253530044, currentTime ^ hashCode: 1500143845389, 
Result: 1 2 0
        currentTime: 1499253530044, currentTime ^ hashCode: 1500143845389, 
Result: 2 0 1
        currentTime: 1499253530045, currentTime ^ hashCode: 1500143845388, 
Result: 0 1 2
        currentTime: 1499253530045, currentTime ^ hashCode: 1500143845388, 
Result: 1 2 0
        currentTime: 1499253530046, currentTime ^ hashCode: 1500143845391, 
Result: 1 2 0
        currentTime: 1499253530046, currentTime ^ hashCode: 1500143845391, 
Result: 1 2 0
        currentTime: 1499253530046, currentTime ^ hashCode: 1500143845391, 
Result: 1 2 0
        currentTime: 1499253530046, currentTime ^ hashCode: 1500143845391, 
Result: 1 2 0
        currentTime: 1499253530047, currentTime ^ hashCode: 1500143845390, 
Result: 1 2 0
        currentTime: 1499253530047, currentTime ^ hashCode: 1500143845390, 
Result: 1 2 0
         */
        internalShuffleMillis(inetSocketAddressesList);
        /*
        146611050
        currentTime: 22618159623770, currentTime ^ hashCode: 22618302559536, 
Result: 2 1 0
        currentTime: 22618159800738, currentTime ^ hashCode: 22618302085832, 
Result: 0 1 2
        currentTime: 22618159967442, currentTime ^ hashCode: 22618302248888, 
Result: 1 0 2
        currentTime: 22618160135080, currentTime ^ hashCode: 22618302013634, 
Result: 2 1 0
        currentTime: 22618160302095, currentTime ^ hashCode: 22618301535077, 
Result: 2 1 0
        currentTime: 22618160490260, currentTime ^ hashCode: 22618301725822, 
Result: 1 0 2
        currentTime: 22618161566373, currentTime ^ hashCode: 22618300303823, 
Result: 1 0 2
        currentTime: 22618161745518, currentTime ^ hashCode: 22618300355844, 
Result: 2 1 0
        currentTime: 22618161910357, currentTime ^ hashCode: 22618291603775, 
Result: 2 1 0
        currentTime: 22618162079549, currentTime ^ hashCode: 22618291387479, 
Result: 0 1 2
         */
        internalShuffleNano(inetSocketAddressesList);

        inetSocketAddressesList.clear();
        inetSocketAddressesList.add(new InetSocketAddress(0));
        inetSocketAddressesList.add(new InetSocketAddress(1));

        /*
        415138788
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530050, currentTime ^ hashCode: 1499124456998, 
Result: 0 1
        currentTime: 1499253530053, currentTime ^ hashCode: 1499124456993, 
Result: 0 1
        currentTime: 1499253530055, currentTime ^ hashCode: 1499124456995, 
Result: 0 1
        currentTime: 1499253530055, currentTime ^ hashCode: 1499124456995, 
Result: 0 1
        currentTime: 1499253530055, currentTime ^ hashCode: 1499124456995, 
Result: 0 1
         */
        internalShuffleMillis(inetSocketAddressesList);
        /*
        13326370
        currentTime: 22618168292396, currentTime ^ hashCode: 22618156149774, 
Result: 1 0
        currentTime: 22618168416181, currentTime ^ hashCode: 22618156535703, 
Result: 1 0
        currentTime: 22618168534056, currentTime ^ hashCode: 22618156432394, 
Result: 0 1
        currentTime: 22618168666548, currentTime ^ hashCode: 22618155774358, 
Result: 0 1
        currentTime: 22618168818946, currentTime ^ hashCode: 22618155623712, 
Result: 0 1
        currentTime: 22618168936821, currentTime ^ hashCode: 22618156011863, 
Result: 1 0
        currentTime: 22618169056251, currentTime ^ hashCode: 22618155893721, 
Result: 1 0
        currentTime: 22618169611103, currentTime ^ hashCode: 22618157370237, 
Result: 1 0
        currentTime: 22618169744528, currentTime ^ hashCode: 22618156713138, 
Result: 1 0
        currentTime: 22618171273170, currentTime ^ hashCode: 22618184562672, 
Result: 1 0
         */
        internalShuffleNano(inetSocketAddressesList);
    }

    private void internalShuffleMillis(LinkedList<InetSocketAddress> 
inetSocketAddressesList) throws Exception {
        int hashCode = new 
StaticHostProvider(inetSocketAddressesList).hashCode();
        System.out.println(hashCode);
        int count = 10;
        Random r;
        while (count > 0) {
            long currentTime = System.currentTimeMillis();
            r = new Random(currentTime ^ hashCode);
            System.out.print(String.format("currentTime: %s, currentTime ^ 
hashCode: %s, Result: ",
                    currentTime, currentTime ^ hashCode));
            Collections.shuffle(inetSocketAddressesList, r);
            for (InetSocketAddress inetSocketAddress : inetSocketAddressesList) 
{
                System.out.print(String.format("%s ", 
inetSocketAddress.getPort()));
            }
            System.out.println();
            count--;
        }
    }

    private void internalShuffleNano(LinkedList<InetSocketAddress> 
inetSocketAddressesList) throws Exception {
        int hashCode = new 
StaticHostProvider(inetSocketAddressesList).hashCode();
        System.out.println(hashCode);
        int count = 10;
        Random r;
        while (count > 0) {
            long currentTime = System.nanoTime();
            r = new Random(currentTime ^ hashCode);
            System.out.print(String.format("currentTime: %s, currentTime ^ 
hashCode: %s, Result: ",
                    currentTime, currentTime ^ hashCode));
            Collections.shuffle(inetSocketAddressesList, r);
            for (InetSocketAddress inetSocketAddress : inetSocketAddressesList) 
{
                System.out.print(String.format("%s ", 
inetSocketAddress.getPort()));
            }
            System.out.println();
            count--;
        }
    }
```



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to