Author: bstansberry(a)jboss.com
Date: 2007-10-11 13:19:15 -0400 (Thu, 11 Oct 2007)
New Revision: 4601
Modified:
core/branches/1.4.X/src/org/jboss/cache/interceptors/DataGravitatorInterceptor.java
core/branches/1.4.X/tests/functional/org/jboss/cache/buddyreplication/BuddyReplicationFailoverTest.java
Log:
[JBCACHE-1194] Delayed response from backup node should not prevent successful data
gravitation
Modified:
core/branches/1.4.X/src/org/jboss/cache/interceptors/DataGravitatorInterceptor.java
===================================================================
---
core/branches/1.4.X/src/org/jboss/cache/interceptors/DataGravitatorInterceptor.java 2007-10-11
13:40:52 UTC (rev 4600)
+++
core/branches/1.4.X/src/org/jboss/cache/interceptors/DataGravitatorInterceptor.java 2007-10-11
17:19:15 UTC (rev 4601)
@@ -339,7 +339,8 @@
Boolean searchSubtrees = (buddyManager.isDataGravitationSearchBackupTrees() ?
Boolean.TRUE : Boolean.FALSE);
Boolean marshal = cache.getUseRegionBasedMarshalling() ? Boolean.TRUE :
Boolean.FALSE;
MethodCall dGrav =
MethodCallFactory.create(MethodDeclarations.dataGravitationMethod, new Object[]{fqn,
searchSubtrees, marshal});
- List resps = cache.callRemoteMethods(mbrs, dGrav, GroupRequest.GET_FIRST, true,
buddyManager.getBuddyCommunicationTimeout());
+ // JBCACHE-1194 This must be GET_ALL, not GET_FIRST
+ List resps = cache.callRemoteMethods(mbrs, dGrav, GroupRequest.GET_ALL, true,
buddyManager.getBuddyCommunicationTimeout());
if (resps == null)
{
log.error("No replies to call " + dGrav + ". Perhaps we're
alone in the cluster?");
Modified:
core/branches/1.4.X/tests/functional/org/jboss/cache/buddyreplication/BuddyReplicationFailoverTest.java
===================================================================
---
core/branches/1.4.X/tests/functional/org/jboss/cache/buddyreplication/BuddyReplicationFailoverTest.java 2007-10-11
13:40:52 UTC (rev 4600)
+++
core/branches/1.4.X/tests/functional/org/jboss/cache/buddyreplication/BuddyReplicationFailoverTest.java 2007-10-11
17:19:15 UTC (rev 4601)
@@ -6,6 +6,10 @@
*/
package org.jboss.cache.buddyreplication;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.cache.AbstractTreeCacheListener;
import org.jboss.cache.TreeCache;
import org.jboss.cache.Fqn;
import org.jboss.cache.config.Option;
@@ -208,4 +212,79 @@
assertNoLocks(caches);
}
+
+ /**
+ * Checks that adding a data gravitation delay to the nodes that
+ * actually have the data doesn't prevent successful gravitation.
+ * Test for JBCACHE-1194.
+ *
+ * FIXME This test is currently meaningless because JBCACHE-1192 means
+ * the delaying mechanism doesn't actually work. Test checks for this
+ * and fails at the end with a "known issue" message. Once JBCACHE-1192
+ * is fixed, this test should start working.
+ *
+ * @throws Exception
+ */
+ public void testDelayedResponse() throws Exception
+ {
+ caches = createCaches(4, false, false, optimisticLocks);
+
+ Fqn fqn = Fqn.fromString("/test");
+ Fqn buddyFqn = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE +
"/" + BuddyManager.getGroupNameFromAddress(caches[0].getLocalAddress()));
+ Fqn backupFqn = new Fqn(buddyFqn, fqn);
+
+ dumpCacheContents(caches);
+
+ caches[0].put(fqn, key, value);
+
+ dumpCacheContents(caches);
+
+ assertEquals("Value should exist on node0", value, caches[0].get(fqn,
key));
+ assertNull("Value should not exist on node1", caches[1].get(fqn, key));
+ assertEquals("Backup should exist on node1", value,
caches[1].get(backupFqn, key));
+ assertNull("Value should not exist on node2", caches[2].get(fqn, key));
+ assertNull("Backup should not exist on node2", caches[2].get(backupFqn,
key));
+ assertNull("Value should not exist on node3", caches[3].get(fqn, key));
+ assertNull("Backup should not exist on node3", caches[3].get(backupFqn,
key));
+
+ // Add a listener that will delay data gravitation from node0
+ BlockingListener listener0 = new BlockingListener();
+ caches[1].addTreeCacheListener(listener0);
+
+ // Add a listener that will delay data gravitation from node1
+ BlockingListener listener1 = new BlockingListener();
+ caches[1].addTreeCacheListener(listener1);
+
+ Option opt = new Option();
+ opt.setForceDataGravitation(true);
+ assertEquals("Gravitation to node4 successful", value,
caches[3].get(fqn, key, opt));
+
+ // Just double-check the listeners worked as expected
+ assertNull("Listener0 saw no exception", listener0.exception);
+ assertNull("Listener1 saw no exception", listener1.exception);
+ assertTrue("Known issue JBCACHE-1192: listener0 blocked " + fqn,
listener0.visited.contains(fqn));
+ assertTrue("Known issue JBCACHE-1192: listener1 blocked " + backupFqn,
listener1.visited.contains(backupFqn));
+ }
+
+ private class BlockingListener extends AbstractTreeCacheListener
+ {
+ Exception exception = null;
+ Set visited = new HashSet();
+
+ public void nodeVisited(Fqn fqn)
+ {
+ try
+ {
+ Thread.sleep(2000);
+ visited.add(fqn);
+ }
+ catch (Exception e)
+ {
+ exception = e;
+ }
+ }
+
+ }
+
+
}