[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