Github user anmolnar commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/534#discussion_r192696652 --- Diff: src/java/main/org/apache/zookeeper/client/StaticHostProvider.java --- @@ -96,36 +115,46 @@ public StaticHostProvider(Collection<InetSocketAddress> serverAddresses) { */ public StaticHostProvider(Collection<InetSocketAddress> serverAddresses, long randomnessSeed) { - sourceOfRandomness = new Random(randomnessSeed); + init(serverAddresses, randomnessSeed, new Resolver() { + @Override + public InetAddress[] getAllByName(String name) throws UnknownHostException { + return InetAddress.getAllByName(name); + } + }); + } - this.serverAddresses = resolveAndShuffle(serverAddresses); - if (this.serverAddresses.isEmpty()) { + private void init(Collection<InetSocketAddress> serverAddresses, long randomnessSeed, Resolver resolver) { + this.sourceOfRandomness = new Random(randomnessSeed); + this.resolver = resolver; + if (serverAddresses.isEmpty()) { throw new IllegalArgumentException( "A HostProvider may not be empty!"); - } + } + this.serverAddresses = shuffle(serverAddresses); currentIndex = -1; - lastIndex = -1; + lastIndex = -1; } - private List<InetSocketAddress> resolveAndShuffle(Collection<InetSocketAddress> serverAddresses) { - List<InetSocketAddress> tmpList = new ArrayList<InetSocketAddress>(serverAddresses.size()); - for (InetSocketAddress address : serverAddresses) { - try { - InetAddress ia = address.getAddress(); - String addr = (ia != null) ? ia.getHostAddress() : address.getHostString(); - InetAddress resolvedAddresses[] = InetAddress.getAllByName(addr); - for (InetAddress resolvedAddress : resolvedAddresses) { - InetAddress taddr = InetAddress.getByAddress(address.getHostString(), resolvedAddress.getAddress()); - tmpList.add(new InetSocketAddress(taddr, address.getPort())); - } - } catch (UnknownHostException ex) { - LOG.warn("No IP address found for server: {}", address, ex); + private InetSocketAddress resolve(InetSocketAddress address) { + try { + String curHostString = address.getHostString(); + List<InetAddress> resolvedAddresses = new ArrayList<>(Arrays.asList(this.resolver.getAllByName(curHostString))); + if (resolvedAddresses.isEmpty()) { + return address; } + Collections.shuffle(resolvedAddresses); + return new InetSocketAddress(resolvedAddresses.get(0), address.getPort()); + } catch (UnknownHostException e) { --- End diff -- That's correct. The caller will end up getting UnknownHostException when trying to open the socket to the unresolvable address: ``` 2018-06-04 12:31:26,022 [myid:huhuuhujkdshgfjksgd.com:2181] - WARN [main-SendThread(huhuuhujkdshgfjksgd.com:2181):ClientCnxn$SendThread@1237] - Session 0x0 for server huhuuhujkdshgfjksgd.com:2181, unexpected error, closing socket connection and attempting reconnect java.nio.channels.UnresolvedAddressException at sun.nio.ch.Net.checkAddress(Net.java:101) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622) at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:275) at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:285) at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1091) at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1133) ``` Logging makes sense, I added an error log entry to make it clear.
---