You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by asdf2014 <gi...@git.apache.org> on 2017/07/05 12:23:35 UTC

[GitHub] zookeeper pull request #303: ZOOKEEPER-2840: Should using `System.nanoTime()...

GitHub user asdf2014 opened a pull request:

    https://github.com/apache/zookeeper/pull/303

    ZOOKEEPER-2840: Should using `System.nanoTime() ^ this.hashCode()` fo…

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

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/asdf2014/zookeeper ZOOKEEPER-2840

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/zookeeper/pull/303.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #303
    
----
commit dad9cdba24c825a56dfe94a277ea4232af429bdb
Author: asdf2014 <15...@qq.com>
Date:   2017-07-05T12:17:44Z

    ZOOKEEPER-2840: Should using `System.nanoTime() ^ this.hashCode()` for StaticHostProvider

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

[GitHub] zookeeper pull request #303: ZOOKEEPER-2840: Should using `System.nanoTime()...

Posted by maoling <gi...@git.apache.org>.
Github user maoling commented on a diff in the pull request:

    https://github.com/apache/zookeeper/pull/303#discussion_r135789082
  
    --- 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 --
    
    @asdf2014 
    - shift right a space(haha,original code is also not alignment)
    - according to [ZOOKEEPER-1990](https://issues.apache.org/jira/browse/ZOOKEEPER-1990)
       >    the goal here is to make sure that when multiple client threads start at the same time on the same machine 
             (such as in our systest) and execute this line each one is likely to have a different random seed.
    - your demo is not convincing because different client have different values of `this.hashCode()`(different instances) although the elements in inetSocketAddressesList is same. Look at my [demo](https://github.com/maoling/fuck_zookeeper/blob/master/src/java/test/com/apache/zookeeper/self/ZOOKEEPER_2840.java)


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

[GitHub] zookeeper pull request #303: ZOOKEEPER-2840: Should using `System.nanoTime()...

Posted by asdf2014 <gi...@git.apache.org>.
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.


---