HADOOP-15250. Split-DNS MultiHomed Server Network Cluster Network IPC Client Bind Addr Wrong

Contributed by Ajay Kumar
This commit is contained in:
Steve Loughran 2018-05-01 22:32:40 +01:00
parent 68c6ec719d
commit 8f42dafcf8
5 changed files with 48 additions and 4 deletions

View File

@ -341,6 +341,10 @@ public class CommonConfigurationKeys extends CommonConfigurationKeysPublic {
public static final String IPC_CLIENT_FALLBACK_TO_SIMPLE_AUTH_ALLOWED_KEY = "ipc.client.fallback-to-simple-auth-allowed";
public static final boolean IPC_CLIENT_FALLBACK_TO_SIMPLE_AUTH_ALLOWED_DEFAULT = false;
public static final String IPC_CLIENT_BIND_WILDCARD_ADDR_KEY = "ipc.client"
+ ".bind.wildcard.addr";
public static final boolean IPC_CLIENT_BIND_WILDCARD_ADDR_DEFAULT = false;
public static final String IPC_CLIENT_CONNECT_MAX_RETRIES_ON_SASL_KEY =
"ipc.client.connect.max.retries.on.sasl";
public static final int IPC_CLIENT_CONNECT_MAX_RETRIES_ON_SASL_DEFAULT = 5;

View File

@ -135,6 +135,7 @@ public static void setCallIdAndRetryCount(int cid, int rc,
private final int connectionTimeout;
private final boolean fallbackAllowed;
private final boolean bindToWildCardAddress;
private final byte[] clientId;
private final int maxAsyncCalls;
private final AtomicInteger asyncCallCounter = new AtomicInteger(0);
@ -674,10 +675,10 @@ private synchronized void setupConnection(
InetAddress localAddr = NetUtils.getLocalInetAddress(host);
if (localAddr != null) {
this.socket.setReuseAddress(true);
if (LOG.isDebugEnabled()) {
LOG.debug("Binding " + principal + " to " + localAddr);
}
bindAddr = new InetSocketAddress(localAddr, 0);
localAddr = NetUtils.bindToLocalAddress(localAddr,
bindToWildCardAddress);
LOG.debug("Binding {} to {}", principal, localAddr);
this.socket.bind(new InetSocketAddress(localAddr, 0));
}
}
}
@ -1277,6 +1278,13 @@ public Client(Class<? extends Writable> valueClass, Configuration conf,
CommonConfigurationKeys.IPC_CLIENT_CONNECT_TIMEOUT_DEFAULT);
this.fallbackAllowed = conf.getBoolean(CommonConfigurationKeys.IPC_CLIENT_FALLBACK_TO_SIMPLE_AUTH_ALLOWED_KEY,
CommonConfigurationKeys.IPC_CLIENT_FALLBACK_TO_SIMPLE_AUTH_ALLOWED_DEFAULT);
this.bindToWildCardAddress = conf
.getBoolean(CommonConfigurationKeys.IPC_CLIENT_BIND_WILDCARD_ADDR_KEY,
CommonConfigurationKeys.IPC_CLIENT_BIND_WILDCARD_ADDR_DEFAULT);
LOG.debug("{} set to true. Will bind client sockets to wildcard "
+ "address.",
CommonConfigurationKeys.IPC_CLIENT_BIND_WILDCARD_ADDR_KEY);
this.clientId = ClientId.getClientId();
this.sendParamsExecutor = clientExcecutorFactory.refAndGetInstance();
this.maxAsyncCalls = conf.getInt(

View File

@ -952,4 +952,20 @@ public static int getFreeSocketPort() {
}
return port;
}
/**
* Return an @{@link InetAddress} to bind to. If bindWildCardAddress is true
* than returns null.
*
* @param localAddr
* @param bindWildCardAddress
* @returns InetAddress
*/
public static InetAddress bindToLocalAddress(InetAddress localAddr, boolean
bindWildCardAddress) {
if (!bindWildCardAddress) {
return localAddr;
}
return null;
}
}

View File

@ -3051,4 +3051,12 @@
System tags to group related properties together.
</description>
</property>
<property>
<name>ipc.client.bind.wildcard.addr</name>
<value>false</value>
<description>When set to true Clients will bind socket to wildcard
address. (i.e 0.0.0.0)
</description>
</property>
</configuration>

View File

@ -707,6 +707,14 @@ public void testTrimCreateSocketAddress() {
assertEquals(defaultAddr.trim(), NetUtils.getHostPortString(addr));
}
@Test
public void testBindToLocalAddress() throws Exception {
assertNotNull(NetUtils
.bindToLocalAddress(NetUtils.getLocalInetAddress("127.0.0.1"), false));
assertNull(NetUtils
.bindToLocalAddress(NetUtils.getLocalInetAddress("127.0.0.1"), true));
}
private <T> void assertBetterArrayEquals(T[] expect, T[]got) {
String expectStr = StringUtils.join(expect, ", ");
String gotStr = StringUtils.join(got, ", ");