Author: peter_firmstone Date: Sun Nov 18 14:16:07 2012 New Revision: 1410889
URL: http://svn.apache.org/viewvc?rev=1410889&view=rev Log: Refactor DiscoveryProtocolSimulator, fix synchronization and InetAddress issues, the qa test suite is somewhat brittle on concurrent hardware, these issues are becoming more apparent as River concurrency improves. Modified: river/jtsk/trunk/qa/src/com/sun/jini/test/share/DiscoveryProtocolSimulator.java Modified: river/jtsk/trunk/qa/src/com/sun/jini/test/share/DiscoveryProtocolSimulator.java URL: http://svn.apache.org/viewvc/river/jtsk/trunk/qa/src/com/sun/jini/test/share/DiscoveryProtocolSimulator.java?rev=1410889&r1=1410888&r2=1410889&view=diff ============================================================================== --- river/jtsk/trunk/qa/src/com/sun/jini/test/share/DiscoveryProtocolSimulator.java (original) +++ river/jtsk/trunk/qa/src/com/sun/jini/test/share/DiscoveryProtocolSimulator.java Sun Nov 18 14:16:07 2012 @@ -156,26 +156,18 @@ public class DiscoveryProtocolSimulator private static Logger logger = Logger.getLogger("com.sun.jini.qa.harness"); - /** Socket timeout for multicast request receive() */ - private static final int SOCKET_TIMEOUT = 5*60*1000; - - /** Only allow connections from this address */ - private InetAddress thisInetAddress = null; + private volatile InetAddress thisInetAddress = null; /** Current number of multicast announcements sent by this class */ - private int nAnnouncements = 0; - /** Internet Protocol (IP) addresses of the network interfaces (NICs) - * through which multicast packets will be sent. - */ - private InetAddress[] nicAddresses; + private volatile int nAnnouncements = 0; /** Port for unicast discovery * lockLookupLocator for synch */ - private int unicastPort = 0; + private volatile int unicastPort = 0; /** The locator to send */ private volatile LookupLocator lookupLocator = null; /** The member groups to send */ - private String[] memberGroups = {}; + private volatile String[] memberGroups = {}; /** Thread to receive/process multicast requests from client or service */ final MulticastThread multicastRequestThread; @@ -295,9 +287,11 @@ public class DiscoveryProtocolSimulator } } } - multicastRequestThread = new MulticastThread(); + // Create and Start remaining threads. multicastAnnouncementThread = new AnnounceThread(); - unicastRequestThread = new UnicastThread(unicastPort); + multicastRequestThread = new MulticastThread(); + multicastRequestThread.start(); + multicastAnnouncementThread.start(); }//end constructor public void stopAnnouncements() { @@ -324,6 +318,7 @@ public class DiscoveryProtocolSimulator logger.log(Level.FINE, " close all request sockets"); closeRequestSockets(taskMgr.getPending()); logger.log(Level.FINE, " stopAnnouncements exited"); + Thread.currentThread().interrupt(); //Restore interrupt. }//end stopAnnouncements // public void destroyLookup() throws RemoteException { @@ -579,10 +574,17 @@ public class DiscoveryProtocolSimulator if (port == 0) { try { listen = new ServerSocket(Constants.discoveryPort); - } catch (IOException e) { - logger.log(Level.FINE, - "failed to bind to default port", e); - } + } catch (BindException e){ + try { + Thread.sleep(240000); // TIME_WAIT + listen = new ServerSocket(Constants.discoveryPort); // Try again. + } catch (IOException ex){ + logger.log(Level.FINE, "Failed to bind to default port", ex); + } catch (InterruptedException ex){ + ex.fillInStackTrace(); + throw new IOException("Interrupted while trying to open a ServerSocket", ex); + } + } } if (listen == null) { try { @@ -1097,11 +1099,25 @@ public class DiscoveryProtocolSimulator { if (qaConfig == null) throw new NullPointerException("QAConfig cannot be null"); String host = System.getProperty("java.rmi.server.hostname"); - if (host == null) { - host = InetAddress.getLocalHost().getHostName(); + try { + if (host == null) { + host = InetAddress.getLocalHost().getHostName(); + } + thisInetAddress = InetAddress.getByName(host); + } catch (NullPointerException e){ + try { + thisInetAddress = InetAddress.getByName(null); + if (host == null){ + host = thisInetAddress.getCanonicalHostName(); + } + } catch (NullPointerException ex){ + ex.fillInStackTrace(); + throw new IOException("InetAddress host name resolution failed", ex); + } } - thisInetAddress = InetAddress.getByName(host); - lookupLocator = QAConfig.getConstrainedLocator(host, unicastRequestThread.port); + + unicastRequestThread = new UnicastThread(unicastPort); + lookupLocator = QAConfig.getConstrainedLocator(host, unicastPort); /* start an activatable lookup service simulation */ if (lookupServiceID == null) { lookupServiceID = lookupProxy.getServiceID(); @@ -1189,8 +1205,7 @@ public class DiscoveryProtocolSimulator /* start the threads */ unicastRequestThread.start(); - multicastRequestThread.start(); - multicastAnnouncementThread.start(); + }//end init }//end class DiscoveryProtocolSimulator
