X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardTest.java;h=f097c19e512a3766a3d836c5cc7e061862b29666;hp=144f0f5c9fc825917d139ca01b3ff0e989c39ab1;hb=4680d02510a884b3a893345f423cedcc8c5af0f4;hpb=94603c85193862f85bf9d9aa51d5062d9f84e979 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java index 144f0f5c9f..f097c19e51 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -40,7 +40,6 @@ import com.google.common.util.concurrent.Uninterruptibles; import java.io.IOException; import java.util.Collections; import java.util.HashSet; -import java.util.Map; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -95,6 +94,7 @@ import org.opendaylight.controller.cluster.raft.base.messages.FollowerInitialSyn import org.opendaylight.controller.cluster.raft.client.messages.FindLeader; import org.opendaylight.controller.cluster.raft.client.messages.FindLeaderReply; import org.opendaylight.controller.cluster.raft.messages.RequestVote; +import org.opendaylight.controller.cluster.raft.messages.ServerRemoved; import org.opendaylight.controller.cluster.raft.utils.InMemoryJournal; import org.opendaylight.controller.cluster.raft.utils.InMemorySnapshotStore; import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor; @@ -120,10 +120,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidates; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; +import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.FiniteDuration; @@ -190,8 +190,7 @@ public class ShardTest extends AbstractShardTest { // this will cause all other messages to not be queued properly after that. // The basic issue is that you cannot use TestActorRef with a persistent actor (at least when // it does do a persist) - return new Shard(shardID, Collections.emptyMap(), - dataStoreContextBuilder.persistent(false).build(), SCHEMA_CONTEXT) { + return new Shard(newShardBuilder()) { @Override public void onReceiveCommand(final Object message) throws Exception { if(message instanceof ElectionTimeout && firstElectionTimeout) { @@ -309,8 +308,8 @@ public class ShardTest extends AbstractShardTest { @Override public Shard create() throws Exception { - return new Shard(shardID, Collections.emptyMap(), - dataStoreContextBuilder.persistent(false).build(), SCHEMA_CONTEXT) { + return new Shard(Shard.builder().id(shardID).datastoreContext( + dataStoreContextBuilder.persistent(false).build()).schemaContext(SCHEMA_CONTEXT)) { @Override public void onReceiveCommand(final Object message) throws Exception { if(message instanceof ElectionTimeout && firstElectionTimeout) { @@ -422,8 +421,9 @@ public class ShardTest extends AbstractShardTest { final CountDownLatch recoveryComplete = new CountDownLatch(1); class TestShard extends Shard { TestShard() { - super(shardID, Collections.singletonMap(shardID.toString(), null), - newDatastoreContext(), SCHEMA_CONTEXT); + super(Shard.builder().id(shardID).datastoreContext(newDatastoreContext()). + peerAddresses(Collections.singletonMap(shardID.toString(), null)). + schemaContext(SCHEMA_CONTEXT)); } String getPeerAddress(String id) { @@ -471,7 +471,7 @@ public class ShardTest extends AbstractShardTest { testkit.waitUntilLeader(shard); - final DataTree store = InMemoryDataTreeFactory.getInstance().create(); + final DataTree store = InMemoryDataTreeFactory.getInstance().create(TreeType.OPERATIONAL); store.setSchemaContext(SCHEMA_CONTEXT); final ContainerNode container = ImmutableContainerNodeBuilder.create().withNodeIdentifier( @@ -542,7 +542,7 @@ public class ShardTest extends AbstractShardTest { } DataTree setupInMemorySnapshotStore() throws DataValidationFailedException { - final DataTree testStore = InMemoryDataTreeFactory.getInstance().create(); + final DataTree testStore = InMemoryDataTreeFactory.getInstance().create(TreeType.OPERATIONAL); testStore.setSchemaContext(SCHEMA_CONTEXT); writeToStore(testStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); @@ -1099,8 +1099,7 @@ public class ShardTest extends AbstractShardTest { @Override public Shard create() throws Exception { - return new Shard(shardID, Collections.emptyMap(), - newDatastoreContext(), SCHEMA_CONTEXT) { + return new Shard(newShardBuilder()) { @Override protected boolean isLeader() { return overrideLeaderCalls.get() ? false : super.isLeader(); @@ -2200,8 +2199,7 @@ public class ShardTest extends AbstractShardTest { final Creator creator = new Creator() { @Override public Shard create() throws Exception { - return new Shard(shardID, Collections.emptyMap(), - dataStoreContextBuilder.build(), SCHEMA_CONTEXT) { + return new Shard(newShardBuilder()) { @Override public void onReceiveCommand(final Object message) throws Exception { super.onReceiveCommand(message); @@ -2296,9 +2294,8 @@ public class ShardTest extends AbstractShardTest { new ShardTestKit(getSystem()) {{ class TestShard extends Shard { - protected TestShard(final ShardIdentifier name, final Map peerAddresses, - final DatastoreContext datastoreContext, final SchemaContext schemaContext) { - super(name, peerAddresses, datastoreContext, schemaContext); + protected TestShard(AbstractBuilder builder) { + super(builder); setPersistence(new TestPersistentDataProvider(super.persistence())); } @@ -2320,8 +2317,7 @@ public class ShardTest extends AbstractShardTest { final Creator creator = new Creator() { @Override public Shard create() throws Exception { - return new TestShard(shardID, Collections.emptyMap(), - newDatastoreContext(), SCHEMA_CONTEXT); + return new TestShard(newShardBuilder()); } }; @@ -2329,7 +2325,6 @@ public class ShardTest extends AbstractShardTest { Props.create(new DelegatingShardCreator(creator)), shardActorName); waitUntilLeader(shard); - writeToStore(shard, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME)); final NormalizedNode expectedRoot = readStore(shard, YangInstanceIdentifier.builder().build()); @@ -2337,35 +2332,35 @@ public class ShardTest extends AbstractShardTest { // Trigger creation of a snapshot by ensuring final RaftActorContext raftActorContext = ((TestShard) shard.underlyingActor()).getRaftActorContext(); raftActorContext.getSnapshotManager().capture(mock(ReplicatedLogEntry.class), -1); - - assertEquals("Snapshot saved", true, latch.get().await(5, TimeUnit.SECONDS)); - - assertTrue("Invalid saved snapshot " + savedSnapshot.get(), - savedSnapshot.get() instanceof Snapshot); - - verifySnapshot((Snapshot)savedSnapshot.get(), expectedRoot); - - latch.set(new CountDownLatch(1)); - savedSnapshot.set(null); + awaitAndValidateSnapshot(expectedRoot); raftActorContext.getSnapshotManager().capture(mock(ReplicatedLogEntry.class), -1); + awaitAndValidateSnapshot(expectedRoot); + + shard.tell(PoisonPill.getInstance(), ActorRef.noSender()); + } - assertEquals("Snapshot saved", true, latch.get().await(5, TimeUnit.SECONDS)); + private void awaitAndValidateSnapshot(NormalizedNode expectedRoot + ) throws InterruptedException { + System.out.println("Inside awaitAndValidateSnapshot {}" + savedSnapshot.get()); + assertEquals("Snapshot saved", true, latch.get().await(5, TimeUnit.SECONDS)); - assertTrue("Invalid saved snapshot " + savedSnapshot.get(), - savedSnapshot.get() instanceof Snapshot); + assertTrue("Invalid saved snapshot " + savedSnapshot.get(), + savedSnapshot.get() instanceof Snapshot); - verifySnapshot((Snapshot)savedSnapshot.get(), expectedRoot); + verifySnapshot((Snapshot)savedSnapshot.get(), expectedRoot); - shard.tell(PoisonPill.getInstance(), ActorRef.noSender()); - } + latch.set(new CountDownLatch(1)); + savedSnapshot.set(null); + } - private void verifySnapshot(final Snapshot snapshot, final NormalizedNode expectedRoot) { + private void verifySnapshot(final Snapshot snapshot, final NormalizedNode expectedRoot) { - final NormalizedNode actual = SerializationUtils.deserializeNormalizedNode(snapshot.getState()); - assertEquals("Root node", expectedRoot, actual); + final NormalizedNode actual = SerializationUtils.deserializeNormalizedNode(snapshot.getState()); + assertEquals("Root node", expectedRoot, actual); - }}; + } + }; } /** @@ -2375,7 +2370,7 @@ public class ShardTest extends AbstractShardTest { */ @Test public void testInMemoryDataTreeRestore() throws ReadFailedException, DataValidationFailedException { - final DataTree store = InMemoryDataTreeFactory.getInstance().create(); + final DataTree store = InMemoryDataTreeFactory.getInstance().create(TreeType.OPERATIONAL); store.setSchemaContext(SCHEMA_CONTEXT); final DataTreeModification putTransaction = store.takeSnapshot().newModification(); @@ -2404,14 +2399,14 @@ public class ShardTest extends AbstractShardTest { final DatastoreContext persistentContext = DatastoreContext.newBuilder(). shardJournalRecoveryLogBatchSize(3).shardSnapshotBatchCount(5000).persistent(true).build(); - final Props persistentProps = Shard.props(shardID, Collections.emptyMap(), - persistentContext, SCHEMA_CONTEXT); + final Props persistentProps = Shard.builder().id(shardID).datastoreContext(persistentContext). + schemaContext(SCHEMA_CONTEXT).props(); final DatastoreContext nonPersistentContext = DatastoreContext.newBuilder(). shardJournalRecoveryLogBatchSize(3).shardSnapshotBatchCount(5000).persistent(false).build(); - final Props nonPersistentProps = Shard.props(shardID, Collections.emptyMap(), - nonPersistentContext, SCHEMA_CONTEXT); + final Props nonPersistentProps = Shard.builder().id(shardID).datastoreContext(nonPersistentContext). + schemaContext(SCHEMA_CONTEXT).props(); new ShardTestKit(getSystem()) {{ final TestActorRef shard1 = TestActorRef.create(getSystem(), @@ -2524,15 +2519,16 @@ public class ShardTest extends AbstractShardTest { @Test public void testClusteredDataChangeListernerDelayedRegistration() throws Exception { new ShardTestKit(getSystem()) {{ + dataStoreContextBuilder.persistent(false); final CountDownLatch onFirstElectionTimeout = new CountDownLatch(1); final CountDownLatch onChangeListenerRegistered = new CountDownLatch(1); final Creator creator = new Creator() { + private static final long serialVersionUID = 1L; boolean firstElectionTimeout = true; @Override public Shard create() throws Exception { - return new Shard(shardID, Collections.emptyMap(), - dataStoreContextBuilder.persistent(false).build(), SCHEMA_CONTEXT) { + return new Shard(newShardBuilder()) { @Override public void onReceiveCommand(final Object message) throws Exception { if(message instanceof ElectionTimeout && firstElectionTimeout) { @@ -2592,6 +2588,7 @@ public class ShardTest extends AbstractShardTest { @Test public void testClusteredDataChangeListernerRegistration() throws Exception { + dataStoreContextBuilder.persistent(false).build(); new ShardTestKit(getSystem()) {{ final ShardIdentifier member1ShardID = ShardIdentifier.builder().memberName("member-1") .shardName("inventory").type("config").build(); @@ -2599,12 +2596,13 @@ public class ShardTest extends AbstractShardTest { final ShardIdentifier member2ShardID = ShardIdentifier.builder().memberName("member-2") .shardName("inventory").type("config").build(); final Creator followerShardCreator = new Creator() { + private static final long serialVersionUID = 1L; @Override public Shard create() throws Exception { - return new Shard(member1ShardID, Collections.singletonMap(member2ShardID.toString(), - "akka://test/user/" + member2ShardID.toString()), - dataStoreContextBuilder.persistent(false).build(), SCHEMA_CONTEXT) { + return new Shard(Shard.builder().id(member1ShardID).datastoreContext(newDatastoreContext()). + peerAddresses(Collections.singletonMap(member2ShardID.toString(), + "akka://test/user/" + member2ShardID.toString())).schemaContext(SCHEMA_CONTEXT)) { @Override public void onReceiveCommand(final Object message) throws Exception { @@ -2617,12 +2615,13 @@ public class ShardTest extends AbstractShardTest { }; final Creator leaderShardCreator = new Creator() { + private static final long serialVersionUID = 1L; @Override public Shard create() throws Exception { - return new Shard(member2ShardID, Collections.singletonMap(member1ShardID.toString(), - "akka://test/user/" + member1ShardID.toString()), - dataStoreContextBuilder.persistent(false).build(), SCHEMA_CONTEXT) { }; + return new Shard(Shard.builder().id(member2ShardID).datastoreContext(newDatastoreContext()). + peerAddresses(Collections.singletonMap(member1ShardID.toString(), + "akka://test/user/" + member1ShardID.toString())).schemaContext(SCHEMA_CONTEXT)) {}; } }; @@ -2660,4 +2659,19 @@ public class ShardTest extends AbstractShardTest { shard.tell(PoisonPill.getInstance(), ActorRef.noSender()); }}; } + + @Test + public void testServerRemoved() throws Exception { + final TestActorRef parent = TestActorRef.create(getSystem(), MessageCollectorActor.props()); + + final ActorRef shard = parent.underlyingActor().context().actorOf( + newShardBuilder().props().withDispatcher(Dispatchers.DefaultDispatcherId()), + "testServerRemoved"); + + shard.tell(new ServerRemoved("test"), ActorRef.noSender()); + + MessageCollectorActor.expectFirstMatching(parent, ServerRemoved.class); + + } + }