You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ca...@apache.org on 2013/11/13 03:22:39 UTC

svn commit: r1541359 - in /zookeeper/branches/branch-3.4: CHANGES.txt src/java/main/org/apache/zookeeper/client/StaticHostProvider.java src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java

Author: camille
Date: Wed Nov 13 02:22:39 2013
New Revision: 1541359

URL: http://svn.apache.org/r1541359
Log:
ZOOKEEPER-1666. Avoid Reverse DNS lookup if the hostname in 
  connection string is literal IP address. (George Cao via camille)

Modified:
    zookeeper/branches/branch-3.4/CHANGES.txt
    zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java
    zookeeper/branches/branch-3.4/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java

Modified: zookeeper/branches/branch-3.4/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/CHANGES.txt?rev=1541359&r1=1541358&r2=1541359&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.4/CHANGES.txt Wed Nov 13 02:22:39 2013
@@ -186,6 +186,10 @@ IMPROVEMENTS:
 
   ZOOKEEPER-1627. Add org.apache.zookeeper.common to exported packages
   in OSGi MANIFEST (Arnoud Glimmerveen via phunt)
+  
+  ZOOKEEPER-1666. Avoid Reverse DNS lookup if the hostname in 
+  connection string is literal IP address. (George Cao via camille)
+  
 
 Release 3.4.5 - 2012-09-30
 

Modified: zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java?rev=1541359&r1=1541358&r2=1541359&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java (original)
+++ zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java Wed Nov 13 02:22:39 2013
@@ -61,11 +61,25 @@ public final class StaticHostProvider im
             InetAddress resolvedAddresses[] = InetAddress.getAllByName((ia!=null) ? ia.getHostAddress():
                 address.getHostName());
             for (InetAddress resolvedAddress : resolvedAddresses) {
-                this.serverAddresses.add(new InetSocketAddress(resolvedAddress
-                        .getHostAddress(), address.getPort()));
+                // If hostName is null but the address is not, we can tell that
+                // the hostName is an literal IP address. Then we can set the host string as the hostname
+                // safely to avoid reverse DNS lookup.
+                // As far as i know, the only way to check if the hostName is null is use toString().
+                // Both the two implementations of InetAddress are final class, so we can trust the return value of
+                // the toString() method.
+                if (resolvedAddress.toString().startsWith("/") 
+                        && resolvedAddress.getAddress() != null) {
+                    this.serverAddresses.add(
+                            new InetSocketAddress(InetAddress.getByAddress(
+                                    address.getHostName(),
+                                    resolvedAddress.getAddress()), 
+                                    address.getPort()));
+                } else {
+                    this.serverAddresses.add(new InetSocketAddress(resolvedAddress.getHostAddress(), address.getPort()));
+                }  
             }
         }
-
+        
         if (this.serverAddresses.isEmpty()) {
             throw new IllegalArgumentException(
                     "A HostProvider may not be empty!");

Modified: zookeeper/branches/branch-3.4/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java?rev=1541359&r1=1541358&r2=1541359&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java (original)
+++ zookeeper/branches/branch-3.4/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java Wed Nov 13 02:22:39 2013
@@ -35,10 +35,12 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Random;
 
 public class StaticHostProviderTest extends ZKTestCase {
     private static final Logger LOG = LoggerFactory.getLogger(StaticHostProviderTest.class);
-
+    
     @Test
     public void testNextGoesRound() throws UnknownHostException {
         HostProvider hostProvider = getHostProvider((byte) 2);
@@ -92,6 +94,36 @@ public class StaticHostProviderTest exte
         assertNotSame(first, second);
     }
 
+    @Test
+    public void testLiteralIPNoReverseNS() throws Exception {
+        byte size = 30;
+        HostProvider hostProvider = getHostProviderUnresolved(size);
+        for (int i = 0; i < size; i++) {
+            InetSocketAddress next = hostProvider.next(0);
+            assertTrue(next instanceof InetSocketAddress);
+            assertTrue(!next.isUnresolved());
+            assertTrue("Did not match "+ next.toString(), !next.toString().startsWith("/"));
+            // Do NOT trigger the reverse name service lookup.
+            String hostname = next.getHostName();
+            // In this case, the hostname equals literal IP address.
+            hostname.equals(next.getAddress().getHostAddress());
+        }
+    }
+
+    private StaticHostProvider getHostProviderUnresolved(byte size)
+            throws UnknownHostException {
+        return new StaticHostProvider(getUnresolvedServerAddresses(size));
+    }
+
+    private Collection<InetSocketAddress> getUnresolvedServerAddresses(byte size) {
+        ArrayList<InetSocketAddress> list = new ArrayList<InetSocketAddress>(size);
+        while (size > 0) {
+            list.add(InetSocketAddress.createUnresolved("10.10.10." + size, 1234 + size));
+            --size;
+        }
+        return list;
+    }
+    
     private StaticHostProvider getHostProvider(byte size)
             throws UnknownHostException {
         ArrayList<InetSocketAddress> list = new ArrayList<InetSocketAddress>(