You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2012/11/15 13:47:22 UTC

svn commit: r1409757 - /river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java

Author: peter_firmstone
Date: Thu Nov 15 12:47:22 2012
New Revision: 1409757

URL: http://svn.apache.org/viewvc?rev=1409757&view=rev
Log:
Add synchronisation while using iterators, suspect memory visibility problems are causing test failures.

Modified:
    river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java

Modified: river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java?rev=1409757&r1=1409756&r2=1409757&view=diff
==============================================================================
--- river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java (original)
+++ river/jtsk/trunk/qa/src/com/sun/jini/test/share/BaseQATest.java Thu Nov 15 12:47:22 2012
@@ -515,14 +515,16 @@ abstract public class BaseQATest extends
         String[] getCurExpectedDiscoveredGroups() {
             HashSet groupSet = new HashSet(expectedDiscoveredMap.size());
             Set eSet = expectedDiscoveredMap.entrySet();
-	    Iterator iter = eSet.iterator();
-            while(iter.hasNext()) {
-                Map.Entry pair = (Map.Entry)iter.next();
-                String[] curGroups = (String[])pair.getValue();
-                for(int i=0;i<curGroups.length;i++) {
-                    groupSet.add(curGroups[i]);
+            synchronized (expectedDiscoveredMap){
+                Iterator iter = eSet.iterator();
+                while(iter.hasNext()) {
+                    Map.Entry pair = (Map.Entry)iter.next();
+                    String[] curGroups = (String[])pair.getValue();
+                    for(int i=0;i<curGroups.length;i++) {
+                        groupSet.add(curGroups[i]);
+                    }//end loop
                 }//end loop
-            }//end loop
+            }
             return ((String[])(groupSet).toArray(new String[groupSet.size()]));
         }//end getCurExpectedDiscoveredGroups
 
@@ -1003,7 +1005,7 @@ abstract public class BaseQATest extends
     protected final List allLookupsToStart  = Collections.synchronizedList(new ArrayList(11));
     protected final List lookupsStarted     = Collections.synchronizedList(new ArrayList(11));
 
-    protected final List lookupList = new ArrayList(1); //Synchronized externally.
+    private final List lookupList = new ArrayList(1); //Synchronized externally.
     protected final Map genMap = Collections.synchronizedMap(new HashMap(11));
     protected volatile int nStarted = 0;
     /* Data structures - lookup discovery services */
@@ -1079,13 +1081,15 @@ abstract public class BaseQATest extends
                  * lookup services (simulated or non-simulated).
                  */
                 if( !announcementsStopped ) {
-                    Iterator iter = genMap.keySet().iterator();
-                    for(int i=0;iter.hasNext();i++) {
-                        Object generator = iter.next();
-                        if(generator instanceof DiscoveryProtocolSimulator) {
-                      ((DiscoveryProtocolSimulator)generator).stopAnnouncements();
-                        }//endif
-                    }//end loop
+                    synchronized (genMap){
+                        Iterator iter = genMap.keySet().iterator();
+                        for(int i=0;iter.hasNext();i++) {
+                            Object generator = iter.next();
+                            if(generator instanceof DiscoveryProtocolSimulator) {
+                          ((DiscoveryProtocolSimulator)generator).stopAnnouncements();
+                            }//endif
+                        }//end 
+                    }
                     announcementsStopped = true;
                 }//endif(!announcementsStopped)
             }//endif
@@ -1138,10 +1142,12 @@ abstract public class BaseQATest extends
         if(l0 == l1) return true;//if both are null it returns true
         if( (l0 == null) || (l1 == null) ) return false;
         if(l0.size() != l1.size()) return false;
-	Iterator iter = l0.iterator();
-        while(iter.hasNext()) {
+        synchronized (l0){
+            Iterator iter = l0.iterator();
+            while(iter.hasNext()) {
             if( !(l1.contains(iter.next())) ) return false;
-        }//endif
+            }//endif
+        }
         return true;
     }//end listsEqual
 
