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