[jboss-cvs] JBossAS SVN: r108990 - projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Oct 29 11:31:27 EDT 2010


Author: pferraro
Date: 2010-10-29 11:31:27 -0400 (Fri, 29 Oct 2010)
New Revision: 108990

Modified:
   projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManager.java
Log:
@ViewChanged listener must be asynchronous to avoid deadlocking when manipulating jvm route cache.

Modified: projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManager.java
===================================================================
--- projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManager.java	2010-10-29 15:30:32 UTC (rev 108989)
+++ projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManager.java	2010-10-29 15:31:27 UTC (rev 108990)
@@ -32,6 +32,7 @@
 import org.infinispan.config.CacheLoaderManagerConfig;
 import org.infinispan.context.Flag;
 import org.infinispan.distribution.DistributionManager;
+import org.infinispan.manager.CacheContainer;
 import org.infinispan.manager.EmbeddedCacheManager;
 import org.infinispan.notifications.Listener;
 import org.infinispan.notifications.cachelistener.annotation.CacheEntryActivated;
@@ -135,20 +136,20 @@
       {
          EmbeddedCacheManager container = (EmbeddedCacheManager) this.sessionCache.getCacheManager();
          
-         container.addListener(this);
+         container.addListener(new ViewChangeListener(this.manager));
          
          String jvmRoute = this.manager.getJvmRoute();
          
          if (jvmRoute != null)
          {
-            this.getJvmRouteCache(container).putIfAbsent(container.getAddress(), jvmRoute);
+            getJvmRouteCache(container, this.manager).putIfAbsent(container.getAddress(), jvmRoute);
          }
       }
    }
    
-   private Cache<Address, String> getJvmRouteCache(EmbeddedCacheManager container)
+   static Cache<Address, String> getJvmRouteCache(CacheContainer container, LocalDistributableSessionManager manager)
    {
-      return container.getCache(this.manager.getEngineName());
+      return container.getCache(manager.getEngineName());
    }
    
    /**
@@ -486,7 +487,7 @@
       if ((manager != null) && !manager.isRehashInProgress())
       {
          EmbeddedCacheManager container = (EmbeddedCacheManager) cache.getCacheManager();
-         Cache<Address, String> jvmRouteCache = this.getJvmRouteCache(container);
+         Cache<Address, String> jvmRouteCache = getJvmRouteCache(container, this.manager);
          
          for (Address address: manager.locate(sessionId))
          {
@@ -548,40 +549,54 @@
       this.manager.sessionActivated();
    }
    
-   @ViewChanged
-   public void viewChanged(ViewChangedEvent event)
+   @Listener(sync = false)
+   public static class ViewChangeListener
    {
-      Cache<Address, String> cache = this.getJvmRouteCache(event.getCacheManager());
+      private final LocalDistributableSessionManager manager;
       
-      Collection<Address> oldMembers = event.getOldMembers();
-      Collection<Address> newMembers = event.getNewMembers();
+      ViewChangeListener(LocalDistributableSessionManager manager)
+      {
+         this.manager = manager;
+      }
       
-      // Remove jvm route of crashed member
-      for (Address member: oldMembers)
+      @ViewChanged
+      public void viewChanged(ViewChangedEvent event)
       {
-         if (!newMembers.contains(member))
+         Cache<Address, String> cache = getJvmRouteCache(event.getCacheManager(), this.manager);
+         
+         Collection<Address> oldMembers = event.getOldMembers();
+         Collection<Address> newMembers = event.getNewMembers();
+         
+         // Remove jvm route of crashed member
+         for (Address member: oldMembers)
          {
-            if (cache.remove(member) != null)
+            if (!newMembers.contains(member))
             {
-               log.info("Removed stale jvm route entry from web session cache on behalf of member " + member);
+               if (cache.remove(member) != null)
+               {
+                  log.info("Removed stale jvm route entry from web session cache on behalf of member " + member);
+               }
             }
          }
-      }
-      
-      // Restore our jvm route in cache if we are joining (result of a split/merge)
-      Address localAddress = event.getLocalAddress();
-      if (!oldMembers.contains(localAddress) && newMembers.contains(localAddress))
-      {
+         
+         // Restore our jvm route in cache if we are joining (result of a split/merge)
          String jvmRoute = this.manager.getJvmRoute();
-         String oldJvmRoute = cache.put(localAddress, jvmRoute);
-         if (oldJvmRoute == null)
+         if (jvmRoute != null)
          {
-            log.info("Adding missing jvm route entry to web session cache");
+            Address localAddress = event.getLocalAddress();
+            if (!oldMembers.contains(localAddress) && newMembers.contains(localAddress))
+            {
+               String oldJvmRoute = cache.put(localAddress, jvmRoute);
+               if (oldJvmRoute == null)
+               {
+                  log.info("Adding missing jvm route entry to web session cache");
+               }
+               else if (!oldJvmRoute.equals(jvmRoute))
+               {
+                  log.info("Updating jvm route entry in web session cache.  old = " + oldJvmRoute + ", new = " + jvmRoute);
+               }
+            }
          }
-         else if (!oldJvmRoute.equals(jvmRoute))
-         {
-            log.info("Updating jvm route entry in web session cache.  old = " + oldJvmRoute + ", new = " + jvmRoute);
-         }
       }
    }
    



More information about the jboss-cvs-commits mailing list