[ https://issues.apache.org/jira/browse/ZOOKEEPER-2840?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16438944#comment-16438944 ]
ASF GitHub Bot commented on ZOOKEEPER-2840: ------------------------------------------- Github user asdf2014 commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/303#discussion_r181613274 --- Diff: src/java/main/org/apache/zookeeper/client/StaticHostProvider.java --- @@ -71,7 +71,7 @@ * if serverAddresses is empty or resolves to an empty list */ public StaticHostProvider(Collection<InetSocketAddress> serverAddresses) { - sourceOfRandomness = new Random(System.currentTimeMillis() ^ this.hashCode()); + sourceOfRandomness = new Random(System.nanoTime() ^ this.hashCode()); --- End diff -- Hi, @maoling. Sorry for my belated comment. Indeed, i hadn't been considered this case that different clients will own different `hashcode`s. Because, in my sistuation, our Zookeeper clusters only give service to some apointed BigData components, e.g., [HBase](https://yuzhouwan.com/posts/45888/), [Druid.io](https://yuzhouwan.com/posts/5845/), [Hadoop](https://yuzhouwan.com/posts/60504/), [Kafka](https://yuzhouwan.com/posts/26002/) etc. Inside these components will have settled clients, so them can not offer too many different `hashcode`s. > 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 > Priority: Major > Fix For: 3.5.4 > > Original Estimate: 72h > Remaining Estimate: 72h > > 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 (v7.6.3#76005)