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 <[email protected]>
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 <[email protected]>
Reviewers: Ivan Kelly <[email protected]>, Enrico Olivelli
<[email protected]>, Jia Zhai <None>
This closes #1609 from sijie/avoid_exceptions_on_possible_ips
(cherry picked from commit 0459d673891c911ba8ed8e83a90f083b71a9d413)
Signed-off-by: Sijie Guo <[email protected]>
---
.../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;
}