[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