You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2018/08/17 15:54:10 UTC

[bookkeeper] branch branch-4.8 updated: [BOOKIE] Avoid throwing exceptions if a loopback address is returned from the possible ip check

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

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


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

commit 9307ffe24f189666f25a495df7f8d2d7699e64f5
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 <eo...@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 d59a7e2..e9e4d15 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
@@ -316,13 +316,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));
@@ -569,7 +579,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;
     }