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; }