This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d8bad4  Don't cache Bookie hostname DNS resolution forever
3d8bad4 is described below

commit 3d8bad44a40ce5cb173df5dfd7cb06d81bed26e1
Author: Matteo Merli <[email protected]>
AuthorDate: Sun Oct 28 05:56:47 2018 -0700

    Don't cache Bookie hostname DNS resolution forever
    
    ### Motivation
    
    `BookieSocketAddress` is resolving the bookie DNS name in its constructor 
and then using the already resolved `InetSocketAddress` instance.
    
    If the IP of a bookie changes, the BK client will continue to use the old 
IP address.
    
    ### Changes
    
    Construct a new `InetSocketAddress` each time `getSocketAddress()` gets 
called (eg: each time we attempt to make a new connection) so that we're making 
sure to get the right IP.
    
    I cannot think of a good way to add unit test for this at this point, 
suggestions are welcome.
    
    I think this should be included in a patch release as well 4.7.3 or 4.8.1
    
    Reviewers: Andrey Yegorov <None>, Enrico Olivelli <[email protected]>, 
Sijie Guo <[email protected]>, Ivan Kelly <[email protected]>
    
    This closes #1762 from merlimat/fix-dns
---
 .../java/org/apache/bookkeeper/net/BookieSocketAddress.java   | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/BookieSocketAddress.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/BookieSocketAddress.java
index 4e8f324..6d562e3 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/BookieSocketAddress.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/BookieSocketAddress.java
@@ -39,13 +39,10 @@ public class BookieSocketAddress {
     private final String hostname;
     private final int port;
 
-    private final InetSocketAddress socketAddress;
-
     // Constructor that takes in both a port.
     public BookieSocketAddress(String hostname, int port) {
         this.hostname = hostname;
         this.port = port;
-        socketAddress = new InetSocketAddress(hostname, port);
     }
 
     // Constructor from a String "serialized" version of this class.
@@ -60,7 +57,6 @@ public class BookieSocketAddress {
         } catch (NumberFormatException nfe) {
             throw new UnknownHostException(addr);
         }
-        socketAddress = new InetSocketAddress(hostname, port);
     }
 
     // Public getters
@@ -74,7 +70,12 @@ public class BookieSocketAddress {
 
     // Method to return an InetSocketAddress for the regular port.
     public InetSocketAddress getSocketAddress() {
-        return socketAddress;
+        // Return each time a new instance of the InetSocketAddress because 
the hostname
+        // gets resolved in its constructor and then cached forever.
+        // If we keep using the same InetSocketAddress instance, if bookies 
are advertising
+        // hostnames and the IP change, the BK client will keep forever to try 
to connect
+        // to the old IP.
+        return new InetSocketAddress(hostname, port);
     }
 
     /**

Reply via email to