X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardManagerTest.java;h=4e45dc4f212f37d2de0f36b9ba2720c5bb004c42;hb=7030ae1a3c8fcc19e2b88d874a18faf73496682e;hp=f9b67567d1ae4214b06981176e5e443ab1a01f00;hpb=e65e1755bd770cf03d3ea15edda9b9cc7a79f3c0;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java index f9b67567d1..4e45dc4f21 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -24,7 +25,6 @@ import akka.actor.Props; import akka.actor.Status; import akka.actor.Status.Failure; import akka.actor.Status.Success; -import akka.actor.Terminated; import akka.cluster.Cluster; import akka.cluster.ClusterEvent; import akka.dispatch.Dispatchers; @@ -105,6 +105,7 @@ import org.opendaylight.controller.cluster.raft.TestActorFactory; import org.opendaylight.controller.cluster.raft.base.messages.FollowerInitialSyncUpStatus; import org.opendaylight.controller.cluster.raft.base.messages.SwitchBehavior; import org.opendaylight.controller.cluster.raft.client.messages.GetSnapshot; +import org.opendaylight.controller.cluster.raft.client.messages.Shutdown; import org.opendaylight.controller.cluster.raft.messages.AddServer; import org.opendaylight.controller.cluster.raft.messages.AddServerReply; import org.opendaylight.controller.cluster.raft.messages.RemoveServer; @@ -794,6 +795,20 @@ public class ShardManagerTest extends AbstractActorTest { MessageCollectorActor.expectFirstMatching(mockShardActor1, PeerUp.class); + // Test FindPrimary wait succeeds after reachable member event. + + shardManager1.underlyingActor().onReceiveCommand(MockClusterWrapper. + createUnreachableMember("member-2", "akka.tcp://cluster-test@127.0.0.1:2558")); + shardManager1.underlyingActor().waitForUnreachableMember(); + + shardManager1.tell(new FindPrimary("default", true), getRef()); + + shardManager1.underlyingActor().onReceiveCommand(MockClusterWrapper. + createReachableMember("member-2", "akka.tcp://cluster-test@127.0.0.1:2558")); + + RemotePrimaryShardFound found2 = expectMsgClass(duration("5 seconds"), RemotePrimaryShardFound.class); + String path2 = found2.getPrimaryPath(); + assertTrue("Unexpected primary path " + path2, path2.contains("member-2-shard-default-config")); }}; LOG.info("testShardAvailabilityOnChangeOfMemberReachability ending"); @@ -1839,8 +1854,6 @@ public class ShardManagerTest extends AbstractActorTest { TestActorRef shardManager = actorFactory.createTestActor( newTestShardMgrBuilder(mockConfig).addShardActor("default", shard).props()); - watch(shard); - shardManager.underlyingActor().waitForRecoveryComplete(); shardManager.tell(new UpdateSchemaContext(TestModel.createTestContext()), getRef()); @@ -1854,7 +1867,7 @@ public class ShardManagerTest extends AbstractActorTest { shardManager.underlyingActor().verifySnapshotPersisted(Sets.newHashSet("people")); - expectMsgClass(duration("5 seconds"), Terminated.class); + MessageCollectorActor.expectFirstMatching(shard, Shutdown.class); }}; LOG.info("testServerRemovedShardActorRunning ending"); @@ -1897,6 +1910,54 @@ public class ShardManagerTest extends AbstractActorTest { LOG.info("testShardPersistenceWithRestoredData ending"); } + @Test + public void testShutDown() throws Exception { + LOG.info("testShutDown starting"); + new JavaTestKit(getSystem()) {{ + MockConfiguration mockConfig = + new MockConfiguration(ImmutableMap.>builder(). + put("shard1", Arrays.asList("member-1")). + put("shard2", Arrays.asList("member-1")).build()); + + String shardId1 = ShardIdentifier.builder().shardName("shard1").memberName("member-1"). + type(shardMrgIDSuffix).build().toString(); + TestActorRef shard1 = actorFactory.createTestActor( + MessageCollectorActor.props(), shardId1); + + String shardId2 = ShardIdentifier.builder().shardName("shard2").memberName("member-1"). + type(shardMrgIDSuffix).build().toString(); + TestActorRef shard2 = actorFactory.createTestActor( + MessageCollectorActor.props(), shardId2); + + TestActorRef shardManager = actorFactory.createTestActor(newTestShardMgrBuilder( + mockConfig).addShardActor("shard1", shard1).addShardActor("shard2", shard2).props()); + + shardManager.tell(new UpdateSchemaContext(TestModel.createTestContext()), getRef()); + shardManager.tell(new ActorInitialized(), shard1); + shardManager.tell(new ActorInitialized(), shard2); + + FiniteDuration duration = FiniteDuration.create(5, TimeUnit.SECONDS); + Future stopFuture = Patterns.gracefulStop(shardManager, duration, new Shutdown()); + + MessageCollectorActor.expectFirstMatching(shard1, Shutdown.class); + MessageCollectorActor.expectFirstMatching(shard2, Shutdown.class); + + try { + Await.ready(stopFuture, FiniteDuration.create(500, TimeUnit.MILLISECONDS)); + fail("ShardManager actor stopped without waiting for the Shards to be stopped"); + } catch(TimeoutException e) { + // expected + } + + actorFactory.killActor(shard1, this); + actorFactory.killActor(shard2, this); + + Boolean stopped = Await.result(stopFuture, duration); + assertEquals("Stopped", Boolean.TRUE, stopped); + }}; + + LOG.info("testShutDown ending"); + } private static class TestShardManager extends ShardManager { private final CountDownLatch recoveryComplete = new CountDownLatch(1);