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.


---

Reply via email to