[jboss-cvs] JBossAS SVN: r108988 - 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:29:25 EDT 2010


Author: pferraro
Date: 2010-10-29 11:29:24 -0400 (Fri, 29 Oct 2010)
New Revision: 108988

Modified:
   projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DefaultLockManagerSource.java
Log:
Create custom lock manager key, using container + cache name.
Channel name is not available from @CacheStopped listener.

Modified: projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DefaultLockManagerSource.java
===================================================================
--- projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DefaultLockManagerSource.java	2010-10-29 14:44:35 UTC (rev 108987)
+++ projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DefaultLockManagerSource.java	2010-10-29 15:29:24 UTC (rev 108988)
@@ -27,6 +27,7 @@
 import java.util.Set;
 
 import org.infinispan.Cache;
+import org.infinispan.manager.CacheContainer;
 import org.infinispan.manager.EmbeddedCacheManager;
 import org.infinispan.notifications.Listener;
 import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStopped;
@@ -41,7 +42,7 @@
  * @author Vladimir Blagojevic
  * @author Paul Ferraro
  */
- at Listener(sync = false)
+ at Listener
 public class DefaultLockManagerSource implements LockManagerSource
 {
    /** The scope assigned to our group communication service */
@@ -51,7 +52,8 @@
    
    private static final Logger log = Logger.getLogger(DefaultLockManagerSource.class);
    
-   private static final Map<String, LockManagerEntry> lockManagers = new HashMap<String, LockManagerEntry>();
+   // Store LockManagers in static map so they can be shared across DCMs
+   private static final Map<LockManagerKey, LockManagerEntry> lockManagers = new HashMap<LockManagerKey, LockManagerEntry>();
    
    /**
     * {@inheritDoc}
@@ -62,27 +64,29 @@
    {
       if (!cache.getConfiguration().getCacheMode().isClustered()) return null;
       
-      JGroupsTransport transport = (JGroupsTransport) cache.getAdvancedCache().getRpcManager().getTransport();
-      Channel channel = transport.getChannel();
-      String channelName = channel.getName();
+      CacheContainer container = cache.getCacheManager();
       
+      String cacheName = cache.getName();
+      LockManagerKey key = new LockManagerKey(container, cacheName);
+      
       synchronized (lockManagers)
       {
-         LockManagerEntry entry = lockManagers.get(channelName);
+         LockManagerEntry entry = lockManagers.get(key);
          
          if (entry == null)
          {
-            trace("Starting lock manager for cluster %s", channelName);
+            JGroupsTransport transport = (JGroupsTransport) cache.getAdvancedCache().getRpcManager().getTransport();
+
+            entry = new LockManagerEntry(transport.getChannel());
             
-            entry = new LockManagerEntry(channel);
+            trace("Started lock manager for cluster %s", entry);
             
-            EmbeddedCacheManager container = (EmbeddedCacheManager) cache.getCacheManager();
-            container.addListener(this);
+            ((EmbeddedCacheManager) container).addListener(this);
             
-            lockManagers.put(channelName, entry);
+            lockManagers.put(key, entry);
          }
          
-         trace("Registering %s with lock manager for cluster %s", cache.getName(), channelName);
+         trace("Registering %s with lock manager for cluster %s", cacheName, entry);
          
          entry.addCache(cache.getName());
          
@@ -90,14 +94,52 @@
       }
    }
    
+   private static class LockManagerKey
+   {
+      private final CacheContainer container;
+      private final String cacheName;
+      
+      public LockManagerKey(CacheContainer container, String cacheName)
+      {
+         this.container = container;
+         this.cacheName = cacheName;
+      }
+
+      /**
+       * {@inheritDoc}
+       * @see java.lang.Object#hashCode()
+       */
+      @Override
+      public int hashCode()
+      {
+         return this.cacheName.hashCode();
+      }
+
+      /**
+       * {@inheritDoc}
+       * @see java.lang.Object#equals(java.lang.Object)
+       */
+      @Override
+      public boolean equals(Object object)
+      {
+         if ((object == null) || !(object instanceof LockManagerKey)) return false;
+         
+         LockManagerKey key = (LockManagerKey) object;
+         
+         return this.container == key.container && this.cacheName.equals(key.cacheName);
+      }
+   }
+   
    private static class LockManagerEntry
    {
-      private SharedLocalYieldingClusterLockManager lockManager;
-      private CoreGroupCommunicationService service;
-      private Set<String> caches = new HashSet<String>();
+      private final SharedLocalYieldingClusterLockManager lockManager;
+      private final CoreGroupCommunicationService service;
+      private final String channelName;
+      private final Set<String> caches = new HashSet<String>();
       
       LockManagerEntry(Channel channel)
       {
+         this.channelName = channel.getName();
          this.service = new CoreGroupCommunicationService();
          this.service.setChannel(channel);
          this.service.setScopeId(SCOPE_ID);
@@ -162,27 +204,38 @@
          
          return empty;
       }
+
+      /**
+       * {@inheritDoc}
+       * @see java.lang.Object#toString()
+       */
+      @Override
+      public String toString()
+      {
+         return this.channelName;
+      }
    }
    
    @CacheStopped
    public void stopped(CacheStoppedEvent event)
    {
-      String clusterName = event.getCacheManager().getGlobalConfiguration().getClusterName();
-      
+      String cacheName = event.getCacheName();
+      LockManagerKey key = new LockManagerKey(event.getCacheManager(), cacheName);
+
       synchronized (lockManagers)
       {
-         LockManagerEntry entry = lockManagers.get(clusterName);
+         LockManagerEntry entry = lockManagers.get(key);
          
          if (entry != null)
          {
-            trace("Deregistering %s from lock manager for cluster %s", event.getCacheName(), clusterName);
+            trace("Deregistering %s from lock manager for cluster %s", cacheName, entry);
             
             // Returns true if this was the last cache
-            if (entry.removeCache(event.getCacheName()))
+            if (entry.removeCache(cacheName))
             {
-               trace("Stopped lock manager for cluster %s", clusterName);
+               trace("Stopped lock manager for cluster %s", entry);
                
-               lockManagers.remove(clusterName);
+               lockManagers.remove(key);
             }
          }
       }



More information about the jboss-cvs-commits mailing list