[jboss-cvs] JBossAS SVN: r109356 - in projects/cluster/ha-server-cache-ispn/trunk/src: test/java/org/jboss/web/tomcat/service/session/distributedcache/ispn and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Nov 17 23:25:26 EST 2010
Author: pferraro
Date: 2010-11-17 23:25:25 -0500 (Wed, 17 Nov 2010)
New Revision: 109356
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/test/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManagerTest.java
Log:
In locate(...), prefer current node, if session hashes to it. Otherwise use random node from set of target addresses.
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-11-17 17:30:21 UTC (rev 109355)
+++ projects/cluster/ha-server-cache-ispn/trunk/src/main/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManager.java 2010-11-18 04:25:25 UTC (rev 109356)
@@ -25,7 +25,9 @@
import java.util.Collection;
import java.util.EnumMap;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Random;
import org.infinispan.AdvancedCache;
import org.infinispan.Cache;
@@ -82,6 +84,7 @@
}
static final Logger log = Logger.getLogger(DistributedCacheManager.class);
+ private static final Random random = new Random();
private static Map<SharedLocalYieldingClusterLockManager.LockResult, LockResult> lockResultMap = lockResultMap();
private static Map<SharedLocalYieldingClusterLockManager.LockResult, LockResult> lockResultMap()
@@ -481,23 +484,35 @@
@Override
public String locate(String sessionId)
{
- AdvancedCache<?, ?> cache = this.sessionCache.getAdvancedCache();
- DistributionManager manager = cache.getDistributionManager();
-
- if ((manager != null) && !manager.isRehashInProgress())
+ if (this.jvmRouteHandler != null)
{
- Cache<Address, String> jvmRouteCache = this.jvmRouteHandler.getCache();
+ AdvancedCache<?, ?> cache = this.sessionCache.getAdvancedCache();
+ DistributionManager manager = cache.getDistributionManager();
- for (Address address: manager.locate(sessionId))
+ // If rehash is in progress, just use our jvm route - don't hold up the request
+ if ((manager != null) && !manager.isRehashInProgress())
{
- String jvmRoute = jvmRouteCache.get(address);
+ List<Address> addresses = manager.locate(sessionId);
- if (jvmRoute != null)
+ EmbeddedCacheManager container = (EmbeddedCacheManager) this.sessionCache.getCacheManager();
+
+ // Prefer this node, if session happens to hash here
+ if (!addresses.contains(container.getAddress()))
{
- // We need to force synchronous invocations to guarantee
- // session replicates before subsequent request.
- cache.withFlags(Flag.FORCE_SYNCHRONOUS);
- return jvmRoute;
+ // Otherwise choose random node from hash targets
+ Address address = addresses.get(random.nextInt(addresses.size()));
+
+ String jvmRoute = this.jvmRouteHandler.getCache().get(address);
+
+ if (jvmRoute != null)
+ {
+ trace("%s hashes to %s - next request will route to %s (%s)", sessionId, addresses, address, jvmRoute);
+
+ // We need to force synchronous invocations to guarantee
+ // session replicates before subsequent request.
+ cache.withFlags(Flag.FORCE_SYNCHRONOUS);
+ return jvmRoute;
+ }
}
}
}
Modified: projects/cluster/ha-server-cache-ispn/trunk/src/test/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManagerTest.java
===================================================================
--- projects/cluster/ha-server-cache-ispn/trunk/src/test/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManagerTest.java 2010-11-17 17:30:21 UTC (rev 109355)
+++ projects/cluster/ha-server-cache-ispn/trunk/src/test/java/org/jboss/web/tomcat/service/session/distributedcache/ispn/DistributedCacheManagerTest.java 2010-11-18 04:25:25 UTC (rev 109356)
@@ -23,6 +23,7 @@
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.easymock.Capture;
@@ -795,6 +796,7 @@
String sessionId = "ABC123";
String expected = "node1";
+ // Test non-DIST
EasyMock.expect(this.sessionCache.getAdvancedCache()).andReturn(this.sessionCache);
EasyMock.expect(this.sessionCache.getDistributionManager()).andReturn(null);
EasyMock.expect(this.sessionManager.getJvmRoute()).andReturn(expected);
@@ -809,7 +811,7 @@
this.control.reset();
-
+ // Test rehash in progress
DistributionManager distManager = this.control.createMock(DistributionManager.class);
@SuppressWarnings("unchecked")
Cache<Address, String> jvmRouteCache = this.control.createMock(Cache.class);
@@ -829,18 +831,44 @@
this.control.reset();
-
+ // Test session hashes locally
+ EmbeddedCacheManager container = this.control.createMock(EmbeddedCacheManager.class);
Address address1 = this.control.createMock(Address.class);
Address address2 = this.control.createMock(Address.class);
- Address address3 = this.control.createMock(Address.class);
+ Address localAddress = this.control.createMock(Address.class);
+ List<Address> addresses = Arrays.asList(address1, address2, localAddress);
EasyMock.expect(this.sessionCache.getAdvancedCache()).andReturn(this.sessionCache);
EasyMock.expect(this.sessionCache.getDistributionManager()).andReturn(distManager);
EasyMock.expect(distManager.isRehashInProgress()).andReturn(false);
- EasyMock.expect(distManager.locate(EasyMock.same(sessionId))).andReturn(Arrays.asList(address1, address2, address3));
+ EasyMock.expect(distManager.locate(EasyMock.same(sessionId))).andReturn(addresses);
+ EasyMock.expect(this.sessionCache.getCacheManager()).andReturn(container);
+ EasyMock.expect(container.getAddress()).andReturn(address2);
+ EasyMock.expect(this.sessionManager.getJvmRoute()).andReturn(expected);
+
+ this.control.replay();
+
+ result = this.manager.locate(sessionId);
+
+ this.control.verify();
+
+ Assert.assertSame(expected, result);
+
+ this.control.reset();
+
+
+ // Test session does not hash locally
+ addresses = Arrays.asList(address1, address2);
+ Capture<Address> capturedAddress = new Capture<Address>();
+
+ EasyMock.expect(this.sessionCache.getAdvancedCache()).andReturn(this.sessionCache);
+ EasyMock.expect(this.sessionCache.getDistributionManager()).andReturn(distManager);
+ EasyMock.expect(distManager.isRehashInProgress()).andReturn(false);
+ EasyMock.expect(distManager.locate(EasyMock.same(sessionId))).andReturn(addresses);
+ EasyMock.expect(this.sessionCache.getCacheManager()).andReturn(container);
+ EasyMock.expect(container.getAddress()).andReturn(localAddress);
EasyMock.expect(this.jvmRouteCacheSource.<Address, String>getCache(this.sessionManager)).andReturn(jvmRouteCache);
- EasyMock.expect(jvmRouteCache.get(EasyMock.same(address1))).andReturn(null);
- EasyMock.expect(jvmRouteCache.get(EasyMock.same(address2))).andReturn(expected);
+ EasyMock.expect(jvmRouteCache.get(EasyMock.capture(capturedAddress))).andReturn(expected);
EasyMock.expect(this.sessionCache.withFlags(Flag.FORCE_SYNCHRONOUS)).andReturn(this.sessionCache);
this.control.replay();
@@ -850,5 +878,6 @@
this.control.verify();
Assert.assertSame(expected, result);
+ Assert.assertTrue(addresses.contains(capturedAddress.getValue()));
}
}
More information about the jboss-cvs-commits
mailing list