Author: suresh Date: Mon Jan 14 23:48:50 2013 New Revision: 1433220 URL: http://svn.apache.org/viewvc?rev=1433220&view=rev Log: HADOOP-9203. RPCCallBenchmark should find a random available port. Contributec by Andrew Purtell.
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1433220&r1=1433219&r2=1433220&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt (original) +++ hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt Mon Jan 14 23:48:50 2013 @@ -540,6 +540,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 Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java?rev=1433220&r1=1433219&r2=1433220&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java (original) +++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java Mon Jan 14 23:48:50 2013 @@ -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; + } } Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java?rev=1433220&r1=1433219&r2=1433220&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java (original) +++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/RPCCallBenchmark.java Mon Jan 14 23:48:50 2013 @@ -67,7 +67,7 @@ public class RPCCallBenchmark implements 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<? extends RpcEngine> rpcEngine = @@ -201,11 +201,21 @@ public class RPCCallBenchmark implements } } + 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 .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 * 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);