Fix shard deadlock in 3 nodes
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / messages / BatchedModificationsTest.java
index b302f527d6eb7019b68df59bac8bed656edb6127..b01c07213e6858d4e0bdf289dd5c86a44f0d51f0 100644 (file)
@@ -8,9 +8,15 @@
 package org.opendaylight.controller.cluster.datastore.messages;
 
 import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.ImmutableSortedSet;
 import java.io.Serializable;
+import java.util.Optional;
+import java.util.SortedSet;
 import org.apache.commons.lang.SerializationUtils;
 import org.junit.Test;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.controller.cluster.datastore.AbstractTest;
 import org.opendaylight.controller.cluster.datastore.DataStoreVersions;
 import org.opendaylight.controller.cluster.datastore.modification.DeleteModification;
 import org.opendaylight.controller.cluster.datastore.modification.MergeModification;
@@ -26,14 +32,14 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo
  *
  * @author Thomas Pantelis
  */
-public class BatchedModificationsTest {
+public class BatchedModificationsTest extends AbstractTest {
 
     @Test
     public void testSerialization() {
         YangInstanceIdentifier writePath = TestModel.TEST_PATH;
         NormalizedNode<?, ?> writeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier(
-                new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)).
-                withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build();
+                new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
+                .withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build();
 
         YangInstanceIdentifier mergePath = TestModel.OUTER_LIST_PATH;
         NormalizedNode<?, ?> mergeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier(
@@ -41,19 +47,25 @@ public class BatchedModificationsTest {
 
         YangInstanceIdentifier deletePath = TestModel.TEST_PATH;
 
-        BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, "txChain");
+        final TransactionIdentifier tx1 = nextTransactionId();
+        BatchedModifications batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION);
         batched.addModification(new WriteModification(writePath, writeData));
         batched.addModification(new MergeModification(mergePath, mergeData));
         batched.addModification(new DeleteModification(deletePath));
-        batched.setReady(true);
+        assertEquals("isReady", false, batched.isReady());
+        batched.setReady();
+        assertEquals("isReady", true, batched.isReady());
+        batched.setTotalMessagesSent(5);
 
         BatchedModifications clone = (BatchedModifications) SerializationUtils.clone(
                 (Serializable) batched.toSerializable());
 
         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
-        assertEquals("getTransactionID", "tx1", clone.getTransactionID());
-        assertEquals("getTransactionChainID", "txChain", clone.getTransactionChainID());
+        assertEquals("getTransactionID", tx1, clone.getTransactionId());
         assertEquals("isReady", true, clone.isReady());
+        assertEquals("isDoCommitOnReady", false, clone.isDoCommitOnReady());
+        assertEquals("participatingShardNames present", false, clone.getParticipatingShardNames().isPresent());
+        assertEquals("getTotalMessagesSent", 5, clone.getTotalMessagesSent());
 
         assertEquals("getModifications size", 3, clone.getModifications().size());
 
@@ -71,19 +83,49 @@ public class BatchedModificationsTest {
         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, delete.getVersion());
         assertEquals("getPath", deletePath, delete.getPath());
 
-        // Test with different params.
+        // Test with participating shard names.
 
-        batched = new BatchedModifications("tx2", (short)10, null);
+        final TransactionIdentifier tx2 = nextTransactionId();
+        batched = new BatchedModifications(tx2, (short)10000);
+        final SortedSet<String> shardNames = ImmutableSortedSet.of("one", "two");
+        batched.setReady(Optional.of(shardNames));
+        batched.setDoCommitOnReady(true);
+        assertEquals("isReady", true, batched.isReady());
 
         clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
 
-        assertEquals("getVersion", 10, clone.getVersion());
-        assertEquals("getTransactionID", "tx2", clone.getTransactionID());
-        assertEquals("getTransactionChainID", "", clone.getTransactionChainID());
-        assertEquals("isReady", false, clone.isReady());
+        assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
+        assertEquals("getTransactionID", tx2, clone.getTransactionId());
+        assertEquals("isReady", true, clone.isReady());
+        assertEquals("isDoCommitOnReady", true, clone.isDoCommitOnReady());
+        assertEquals("participatingShardNames present", true, clone.getParticipatingShardNames().isPresent());
+        assertEquals("participatingShardNames", shardNames, clone.getParticipatingShardNames().get());
+        assertEquals("getModifications size", 0, clone.getModifications().size());
+
+        // Test not ready.
+
+        batched = new BatchedModifications(tx2, DataStoreVersions.CURRENT_VERSION);
+
+        clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
 
+        assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
+        assertEquals("getTransactionID", tx2, clone.getTransactionId());
+        assertEquals("isReady", false, clone.isReady());
         assertEquals("getModifications size", 0, clone.getModifications().size());
 
+        // Test pre-Flourine
+
+        batched = new BatchedModifications(tx2, DataStoreVersions.BORON_VERSION);
+        batched.addModification(new WriteModification(writePath, writeData));
+        batched.setReady(Optional.of(ImmutableSortedSet.of("one", "two")));
+
+        clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
+
+        assertEquals("getVersion", DataStoreVersions.BORON_VERSION, clone.getVersion());
+        assertEquals("getTransactionID", tx2, clone.getTransactionId());
+        assertEquals("isReady", true, clone.isReady());
+        assertEquals("participatingShardNames present", false, clone.getParticipatingShardNames().isPresent());
+        assertEquals("getModifications size", 1, clone.getModifications().size());
     }
 
     @Test