@@ -2223,18 +2229,22 @@ abstract public class BaseQATest extends
             logger.log(Level.FINE, " locators set 0 -- ");
         }//endif
         LookupLocator[] locs0 = new LookupLocator[locKeys0.size()];
-        Iterator iter = locKeys0.iterator();
-        for(int i=0;iter.hasNext();i++) {
-            locs0[i] = (LookupLocator)iter.next();
-            if(displayOn)  logger.log(Level.FINE, "    "+locs0[i]);
-        }//end loop
+        synchronized (map0){
+            Iterator iter = locKeys0.iterator();
+            for(int i=0;iter.hasNext();i++) {
+                locs0[i] = (LookupLocator)iter.next();
+                if(displayOn)  logger.log(Level.FINE, "    "+locs0[i]);
+            }//end loop
+        }
         if(displayOn) logger.log(Level.FINE, " locators set 1 -- ");
         LookupLocator[] locs1 = new LookupLocator[locKeys1.size()];
-        iter = locKeys1.iterator();
-        for(int i=0;iter.hasNext();i++) {
-            locs1[i] = (LookupLocator)iter.next();
-            if(displayOn)  logger.log(Level.FINE, "    "+locs1[i]);
-        }//end loop
+        synchronized (map1){
+            Iterator iter = locKeys1.iterator();
+            for(int i=0;iter.hasNext();i++) {
+                locs1[i] = (LookupLocator)iter.next();
+                if(displayOn)  logger.log(Level.FINE, "    "+locs1[i]);
+            }//end loop
+        }
         return LocatorsUtil.compareLocatorSets(locs0,locs1, Level.OFF);
     }//end locGroupsMapsEqualByLoc
 
@@ -2266,54 +2276,58 @@ abstract public class BaseQATest extends
             logger.log(Level.FINE,
                               " comparing group sets of each lookup ... ");
         }//endif
