[jbosscache-commits] JBoss Cache SVN: r7107 - in core/trunk/src: test/java/org/jboss/cache and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Tue Nov 11 07:48:50 EST 2008


Author: mircea.markus
Date: 2008-11-11 07:48:50 -0500 (Tue, 11 Nov 2008)
New Revision: 7107

Modified:
   core/trunk/src/main/java/org/jboss/cache/buddyreplication/BuddyManager.java
   core/trunk/src/test/java/org/jboss/cache/UnitTestCacheFactory.java
Log:
fixed buddy issue

Modified: core/trunk/src/main/java/org/jboss/cache/buddyreplication/BuddyManager.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/buddyreplication/BuddyManager.java	2008-11-11 11:41:47 UTC (rev 7106)
+++ core/trunk/src/main/java/org/jboss/cache/buddyreplication/BuddyManager.java	2008-11-11 12:48:50 UTC (rev 7107)
@@ -325,7 +325,7 @@
          // allow waiting threads to process.
          initialisationLatch.countDown();
 
-         // register a CacheImpl Listener to reassign buddies as and when view changes occur
+         // register a listener to reassign buddies as and when view changes occur
          viewChangeListener = new ViewChangeListener();
 
          cache.addCacheListener(viewChangeListener);
@@ -383,6 +383,25 @@
       {
          return "MembershipChange: Old members = " + oldMembers + " New members = " + newMembers;
       }
+
+      /**
+       * Returns the list of nodes that were in the old view and are not in the new view, and which are also in the
+       * <b>filter</b> param.
+       */
+      public Set<Address> getDroppedNodes(Collection filter)
+      {
+         if (oldMembers == null || oldMembers.isEmpty())
+            return Collections.EMPTY_SET;
+         Set<Address> result = new HashSet<Address>();
+         for (Address oldMember : oldMembers)
+         {
+            if (!newMembers.contains(oldMember) && filter.contains(oldMember))
+            {
+               result.add(oldMember);
+            }
+         }
+         return result;
+      }
    }
 
    private synchronized void enqueueViewChange(MembershipChange mc)
@@ -552,6 +571,7 @@
       {
          if (me.getValue().equals(groupName))
          {
+            if (log.isTraceEnabled()) log.trace("handleRemoveFromBuddyGroup removing " + me.getKey());
             buddyGroupsIParticipateIn.remove(me.getKey());
             break;
          }
@@ -1162,8 +1182,9 @@
 
       private void handleEnqueuedViewChange() throws Exception
       {
-         log.trace("Waiting for enqueued view change events");
+         if (trace) log.trace("Waiting for enqueued view change events");
          MembershipChange members = queue.take();
+         if (trace) log.trace("Processing membership change: " + members);
          if (members == STOP_NOTIFIER)
          {
             log.trace("Caught stop notifier, time to go home.");
@@ -1206,28 +1227,21 @@
          // look for missing data owners.
          // if the view change involves the removal of a data owner of a group in which we participate in, we should
          // rename the backup the region accordingly, and remove the group from the list in which the current instance participates.
-         if (!members.newMembers.containsAll(buddyGroupsIParticipateIn.keySet()))
+         Set<Address> toRemove = members.getDroppedNodes(buddyGroupsIParticipateIn.keySet());
+         if (log.isTraceEnabled()) log.trace("removed members are: " + toRemove);
+
+         for (Address a : toRemove)
          {
-            Set<Address> toRemove = new HashSet<Address>();
-
-            for (Address a : buddyGroupsIParticipateIn.keySet())
+            if (log.isTraceEnabled()) log.trace("handleEnqueuedViewChange is removing: " + a);
+            BuddyGroup bg = buddyGroupsIParticipateIn.remove(a);
+            Fqn backupRootFqn = buddyFqnTransformer.getBackupRoot(bg.getDataOwner());
+            NodeSPI backupRoot = cache.getNode(backupRootFqn);
+            if (backupRoot != null)
             {
-               if (!members.newMembers.contains(a)) toRemove.add(a);
+               // could be a race condition where the backup region has been removed because we have been removed
+               // from the buddy group, but the buddyGroupsIParticipateIn map hasn't been updated.
+               migrateDefunctData(backupRoot, bg.getDataOwner());
             }
-
-            for (Address a : toRemove)
-            {
-               BuddyGroup bg = buddyGroupsIParticipateIn.remove(a);
-               Fqn backupRootFqn = buddyFqnTransformer.getBackupRoot(bg.getDataOwner());
-               NodeSPI backupRoot = cache.getNode(backupRootFqn);
-               if (backupRoot != null)
-               {
-                  // could be a race condition where the backup region has been removed because we have been removed
-                  // from the buddy group, but the buddyGroupsIParticipateIn map hasn't been updated.
-                  migrateDefunctData(backupRoot, bg.getDataOwner());
-               }
-
-            }
          }
       }
 
@@ -1287,18 +1301,11 @@
          Vector<Address> newMembers = newView.getMembers();
 
          // the whole 'oldMembers' concept is only used for buddy pool announcements.
-         if (config.getBuddyPoolName() == null)
-         {
-            enqueueViewChange(new MembershipChange(null, new Vector<Address>(newMembers)));
-         }
-         else
-         {
-            MembershipChange mc = new MembershipChange(oldMembers == null ? null : new Vector<Address>(oldMembers), new Vector<Address>(newMembers));
-            enqueueViewChange(mc);
-            if (oldMembers == null) oldMembers = new Vector<Address>();
-            oldMembers.clear();
-            oldMembers.addAll(newMembers);
-         }
+         MembershipChange mc = new MembershipChange(oldMembers == null ? null : new Vector<Address>(oldMembers), new Vector<Address>(newMembers));
+         enqueueViewChange(mc);
+         if (oldMembers == null) oldMembers = new Vector<Address>();
+         oldMembers.clear();
+         oldMembers.addAll(newMembers);
       }
    }
 

Modified: core/trunk/src/test/java/org/jboss/cache/UnitTestCacheFactory.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/UnitTestCacheFactory.java	2008-11-11 11:41:47 UTC (rev 7106)
+++ core/trunk/src/test/java/org/jboss/cache/UnitTestCacheFactory.java	2008-11-11 12:48:50 UTC (rev 7107)
@@ -220,25 +220,6 @@
     */
    public void mangleConfiguration(Configuration configuration)
    {
-      StackTraceElement[] traceElements = Thread.getAllStackTraces().get(Thread.currentThread());
-      Class clazz = null;
-      for (StackTraceElement traceElement : traceElements)
-      {
-         String className = traceElement.getClassName();
-         if (className.startsWith("java.lang.Thread")) continue;
-         if (className.startsWith("org.jboss"))
-         {
-            try
-            {
-               clazz = Class.forName(traceElement.getClassName());
-            } catch (ClassNotFoundException e)
-            {
-               throw new Error(traceElement.getClassName() + " should be in class path");
-            }
-         }
-      }
-      System.out.println("Test class is = " + clazz);
-
       configuration.setClusterConfig(mangleClusterConfiguration(configuration.getClusterConfig()));
       // Check if the cluster name contains thread id. If not, append. 
       // We can not just append the threadId, since some of the tests are crating instances




More information about the jbosscache-commits mailing list