HBASE-12742

Signed-off-by: stack <stack@apache.org>
This commit is contained in:
Jurriaan Mous 2014-12-22 17:35:19 +01:00 committed by stack
parent 0d5f967c7f
commit e92a9bf003
2 changed files with 49 additions and 5 deletions

View File

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

View File

@ -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<Channel>(NioDatagramChannel.class, family))
.option(ChannelOption.SO_REUSEADDR, true)