You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ha...@apache.org on 2017/05/26 22:29:20 UTC

zookeeper git commit: ZOOKEEPER-2691: recreateSocketAddresses may recreate the unreachable …

Repository: zookeeper
Updated Branches:
  refs/heads/branch-3.4 3a5381499 -> 159ead6f1


ZOOKEEPER-2691: recreateSocketAddresses may recreate the unreachable …

…IP address

Author: Jiang Jiafu <ji...@gmail.com>
Author: JiangJiafu <ji...@gmail.com>

Reviewers: Michael Han <ha...@apache.org>, Abraham Fine <af...@apache.org>, Edward Ribeiro <ed...@gmail.com>

Closes #173 from JiangJiafu/ZOOKEEPER-2691


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/159ead6f
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/159ead6f
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/159ead6f

Branch: refs/heads/branch-3.4
Commit: 159ead6f1d503c635957b7b92d122043321d8451
Parents: 3a53814
Author: Jiang Jiafu <ji...@gmail.com>
Authored: Fri May 26 15:29:16 2017 -0700
Committer: Michael Han <ha...@apache.org>
Committed: Fri May 26 15:29:16 2017 -0700

----------------------------------------------------------------------
 .../content/xdocs/zookeeperAdmin.xml            | 20 +++++++
 .../zookeeper/server/quorum/QuorumPeer.java     | 63 ++++++++++++++++----
 2 files changed, 73 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/159ead6f/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
----------------------------------------------------------------------
diff --git a/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml b/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
index 27060e0..1faa773 100644
--- a/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
+++ b/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
@@ -1076,6 +1076,26 @@ server.3=zoo3:2888:3888</programlisting>
             </listitem>
           </varlistentry>
 
+          <varlistentry>
+            <term>zookeeper.ipReachableTimeout</term>
+
+            <listitem>
+              <para>(Java system property: <emphasis
+                      role="bold">zookeeper.ipReachableTimeout</emphasis>)</para>
+
+              <para><emphasis role="bold">New in 3.4.11:</emphasis>
+                Set this timeout value for IP addresses reachable checking when hostname is resolved, as mesured in
+                milliseconds.
+                By default, ZooKeeper will use the first IP address of the hostname(without any reachable checking).
+                When zookeeper.ipReachableTimeout is set(larger than 0), ZooKeeper will will try to pick up the first 
+                IP address which is reachable. This is done by calling Java API InetAddress.isReachable(long timeout)
+                function, in which this timeout value is used. If none of such reachable IP address can be found, the
+                first IP address of the hostname will be used anyway.
+              </para>
+
+            </listitem>
+          </varlistentry>
+
         </variablelist>
         <para></para>
       </section>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/159ead6f/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
----------------------------------------------------------------------
diff --git a/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
index 05d0a1b..53f6077 100644
--- a/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
+++ b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
@@ -138,19 +138,19 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider
         public QuorumServer(long id, String hostname,
                             Integer port, Integer electionPort,
                             LearnerType type) {
-	        this.id = id;
-	        this.hostname=hostname;
-	        if (port!=null){
+	    this.id = id;
+	    this.hostname=hostname;
+	    if (port!=null){
                 this.port=port;
-	        }
-	        if (electionPort!=null){
+	    }
+	    if (electionPort!=null){
                 this.electionPort=electionPort;
-	        }
-	        if (type!=null){
+	    }
+	    if (type!=null){
                 this.type = type;
-	        }
-	        this.recreateSocketAddresses();
 	    }
+	    this.recreateSocketAddresses();
+	}
 
         /**
          * Performs a DNS lookup of hostname and (re)creates the this.addr and
@@ -164,7 +164,23 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider
         public void recreateSocketAddresses() {
             InetAddress address = null;
             try {
-                address = InetAddress.getByName(this.hostname);
+                // the time, in milliseconds, before {@link InetAddress#isReachable} aborts
+                // in {@link #getReachableAddress}.
+                int ipReachableTimeout = 0;
+                String ipReachableValue = System.getProperty("zookeeper.ipReachableTimeout");
+                if (ipReachableValue != null) {
+                    try {
+                        ipReachableTimeout = Integer.parseInt(ipReachableValue);
+                    } catch (NumberFormatException e) {
+                        LOG.error("{} is not a valid number", ipReachableValue);
+                    }
+                }
+                // zookeeper.ipReachableTimeout is not defined
+                if (ipReachableTimeout <= 0) {
+                    address = InetAddress.getByName(this.hostname);
+                } else {
+                    address = getReachableAddress(this.hostname, ipReachableTimeout);
+                }
                 LOG.info("Resolved hostname: {} to address: {}", this.hostname, address);
                 this.addr = new InetSocketAddress(address, this.port);
                 if (this.electionPort > 0){
@@ -186,6 +202,33 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider
             }
         }
 
+        /**
+         * Resolve the hostname to IP addresses, and find one reachable address.
+         *
+         * @param hostname the name of the host
+         * @param timeout the time, in milliseconds, before {@link InetAddress#isReachable}
+         *                aborts
+         * @return a reachable IP address. If no such IP address can be found,
+         *         just return the first IP address of the hostname.
+         *
+         * @exception UnknownHostException
+         */
+        public InetAddress getReachableAddress(String hostname, int timeout) 
+                throws UnknownHostException {
+            InetAddress[] addresses = InetAddress.getAllByName(hostname);
+            for (InetAddress a : addresses) {
+                try {
+                    if (a.isReachable(timeout)) {
+                        return a;
+                    } 
+                } catch (IOException e) {
+                    LOG.warn("IP address {} is unreachable", a);
+                }
+            }
+            // All the IP addresses are unreachable, just return the first one.
+            return addresses[0];
+        }
+
         public InetSocketAddress addr;
 
         public InetSocketAddress electionAddr;