-        Iterator iter = locKeys0.iterator();
-        for(int i=0;iter.hasNext();i++) {
-            LookupLocator loc = (LookupLocator)iter.next();
-            String[] groups0   = (String[])map0.get(loc);
-            String[] groups1   = (String[])map1.get(loc);
-            if(displayOn) {
-                logger.log(Level.FINE,
-                                  "    set 0 -- locator = "+loc);
-                if(groups0.length == 0) {
+        synchronized (map0){
+            Iterator iter = locKeys0.iterator();
+            for(int i=0;iter.hasNext();i++) {
+                LookupLocator loc = (LookupLocator)iter.next();
+                String[] groups0   = (String[])map0.get(loc);
+                String[] groups1   = (String[])map1.get(loc);
+                if(displayOn) {
                     logger.log(Level.FINE,
-                                      "      groups = NO_GROUPS");
-                } else {
-                    for(int j=0;j<groups0.length;j++) {
+                                      "    set 0 -- locator = "+loc);
+                    if(groups0.length == 0) {
                         logger.log(Level.FINE,
-                                        "      group["+j+"] = "+groups0[j]);
-                    }//end loop
-                }//endif
-                logger.log(Level.FINE,
-                                  "    set 1 -- locator = "+loc);
-                if(groups1.length == 0) {
+                                          "      groups = NO_GROUPS");
+                    } else {
+                        for(int j=0;j<groups0.length;j++) {
+                            logger.log(Level.FINE,
+                                            "      group["+j+"] = "+groups0[j]);
+                        }//end loop
+                    }//endif
                     logger.log(Level.FINE,
-                                      "      groups = NO_GROUPS");
-                } else {
-                    for(int j=0;j<groups1.length;j++) {
+                                      "    set 1 -- locator = "+loc);
+                    if(groups1.length == 0) {
                         logger.log(Level.FINE,
-                                         "      group["+j+"] = "+groups1[j]);
-                    }//end loop
-                }//endif
-            }//endif(displayOn)
-            if(!GroupsUtil.compareGroupSets(groups0,groups1, Level.OFF)) return false;
-        }//end loop
+                                          "      groups = NO_GROUPS");
+                    } else {
+                        for(int j=0;j<groups1.length;j++) {
+                            logger.log(Level.FINE,
+                                             "      group["+j+"] = "+groups1[j]);
+                        }//end loop
+                    }//endif
+                }//endif(displayOn)
+                if(!GroupsUtil.compareGroupSets(groups0,groups1, Level.OFF)) return false;
+            }//end loop
+        }
         return true;
     }//end locGroupsMapsEqualByGroups
 
     /** Returns the proxy to each lookup service started (already prepared)*/
     protected ServiceRegistrar[] getLookupProxies() {
         ServiceRegistrar[] proxies = new ServiceRegistrar[genMap.size()];
-	Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            Object curObj = iter.next();
-            if(curObj instanceof DiscoveryProtocolSimulator) {
-                proxies[i]
-                      = ((DiscoveryProtocolSimulator)curObj).getLookupProxy();
-            } else {
-                proxies[i] = (ServiceRegistrar)curObj;
-            }//endif
-        }//end loop
-        return proxies;
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                Object curObj = iter.next();
+                if(curObj instanceof DiscoveryProtocolSimulator) {
+                    proxies[i]
+                          = ((DiscoveryProtocolSimulator)curObj).getLookupProxy();
+                } else {
+                    proxies[i] = (ServiceRegistrar)curObj;
+                }//endif
+            }//end loop
+            return proxies;
+        }
     }//end getLookupProxies
 
     /** For each lookup service corresponding to an element of the global
@@ -2325,21 +2339,23 @@ abstract public class BaseQATest extends
      *  @throws com.sun.jini.qa.harness.TestException
      */
     protected void terminateAllLookups() throws TestException {
-        Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            Object curObj = iter.next();
-            ServiceRegistrar regProxy = null;
-            if(curObj instanceof DiscoveryProtocolSimulator) {
-                DiscoveryProtocolSimulator curGen
-                                         = (DiscoveryProtocolSimulator)curObj;
-                regProxy = curGen.getLookupProxy();
-                curGen.stopAnnouncements();
-            } else {
-                regProxy = (ServiceRegistrar)curObj;
-            }//endif
-            /* destroy lookup service i */
-            manager.destroyService(regProxy);
-        }//end loop
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                Object curObj = iter.next();
+                ServiceRegistrar regProxy = null;
+                if(curObj instanceof DiscoveryProtocolSimulator) {
+                    DiscoveryProtocolSimulator curGen
+                                             = (DiscoveryProtocolSimulator)curObj;
+                    regProxy = curGen.getLookupProxy();
+                    curGen.stopAnnouncements();
+                } else {
+                    regProxy = (ServiceRegistrar)curObj;
+                }//endif
+                /* destroy lookup service i */
+                manager.destroyService(regProxy);
+            }//end loop
+        }
         announcementsStopped = true;
     }//end terminateAllLookups
 
@@ -2352,22 +2368,24 @@ abstract public class BaseQATest extends
      *  reachable.)
      */
     protected void stopAnnouncements() {
-        Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            logger.log(Level.FINE, " stop multicast announcements "
-                              +"from lookup service "+i+" ...");
-            Object curObj = iter.next();
-            if(curObj instanceof DiscoveryProtocolSimulator) {
-                DiscoveryProtocolSimulator curGen
-                                         = (DiscoveryProtocolSimulator)curObj;
-                curGen.stopAnnouncements();
-            } else {//cannot stop the announcements, must destroy the lookup
-                /* It's not a simulated LUS, thus the only way to stop the
-                 * announcements is to destroy each LUS individually.
-                 */
-                manager.destroyService((ServiceRegistrar)curObj);
-            }//endif
-        }//end loop
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                logger.log(Level.FINE, " stop multicast announcements "
+                                  +"from lookup service "+i+" ...");
+                Object curObj = iter.next();
+                if(curObj instanceof DiscoveryProtocolSimulator) {
+                    DiscoveryProtocolSimulator curGen
+                                             = (DiscoveryProtocolSimulator)curObj;
+                    curGen.stopAnnouncements();
+                } else {//cannot stop the announcements, must destroy the lookup
+                    /* It's not a simulated LUS, thus the only way to stop the
+                     * announcements is to destroy each LUS individually.
+                     */
+                    manager.destroyService((ServiceRegistrar)curObj);
+                }//endif
+            }//end loop
+        }
         announcementsStopped = true;
     }//end stopAnnouncements
 
