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/05 03:02:38 UTC

svn commit: r1538853 - in /zookeeper/trunk: CHANGES.txt src/java/main/org/apache/zookeeper/client/StaticHostProvider.java src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java

Author: camille
Date: Tue Nov  5 02:02:37 2013
New Revision: 1538853

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

Modified:
    zookeeper/trunk/CHANGES.txt
    zookeeper/trunk/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java
    zookeeper/trunk/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java

Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1538853&r1=1538852&r2=1538853&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Tue Nov  5 02:02:37 2013
@@ -674,6 +674,9 @@ IMPROVEMENTS:
   in OSGi MANIFEST (Arnoud Glimmerveen via phunt)
 
   ZOOKEEPER-1715. Upgrade netty version (Sean Bridges via phunt)
+  
+  ZOOKEEPER-1666. Avoid Reverse DNS lookup if the hostname in 
+  connection string is literal IP address. (George Cao via camille)
 
 headers
 

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java?rev=1538853&r1=1538852&r2=1538853&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java Tue Nov  5 02:02:37 2013
@@ -116,8 +116,18 @@ public final class StaticHostProvider im
             InetAddress resolvedAddresses[] = InetAddress.getAllByName((ia!=null) ? ia.getHostAddress():
                     address.getHostName());
             for (InetAddress resolvedAddress : resolvedAddresses) {
-                tmpList.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) {
+                    tmpList.add(new InetSocketAddress(InetAddress.getByAddress(address.getHostName(),
+                            resolvedAddress.getAddress()), address.getPort()));
+                } else {
+                    tmpList.add(new InetSocketAddress(resolvedAddress.getHostAddress(), address.getPort()));
+                }
             }
         }
         Collections.shuffle(tmpList, sourceOfRandomness);

Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java?rev=1538853&r1=1538852&r2=1538853&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/test/StaticHostProviderTest.java Tue Nov  5 02:02:37 2013
@@ -333,4 +333,33 @@ public class StaticHostProviderTest exte
         return (1 + slackPercent/100.0) * numClients / numServers;
     }
 
+    @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(!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), r.nextLong());
+    }
+
+    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;
+    }
 }