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

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


The following commit(s) were added to refs/heads/branch-4.7 by this push:
     new e7226b1  [BOOKIE] Avoid throwing exceptions if a loopback address is 
returned from the possible ip check
e7226b1 is described below

commit e7226b16b1ce4ffb1492141f62d7dfa272fcdde1
Author: Sijie Guo <si...@apache.org>
AuthorDate: Fri Aug 17 08:53:13 2018 -0700

    [BOOKIE] Avoid throwing exceptions if a loopback address is returned from 
the possible ip check
    
    Descriptions of the changes in this PR:
    
     ### Motivation
    
    At some network environment, a loopback address might be returned by 
default. However when you
    want to specify `advertisedAddress` to avoid the loopback address, it still 
throws exception as
    following:
    
    ```
    17:23:35.696 [main] ERROR org.apache.bookkeeper.server.Main - Failed to 
build bookie server
    org.apache.bookkeeper.bookie.BookieException$UnknownBookieIdException: 
java.net.UnknownHostException: Trying to listen on loopback address, 
127.0.0.1:3181 but this is forbidden by default (see 
ServerConfiguration#getAllowLoopback())
        at 
org.apache.bookkeeper.bookie.Bookie.possibleBookieIds(Bookie.java:325) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.bookie.Bookie.checkEnvironmentWithStorageExpansion(Bookie.java:415)
 ~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.bookie.Bookie.checkEnvironment(Bookie.java:256) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at org.apache.bookkeeper.bookie.Bookie.<init>(Bookie.java:627) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.proto.BookieServer.newBookie(BookieServer.java:115) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.proto.BookieServer.<init>(BookieServer.java:96) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.server.service.BookieService.<init>(BookieService.java:42)
 ~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at org.apache.bookkeeper.server.Main.buildBookieServer(Main.java:299) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at org.apache.bookkeeper.server.Main.doMain(Main.java:219) 
[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at org.apache.bookkeeper.server.Main.main(Main.java:201) 
[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at org.apache.bookkeeper.proto.BookieServer.main(BookieServer.java:252) 
[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
    Caused by: java.net.UnknownHostException: Trying to listen on loopback 
address, 127.0.0.1:3181 but this is forbidden by default (see 
ServerConfiguration#getAllowLoopback())
        at 
org.apache.bookkeeper.bookie.Bookie.getBookieAddress(Bookie.java:564) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        at 
org.apache.bookkeeper.bookie.Bookie.possibleBookieIds(Bookie.java:315) 
~[org.apache.bookkeeper-bookkeeper-server-4.7.1.jar:4.7.1]
        ... 10 more
    ```
    
    The exception is thrown on `possibleBookieIds` check. However we don't need 
to throw exception on `possibleBookieIds` check
    if it is a loopback address. We can defer the exception until bookie 
attempts to listen on the loopback address.
    
    Author: Sijie Guo <si...@apache.org>
    
    Reviewers: Ivan Kelly <iv...@apache.org>, Enrico Olivelli 
<eolive...@gmail.com>, Jia Zhai <None>
    
    This closes #1609 from sijie/avoid_exceptions_on_possible_ips
    
    (cherry picked from commit 0459d673891c911ba8ed8e83a90f083b71a9d413)
    Signed-off-by: Sijie Guo <si...@apache.org>
---
 .../java/org/apache/bookkeeper/bookie/Bookie.java     | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
index b391c53..8af7513 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
@@ -310,13 +310,23 @@ public class Bookie extends BookieCriticalThread {
         // we need to loop through all possible bookie identifiers to ensure 
it is treated as a new environment
         // just because of bad configuration
         List<BookieSocketAddress> addresses = 
Lists.newArrayListWithExpectedSize(3);
+        // we are checking all possibilities here, so we don't need to fail if 
we can only get
+        // loopback address. it will fail anyway when the bookie attempts to 
listen on loopback address.
         try {
             // ip address
             addresses.add(getBookieAddress(
-                new 
ServerConfiguration(conf).setUseHostNameAsBookieID(false).setAdvertisedAddress(null)));
+                new ServerConfiguration(conf)
+                    .setUseHostNameAsBookieID(false)
+                    .setAdvertisedAddress(null)
+                    .setAllowLoopback(true)
+            ));
             // host name
             addresses.add(getBookieAddress(
-                new 
ServerConfiguration(conf).setUseHostNameAsBookieID(true).setAdvertisedAddress(null)));
+                new ServerConfiguration(conf)
+                    .setUseHostNameAsBookieID(true)
+                    .setAdvertisedAddress(null)
+                    .setAllowLoopback(true)
+            ));
             // advertised address
             if (null != conf.getAdvertisedAddress()) {
                 addresses.add(getBookieAddress(conf));
@@ -563,7 +573,10 @@ public class Bookie extends BookieCriticalThread {
             && !conf.getAllowLoopback()) {
             throw new UnknownHostException("Trying to listen on loopback 
address, "
                     + addr + " but this is forbidden by default "
-                    + "(see ServerConfiguration#getAllowLoopback())");
+                    + "(see ServerConfiguration#getAllowLoopback()).\n"
+                    + "If this happen, you can consider specifying the network 
interface"
+                    + " to listen on (e.g. listeningInterface=eth0) or 
specifying the"
+                    + " advertised address (e.g. 
advertisedAddress=172.x.y.z)");
         }
         return addr;
     }

Reply via email to