diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java index 043e52a52e..1eb27f8fca 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java @@ -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; diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java index a0417d6365..163e80dfc4 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java @@ -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 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( diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java index e16c2a3d37..0f9cfc3f97 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java @@ -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; + } } diff --git a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml index fd72618d91..3a001319b6 100644 --- a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml +++ b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml @@ -3051,4 +3051,12 @@ System tags to group related properties together. + + + ipc.client.bind.wildcard.addr + false + When set to true Clients will bind socket to wildcard + address. (i.e 0.0.0.0) + + diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java index b463c959da..30176f202c 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java @@ -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 void assertBetterArrayEquals(T[] expect, T[]got) { String expectStr = StringUtils.join(expect, ", "); String gotStr = StringUtils.join(got, ", ");