Author: peter_firmstone Date: Sat Nov 10 10:32:46 2012 New Revision: 1407747
URL: http://svn.apache.org/viewvc?rev=1407747&view=rev Log: Enable Reggie to handle a ServerSocket caught in the 4 minute TCP 2MSL TIME_WAIT state, can be safely interrupted. This should fix failing tests on ARM platform. Modified: river/jtsk/trunk/src/com/sun/jini/reggie/RegistrarImpl.java Modified: river/jtsk/trunk/src/com/sun/jini/reggie/RegistrarImpl.java URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/reggie/RegistrarImpl.java?rev=1407747&r1=1407746&r2=1407747&view=diff ============================================================================== --- river/jtsk/trunk/src/com/sun/jini/reggie/RegistrarImpl.java (original) +++ river/jtsk/trunk/src/com/sun/jini/reggie/RegistrarImpl.java Sat Nov 10 10:32:46 2012 @@ -48,6 +48,7 @@ import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; import java.lang.reflect.Array; +import java.net.BindException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -55,6 +56,7 @@ import java.net.MulticastSocket; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; +import java.net.SocketAddress; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -2501,10 +2503,30 @@ class RegistrarImpl implements Registrar } } if (listen == null) { - listen = serverSocketFactory.createServerSocket(port); + try { + listen = createServerSocket(serverSocketFactory, port); + }catch ( BindException ex){ + try { + Thread.sleep(240000); // Wait 4 minutes for TCP 2MSL TIME_WAIT + listen = createServerSocket(serverSocketFactory, port); + }catch (BindException e){ + e.fillInStackTrace(); + throw new IOException("Reggie ServerSocket port already in use: " + port, e); + }catch (InterruptedException e){ + e.fillInStackTrace(); + throw new IOException("Reggie ServerSocket creation interrupted after sleeping for TIME_WAIT", e); + } + } } this.port = listen.getLocalPort(); } + + private ServerSocket createServerSocket(ServerSocketFactory ssf, int port) throws IOException{ + ServerSocket socket = ssf.createServerSocket(); + SocketAddress sa = new InetSocketAddress(port); + socket.bind(sa); + return socket; + } public void run() { while (!hasBeenInterrupted()) {
