From e92a9bf0030fa07e0f279def1f274ed6da90ef84 Mon Sep 17 00:00:00 2001 From: Jurriaan Mous Date: Mon, 22 Dec 2014 17:35:19 +0100 Subject: [PATCH] HBASE-12742 Signed-off-by: stack --- .../apache/hadoop/hbase/util/Addressing.java | 42 ++++++++++++++++++- .../hbase/master/ClusterStatusPublisher.java | 12 ++++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Addressing.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Addressing.java index a7c929feac5..fce0d405795 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Addressing.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Addressing.java @@ -83,6 +83,34 @@ public class Addressing { } public static InetAddress getIpAddress() throws SocketException { + return getIpAddress(new AddressSelectionCondition() { + @Override + public boolean isAcceptableAddress(InetAddress addr) { + return addr instanceof Inet4Address || addr instanceof Inet6Address; + } + }); + } + + public static InetAddress getIp4Address() throws SocketException { + return getIpAddress(new AddressSelectionCondition() { + @Override + public boolean isAcceptableAddress(InetAddress addr) { + return addr instanceof Inet4Address; + } + }); + } + + public static InetAddress getIp6Address() throws SocketException { + return getIpAddress(new AddressSelectionCondition() { + @Override + public boolean isAcceptableAddress(InetAddress addr) { + return addr instanceof Inet6Address; + } + }); + } + + private static InetAddress getIpAddress(AddressSelectionCondition condition) throws + SocketException { // Before we connect somewhere, we cannot be sure about what we'd be bound to; however, // we only connect when the message where client ID is, is long constructed. Thus, // just use whichever IP address we can find. @@ -94,7 +122,7 @@ public class Addressing { while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); if (addr.isLoopbackAddress()) continue; - if (addr instanceof Inet4Address || addr instanceof Inet6Address) { + if (condition.isAcceptableAddress(addr)) { return addr; } } @@ -123,4 +151,16 @@ public class Addressing { } return local; } + + /** + * Interface for AddressSelectionCondition to check if address is acceptable + */ + public interface AddressSelectionCondition{ + /** + * Condition on which to accept inet address + * @param address to check + * @return true to accept this address + */ + public boolean isAcceptableAddress(InetAddress address); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java index 5fffcaace8c..6e7024ce4d4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java @@ -253,8 +253,6 @@ public class ClusterStatusPublisher extends Chore { @Override public void connect(Configuration conf) throws IOException { - NetworkInterface ni = NetworkInterface.getByInetAddress(Addressing.getIpAddress()); - String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS, HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS); int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT, @@ -269,13 +267,19 @@ public class ClusterStatusPublisher extends Chore { } final InetSocketAddress isa = new InetSocketAddress(mcAddress, port); - InternetProtocolFamily family = InternetProtocolFamily.IPv4; + + InternetProtocolFamily family; + InetAddress localAddress; if (ina instanceof Inet6Address) { + localAddress = Addressing.getIp6Address(); family = InternetProtocolFamily.IPv6; + }else{ + localAddress = Addressing.getIp4Address(); + family = InternetProtocolFamily.IPv4; } + NetworkInterface ni = NetworkInterface.getByInetAddress(localAddress); Bootstrap b = new Bootstrap(); - b.group(group) .channelFactory(new HBaseDatagramChannelFactory(NioDatagramChannel.class, family)) .option(ChannelOption.SO_REUSEADDR, true)