@@ -2451,28 +2469,30 @@ abstract public class BaseQATest extends
         logger.log(Level.FINE, 
                           " number of intervals to wait through    -- "
                           +nIntervalsToWait);
-        Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            DiscoveryProtocolSimulator curGen = 
-                                  (DiscoveryProtocolSimulator)iter.next();
-            logger.log(Level.FINE, 
-                              " gen "+i
-                              +" - waiting ... announcements so far -- "
-                              +curGen.getNAnnouncementsSent());
-            for(int j=0; ((j<nIntervalsToWait)
-                &&(curGen.getNAnnouncementsSent()< minNAnnouncements));j++)
-            {
-                DiscoveryServiceUtil.delayMS(announceInterval);
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                DiscoveryProtocolSimulator curGen = 
+                                      (DiscoveryProtocolSimulator)iter.next();
                 logger.log(Level.FINE, 
                                   " gen "+i
                                   +" - waiting ... announcements so far -- "
                                   +curGen.getNAnnouncementsSent());
+                for(int j=0; ((j<nIntervalsToWait)
+                    &&(curGen.getNAnnouncementsSent()< minNAnnouncements));j++)
+                {
+                    DiscoveryServiceUtil.delayMS(announceInterval);
+                    logger.log(Level.FINE, 
+                                      " gen "+i
+                                      +" - waiting ... announcements so far -- "
+                                      +curGen.getNAnnouncementsSent());
+                }//end loop
+                logger.log(Level.FINE, 
+                                  " gen "+i
+                                  +" - wait complete ... announcements  -- "
+                                  +curGen.getNAnnouncementsSent());
             }//end loop
-            logger.log(Level.FINE, 
-                              " gen "+i
-                              +" - wait complete ... announcements  -- "
-                              +curGen.getNAnnouncementsSent());
-        }//end loop
+        }
     }//end verifyAnnouncementsSent
 
     /** This method replaces, with the given set of groups, the current
@@ -2587,20 +2607,22 @@ abstract public class BaseQATest extends
      */
    protected List replaceMemberGroups(boolean alternate) {
         List locGroupsList = new ArrayList(genMap.size());
-        Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            /* Replace the member groups of the current lookup service */
-            logger.log(Level.FINE, " lookup service "+i+" - "
-                              +"replacing member groups with -- ");
-            try {
-                locGroupsList.add(replaceMemberGroups(iter.next(),alternate));
-            } catch(RemoteException e) {
-                logger.log(Level.FINE, 
-                                  " failed to change member groups "
-                                  +"for lookup service "+i);
-                e.printStackTrace();
-            }
-        }//end loop
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                /* Replace the member groups of the current lookup service */
+                logger.log(Level.FINE, " lookup service "+i+" - "
+                                  +"replacing member groups with -- ");
+                try {
+                    locGroupsList.add(replaceMemberGroups(iter.next(),alternate));
+                } catch(RemoteException e) {
+                    logger.log(Level.FINE, 
+                                      " failed to change member groups "
+                                      +"for lookup service "+i);
+                    e.printStackTrace();
+                }
+            }//end loop
+        }
         return locGroupsList;
     }//end replaceMemberGroups
 
