Author: peter_firmstone Date: Sun Jan 27 05:10:13 2013 New Revision: 1439020
URL: http://svn.apache.org/viewvc?rev=1439020&view=rev Log: Fix index out of range for LookupServices Changed waitForDiscovery() method to wait on object monitor for discovery events with a timeout. I suspect that the synchronized block inside the loop and following loop can optimised outside the loop by the compiler, waiting on the object monitor ensures the lock is released, so that discovery events can be received. Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java?rev=1439020&r1=1439019&r2=1439020&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java Sun Jan 27 05:10:13 2013 @@ -304,6 +304,7 @@ abstract public class BaseQATest extends synchronized(this){ discardedMap.remove(l); discoveredMap.put(l, groups); + this.notifyAll(); } } @@ -383,6 +384,7 @@ abstract public class BaseQATest extends (LocatorGroupsPair)locGroupsList.get(i); discoveredMap.put(pair.getLocator(), pair.getGroups()); }//end loop + this.notifyAll(); }//end sync(this) }//end setDiscoveredMap @@ -403,6 +405,7 @@ abstract public class BaseQATest extends discoveredMap.put(pair.getLocator(), pair.getGroups()); expectedDiscardedMap.put(pair.getLocator(), pair.getGroups()); }//end loop + this.notifyAll(); }//end sync(this) }//end clearDiscardEventInfo @@ -829,6 +832,7 @@ abstract public class BaseQATest extends logger.log(Level.FINE, " number of currently discovered lookup(s) = " +discoveredMap.size()); + this.notifyAll(); }//end sync(this) } else {//(regs == null) logger.log(Level.FINE, " discard event received " @@ -1568,9 +1572,9 @@ abstract public class BaseQATest extends boolean discoveryComplete = false; boolean showCompInfo = true;//turn this off after 1st pass thru loop Map discoveredClone = null; + synchronized (listener){ iLoop: - for(int i=0;i<nSecsToWait1;i++) { - synchronized(listener) { + for(int i=0;i<nSecsToWait1;i++) { Map discoveredMap = listener.discoveredMap; Map expectedDiscoveredMap = listener.expectedDiscoveredMap; @@ -1660,10 +1664,16 @@ abstract public class BaseQATest extends +discoveredMap.size()+")"); }//endif }//endif(nEventsReceived == nEventsExpected) - }//end sync(listener) - DiscoveryServiceUtil.delayMS(1000); - showCompInfo = false;//display comparison info only when i = 0 - }//end loop(iLoop) + try { + listener.wait(1000); // Wait for discovery for up to 1000 ms. + } catch (InterruptedException ex) { + throw new TestException("Interrupted while waiting for discovery", ex); + } + //DiscoveryServiceUtil.delayMS(1000); + showCompInfo = false;//display comparison info only when i = 0 + }//end loop(iLoop) + + }//end sync(listener) logger.log(Level.FINE, " DISCOVERY wait period complete"); synchronized(listener) { if(!discoveryComplete) { @@ -1681,9 +1691,9 @@ abstract public class BaseQATest extends +" discovery event(s) expected, " +listener.discoveredMap.size() +" discovery event(s) received"); - }//end sync(listener) + }//end waitForDiscovery - + } // end sync (listener) /** Common code shared by each test that needs to wait for discarded * events from the discovery helper utility, and verify that the * expected discarded events have indeed arrived. @@ -1718,9 +1728,9 @@ abstract public class BaseQATest extends boolean discardComplete = false; boolean showCompInfo = true;//turn this off after 1st pass thru loop Map discardedClone = null; - iLoop: - for(int i=0;i<nSecsToWait1;i++) { - synchronized(listener) { + synchronized (listener){ + iLoop: + for(int i=0;i<nSecsToWait1;i++) { Map discardedMap = listener.discardedMap; Map expectedDiscardedMap = listener.expectedDiscardedMap; @@ -1810,10 +1820,15 @@ abstract public class BaseQATest extends +discardedMap.size()+")"); }//endif }//endif(nEventsReceived == nEventsExpected) - }//end sync(listener) - DiscoveryServiceUtil.delayMS(1000); - showCompInfo = false;//display comparison info only when i = 0 - }//end loop(iLoop) + try { + listener.wait(1000); + } catch (InterruptedException ex) { + throw new TestException("Test interrupted while waiting for discard", ex); + } + //DiscoveryServiceUtil.delayMS(1000); + showCompInfo = false;//display comparison info only when i = 0 + }//end loop(iLoop) + }//end sync(listener) logger.log(Level.FINE, " DISCARD wait period complete"); synchronized(listener) { if(!discardComplete) { @@ -1868,9 +1883,9 @@ abstract public class BaseQATest extends boolean changeComplete = false; boolean showCompInfo = true;//turn this off after 1st pass thru loop Map changedClone = null; - iLoop: - for(int i=0;i<nSecsToWait1;i++) { - synchronized(listener) { + synchronized (listener){ + iLoop: + for(int i=0;i<nSecsToWait1;i++) { Map changedMap = listener.changedMap; Map expectedChangedMap = listener.expectedChangedMap; if(displayOn && @@ -1959,10 +1974,15 @@ abstract public class BaseQATest extends +changedMap.size()+")"); }//endif }//endif(nEventsReceived == nEventsExpected) - }//end sync(listener) - DiscoveryServiceUtil.delayMS(1000); - showCompInfo = false;//display comparison info only when i = 0 - }//end loop(iLoop) + try { + listener.wait(1000); + } catch (InterruptedException ex) { + throw new TestException("Test interrupted while waiting for change event", ex); + } + //DiscoveryServiceUtil.delayMS(1000); + showCompInfo = false;//display comparison info only when i = 0 + }//end loop(iLoop) + }//end sync(listener) logger.log(Level.FINE, " CHANGE wait period complete"); synchronized(listener) { if(!changeComplete) { Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java?rev=1439020&r1=1439019&r2=1439020&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java Sun Jan 27 05:10:13 2013 @@ -609,17 +609,18 @@ public class LookupServices { }//end portInUse private void refreshLookupLocatorListsAt(int index){ + //Only update existing records, ignore new dynamicly started lookups. LocatorGroupsPair locGroupsPair = lookupsStarted.get(index); /* index range of init lookups */ int initLookupsBegin = nRemoteLookupServices + nAddRemoteLookupServices; int initLookupsEnd = initLookupsBegin + nLookupServices; /* index range of add lookups */ - int addLookupsBegin = nRemoteLookupServices + nAddRemoteLookupServices + nLookupServices; + int addLookupsBegin = initLookupsEnd; int addLookupsEnd = addLookupsBegin + nAddLookupServices; /* update lookup lists */ if (index >= initLookupsBegin && index < initLookupsEnd) initLookupsToStart.set(index,locGroupsPair); - if (index >= addLookupsBegin && index < addLookupsEnd) addLookupsToStart.set(index, locGroupsPair); - allLookupsToStart.set(index,locGroupsPair); + if (index >= addLookupsBegin && index < addLookupsEnd) addLookupsToStart.set(index-addLookupsBegin, locGroupsPair); + if (index < allLookupsToStart.size()) allLookupsToStart.set(index,locGroupsPair); } private LocatorGroupsPair getLocatorGroupsPair(int indx, String[] groups) throws TestException {
