diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 2cf508eda2a..f335da5ae2e 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -230,6 +230,9 @@ Release 2.0.3-alpha - Unreleased HADOOP-9183. Potential deadlock in ActiveStandbyElector. (tomwhite) + HADOOP-9203. RPCCallBenchmark should find a random available port. + (Andrew Purtell via suresh) + Release 2.0.2-alpha - 2012-09-07 INCOMPATIBLE CHANGES 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 d61ac9b5023..29d8af9fd7f 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 @@ -25,6 +25,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.NetworkInterface; import java.net.NoRouteToHostException; +import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; @@ -865,4 +866,23 @@ public class NetUtils { } return addrs; } + + /** + * Return a free port number. There is no guarantee it will remain free, so + * it should be used immediately. + * + * @returns A free port for binding a local socket + */ + public static int getFreeSocketPort() { + int port = 0; + try { + ServerSocket s = new ServerSocket(0); + port = s.getLocalPort(); + s.close(); + return port; + } catch (IOException e) { + // Could not get a free port. Return default port 0. + } + return port; + } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java index 21aa44a7c99..d358913ef05 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java @@ -67,7 +67,7 @@ public class RPCCallBenchmark implements Tool, Configurable { private int serverReaderThreads = 1; private int clientThreads = 0; private String host = "0.0.0.0"; - private int port = 12345; + private int port = 0; public int secondsToRun = 15; private int msgSize = 1024; public Class rpcEngine = @@ -201,11 +201,21 @@ public class RPCCallBenchmark implements Tool, Configurable { } } + public int getPort() { + if (port == 0) { + port = NetUtils.getFreeSocketPort(); + if (port == 0) { + throw new RuntimeException("Could not find a free port"); + } + } + return port; + } + @Override public String toString() { return "rpcEngine=" + rpcEngine + "\nserverThreads=" + serverThreads + "\nserverReaderThreads=" + serverReaderThreads + "\nclientThreads=" - + clientThreads + "\nhost=" + host + "\nport=" + port + + clientThreads + "\nhost=" + host + "\nport=" + getPort() + "\nsecondsToRun=" + secondsToRun + "\nmsgSize=" + msgSize; } } @@ -228,12 +238,12 @@ public class RPCCallBenchmark implements Tool, Configurable { .newReflectiveBlockingService(serverImpl); server = new RPC.Builder(conf).setProtocol(TestRpcService.class) - .setInstance(service).setBindAddress(opts.host).setPort(opts.port) + .setInstance(service).setBindAddress(opts.host).setPort(opts.getPort()) .setNumHandlers(opts.serverThreads).setVerbose(false).build(); } else if (opts.rpcEngine == WritableRpcEngine.class) { server = new RPC.Builder(conf).setProtocol(TestProtocol.class) .setInstance(new TestRPC.TestImpl()).setBindAddress(opts.host) - .setPort(opts.port).setNumHandlers(opts.serverThreads) + .setPort(opts.getPort()).setNumHandlers(opts.serverThreads) .setVerbose(false).build(); } else { throw new RuntimeException("Bad engine: " + opts.rpcEngine); @@ -378,7 +388,7 @@ public class RPCCallBenchmark implements Tool, Configurable { * Create a client proxy for the specified engine. */ private RpcServiceWrapper createRpcClient(MyOptions opts) throws IOException { - InetSocketAddress addr = NetUtils.createSocketAddr(opts.host, opts.port); + InetSocketAddress addr = NetUtils.createSocketAddr(opts.host, opts.getPort()); if (opts.rpcEngine == ProtobufRpcEngine.class) { final TestRpcService proxy = RPC.getProxy(TestRpcService.class, 0, addr, conf);