Author: manik.surtani(a)jboss.com
Date: 2007-10-19 13:55:03 -0400 (Fri, 19 Oct 2007)
New Revision: 4651
Modified:
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferGenerator.java
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java
core/trunk/src/main/java/org/jboss/cache/statetransfer/StateTransferManager.java
core/trunk/src/test/java/org/jboss/cache/statetransfer/DataVersionTransferTest.java
Log:
Updated test for JBCACHE-1202 and a fix for the same
Modified:
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferGenerator.java
===================================================================
---
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferGenerator.java 2007-10-19
17:37:24 UTC (rev 4650)
+++
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferGenerator.java 2007-10-19
17:55:03 UTC (rev 4651)
@@ -19,6 +19,7 @@
import java.io.IOException;
import java.io.ObjectOutputStream;
+import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -152,6 +153,14 @@
// first handle the current node
attrs = node.getDataDirect();
+
+ // add a dummy attribute to hold the data version if any
+ if (cache.getConfiguration().isNodeLockingOptimistic())
+ {
+ attrs = new HashMap(attrs);
+ attrs.put(StateTransferManager.DATA_VERSION_KEY, node.getVersion());
+ }
+
if (attrs.size() == 0)
{
nd = new NodeData(node.getFqn());
Modified:
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java
===================================================================
---
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java 2007-10-19
17:37:24 UTC (rev 4650)
+++
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java 2007-10-19
17:55:03 UTC (rev 4651)
@@ -23,6 +23,7 @@
import org.jboss.cache.marshall.NodeData;
import org.jboss.cache.marshall.NodeDataExceptionMarker;
import org.jboss.cache.marshall.NodeDataMarker;
+import org.jboss.cache.optimistic.DataVersion;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -247,7 +248,10 @@
//are there any transient nodes at all?
if (nd != null && !nd.isMarker())
{
- target.putAllDirect(nd.getAttributes());
+ Map attributes = nd.getAttributes();
+ DataVersion version = (DataVersion)
attributes.remove(StateTransferManager.DATA_VERSION_KEY);
+ target.putAllDirect(attributes);
+ if (version != null) target.setVersion(version);
// Check whether this is an integration into the buddy backup
// subtree
@@ -323,8 +327,10 @@
Map attrs = nd.getAttributes();
// We handle this NodeData. Create a TreeNode and
- // integrate its data
+ // integrate its data
+ DataVersion version = (DataVersion)
attrs.remove(StateTransferManager.DATA_VERSION_KEY);
NodeSPI target = factory.createDataNode(name, fqn, parent, attrs, false);
+ if (version != null) target.setVersion(version);
parent.addChild(name, target);
// JBCACHE-913
Modified:
core/trunk/src/main/java/org/jboss/cache/statetransfer/StateTransferManager.java
===================================================================
---
core/trunk/src/main/java/org/jboss/cache/statetransfer/StateTransferManager.java 2007-10-19
17:37:24 UTC (rev 4650)
+++
core/trunk/src/main/java/org/jboss/cache/statetransfer/StateTransferManager.java 2007-10-19
17:55:03 UTC (rev 4651)
@@ -30,6 +30,8 @@
public static final String PARTIAL_STATE_DELIMITER =
"_PARTIAL_STATE_DELIMITER";
+ public static final String DATA_VERSION_KEY =
"_jboss_internal_data_version";
+
private final CacheImpl cache;
public StateTransferManager(CacheImpl cache)
Modified:
core/trunk/src/test/java/org/jboss/cache/statetransfer/DataVersionTransferTest.java
===================================================================
---
core/trunk/src/test/java/org/jboss/cache/statetransfer/DataVersionTransferTest.java 2007-10-19
17:37:24 UTC (rev 4650)
+++
core/trunk/src/test/java/org/jboss/cache/statetransfer/DataVersionTransferTest.java 2007-10-19
17:55:03 UTC (rev 4651)
@@ -127,6 +127,67 @@
assert ((CharVersion) dv).version == 'C' : "Version should have
transferred";
}
+ public void testStateTransferIntermediateNodeDefaultVersions() throws Exception
+ {
+ Fqn f = Fqn.fromString("/one/two/three");
+ Fqn intermediate = f.getParent();
+
+ caches.get(0).put(f, "k", "v");
+ caches.get(0).put(intermediate, "k", "v");
+
+ NodeSPI n = (NodeSPI) caches.get(0).getRoot().getChild(intermediate);
+ DataVersion dv = n.getVersion();
+
+ assert dv instanceof DefaultDataVersion : "Should be an instance of
DefaultDataVersion";
+
+ assert ((DefaultDataVersion) dv).getRawVersion() == 1 : "Should have accurate
data version";
+
+ // now start next cache instance
+ caches.get(1).start();
+
+ TestingUtil.blockUntilViewsReceived(10000, caches.get(0), caches.get(1));
+
+ assert caches.get(1).get(intermediate, "k").equals("v") :
"Value should have transferred";
+
+ n = (NodeSPI) caches.get(0).getRoot().getChild(intermediate);
+ dv = n.getVersion();
+
+ assert dv instanceof DefaultDataVersion : "Should be an instance of
DefaultDataVersion";
+
+ assert ((DefaultDataVersion) dv).getRawVersion() == 1 : "Should have accurate
data version";
+ }
+
+ public void testStateTransferIntermediateNodeCustomVersion() throws Exception
+ {
+ Fqn f = Fqn.fromString("/one/two/three");
+ Fqn intermediate = f.getParent();
+
+ caches.get(0).put(f, "k", "v");
+ caches.get(0).getInvocationContext().getOptionOverrides().setDataVersion(new
CharVersion('X'));
+ caches.get(0).put(intermediate, "k", "v");
+
+ NodeSPI n = (NodeSPI) caches.get(0).getRoot().getChild(intermediate);
+ DataVersion dv = n.getVersion();
+
+ assert dv instanceof CharVersion : "Should be an instance of
CharVersion";
+
+ assert ((CharVersion) dv).version == 'X' : "Should have accurate data
version";
+
+ // now start next cache instance
+ caches.get(1).start();
+
+ TestingUtil.blockUntilViewsReceived(10000, caches.get(0), caches.get(1));
+
+ assert caches.get(1).get(intermediate, "k").equals("v") :
"Value should have transferred";
+
+ n = (NodeSPI) caches.get(0).getRoot().getChild(intermediate);
+ dv = n.getVersion();
+
+ assert dv instanceof CharVersion : "Should be an instance of
CharVersion";
+
+ assert ((CharVersion) dv).version == 'X' : "Should have accurate data
version";
+ }
+
public void testStateTransferDefaultVersionAfterRemoval() throws Exception
{
Fqn f = Fqn.fromString("/one/two/three");
@@ -208,7 +269,7 @@
}
else
{
- throw new DataVersioningException("Incompatible version types");
+ return true;
}
}
}
Show replies by date