@@ -2654,62 +2676,64 @@ abstract public class BaseQATest extends
                                            String[] newGroups)
    {
         List locGroupsList = new ArrayList(genMap.size());
-        Iterator iter = genMap.keySet().iterator();
-        for(int i=0;iter.hasNext();i++) {
-            Object generator = iter.next();
-            if(i<nReplacements) {
-                /* Replace the member groups of the current lookup service */
-                logger.log(Level.FINE, " lookup service "+i+" - "
-                                  +"replacing member groups with --");
-                if(newGroups.length == 0) {
-                    logger.log(Level.FINE, "   NO_GROUPS");
-                } else {
-                    for(int j=0;j<newGroups.length;j++) {
-                        logger.log(Level.FINE, "   newGroups["+j+"] = "
-                                                   +newGroups[j]);
-                    }//end loop
-                }//endif
-                try {
-                    locGroupsList.add
-                                  ( replaceMemberGroups(generator,newGroups) );
-                } catch(RemoteException e) {
-                    logger.log(Level.FINE, 
-                                      " failed to change member groups "
-                                      +"for lookup service "+i);
-                    e.printStackTrace();
-                }
-            } else {//(i >= nReplacements)
-                /* Leave member groups of the current lookup service as is*/
-                logger.log(Level.FINE, " lookup service "+i+" - "
-                                  +"leaving member groups unchanged --");
-                ServiceRegistrar regProxy = null;
-                if(generator instanceof DiscoveryProtocolSimulator) {
-                    regProxy
-                    = ((DiscoveryProtocolSimulator)generator).getLookupProxy();
-                } else {
-                    regProxy = (ServiceRegistrar)generator;
-                }//endif
-                try {
-                    LookupLocator loc = QAConfig.getConstrainedLocator(regProxy.getLocator());
-                    String[] groups   = regProxy.getGroups();
-                    if(groups.length == 0) {
+        synchronized (genMap){
+            Iterator iter = genMap.keySet().iterator();
+            for(int i=0;iter.hasNext();i++) {
+                Object generator = iter.next();
+                if(i<nReplacements) {
+                    /* Replace the member groups of the current lookup service */
+                    logger.log(Level.FINE, " lookup service "+i+" - "
+                                      +"replacing member groups with --");
+                    if(newGroups.length == 0) {
                         logger.log(Level.FINE, "   NO_GROUPS");
                     } else {
-                        for(int j=0;j<groups.length;j++) {
-                            logger.log(Level.FINE, "   groups["+j+"] = "
-                                                       +groups[j]);
+                        for(int j=0;j<newGroups.length;j++) {
+                            logger.log(Level.FINE, "   newGroups["+j+"] = "
+                                                       +newGroups[j]);
                         }//end loop
                     }//endif
-                    locGroupsList.add
-                                  ( new LocatorGroupsPair(loc,groups) );
-                } catch(RemoteException e) {
-                    logger.log(Level.FINE, 
-                                      " failed on locator/groups retrieval "
-                                      +"for lookup service "+i);
-                    e.printStackTrace();
-                }
-            }//endif
-        }//end loop
+                    try {
+                        locGroupsList.add
+                                      ( replaceMemberGroups(generator,newGroups) );
+                    } catch(RemoteException e) {
+                        logger.log(Level.FINE, 
+                                          " failed to change member groups "
+                                          +"for lookup service "+i);
+                        e.printStackTrace();
+                    }
+                } else {//(i >= nReplacements)
+                    /* Leave member groups of the current lookup service as is*/
+                    logger.log(Level.FINE, " lookup service "+i+" - "
+                                      +"leaving member groups unchanged --");
+                    ServiceRegistrar regProxy = null;
+                    if(generator instanceof DiscoveryProtocolSimulator) {
+                        regProxy
+                        = ((DiscoveryProtocolSimulator)generator).getLookupProxy();
+                    } else {
+                        regProxy = (ServiceRegistrar)generator;
+                    }//endif
+                    try {
+                        LookupLocator loc = QAConfig.getConstrainedLocator(regProxy.getLocator());
+                        String[] groups   = regProxy.getGroups();
+                        if(groups.length == 0) {
+                            logger.log(Level.FINE, "   NO_GROUPS");
+                        } else {
+                            for(int j=0;j<groups.length;j++) {
+                                logger.log(Level.FINE, "   groups["+j+"] = "
+                                                           +groups[j]);
+                            }//end loop
+                        }//endif
+                        locGroupsList.add
+                                      ( new LocatorGroupsPair(loc,groups) );
+                    } catch(RemoteException e) {
+                        logger.log(Level.FINE, 
+                                          " failed on locator/groups retrieval "
+                                          +"for lookup service "+i);
+                        e.printStackTrace();
+                    }
+                }//endif
+            }//end loop
+        }
         return locGroupsList;
     }//end replaceMemberGroups