[
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)