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%2Fentityownership%2FDistributedEntityOwnershipIntegrationTest.java;h=aaf4bc2de99e22ea041d9964a84bcff973ce06d9;hb=cd3a0e09db5a1def00c46a4be245dbdf648b539c;hp=7240b3eebb686a841d60a42f79b7517461c007ff;hpb=1a6462c3cdb2cd310ab9503beb18da70f6e3779d;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipIntegrationTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipIntegrationTest.java index 7240b3eebb..aaf4bc2de9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipIntegrationTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipIntegrationTest.java @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -130,7 +131,7 @@ public class DistributedEntityOwnershipIntegrationTest { @Test public void testFunctionalityWithThreeNodes() throws Exception { - String name = "test"; + String name = "testFunctionalityWithThreeNodes"; MemberNode leaderNode = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name) .moduleShardsConfig(MODULE_SHARDS_CONFIG).schemaContext(SCHEMA_CONTEXT).createOperDatastore(false) .datastoreContextBuilder(leaderDatastoreContextBuilder).build(); @@ -273,7 +274,7 @@ public class DistributedEntityOwnershipIntegrationTest { followerDatastoreContextBuilder.shardElectionTimeoutFactor(5) .customRaftPolicyImplementation(DisableElectionsRaftPolicy.class.getName()); - String name = "test"; + String name = "testLeaderEntityOwnersReassignedAfterShutdown"; MemberNode leaderNode = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name) .moduleShardsConfig(MODULE_SHARDS_CONFIG).schemaContext(SCHEMA_CONTEXT).createOperDatastore(false) .datastoreContextBuilder(leaderDatastoreContextBuilder).build(); @@ -292,6 +293,8 @@ public class DistributedEntityOwnershipIntegrationTest { follower1Node.configDataStore().waitTillReady(); follower2Node.configDataStore().waitTillReady(); + follower1Node.waitForMembersUp("member-1", "member-3"); + final DOMEntityOwnershipService leaderEntityOwnershipService = newOwnershipService(leaderDistributedDataStore); final DOMEntityOwnershipService follower1EntityOwnershipService = newOwnershipService(follower1Node.configDataStore()); @@ -322,6 +325,18 @@ public class DistributedEntityOwnershipIntegrationTest { verifyCandidates(leaderDistributedDataStore, ENTITY2, "member-1", "member-3"); verifyOwner(leaderDistributedDataStore, ENTITY2, "member-1"); + // Get the leader's lastIndex and verify followers are fully synced before shutting down the leader + + AtomicLong leaderLastIndex = new AtomicLong(); + MemberNode.verifyRaftState(leaderDistributedDataStore, ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> leaderLastIndex.set(raftState.getLastIndex())); + + MemberNode.verifyRaftState(follower1Node.configDataStore(), ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> assertEquals("Last index", leaderLastIndex.get(), raftState.getLastIndex())); + + MemberNode.verifyRaftState(follower2Node.configDataStore(), ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> assertEquals("Last index", leaderLastIndex.get(), raftState.getLastIndex())); + // Shutdown the leader and verify its removed from the candidate list leaderNode.cleanup(); @@ -350,7 +365,7 @@ public class DistributedEntityOwnershipIntegrationTest { followerDatastoreContextBuilder.shardElectionTimeoutFactor(5) .customRaftPolicyImplementation(DisableElectionsRaftPolicy.class.getName()); - String name = "test"; + String name = "testLeaderAndFollowerEntityOwnersReassignedAfterShutdown"; final MemberNode leaderNode = MemberNode.builder(memberNodes).akkaConfig("Member1") .useAkkaArtery(false).testName(name) .moduleShardsConfig(MODULE_SHARDS_5_NODE_CONFIG).schemaContext(SCHEMA_CONTEXT) @@ -381,6 +396,11 @@ public class DistributedEntityOwnershipIntegrationTest { leaderDistributedDataStore.waitTillReady(); follower1Node.configDataStore().waitTillReady(); follower2Node.configDataStore().waitTillReady(); + follower3Node.configDataStore().waitTillReady(); + follower4Node.configDataStore().waitTillReady(); + + leaderNode.waitForMembersUp("member-2", "member-3", "member-4", "member-5"); + follower1Node.waitForMembersUp("member-1", "member-3", "member-4", "member-5"); final DOMEntityOwnershipService leaderEntityOwnershipService = newOwnershipService(leaderDistributedDataStore); final DOMEntityOwnershipService follower1EntityOwnershipService = @@ -421,6 +441,20 @@ public class DistributedEntityOwnershipIntegrationTest { verifyCandidates(leaderDistributedDataStore, ENTITY2, "member-1", "member-3", "member-4"); verifyOwner(leaderDistributedDataStore, ENTITY2, "member-1"); + // Get the leader's lastIndex and verify followers are fully synced before shutting down the leader + AtomicLong leaderLastIndex = new AtomicLong(); + MemberNode.verifyRaftState(leaderDistributedDataStore, ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> leaderLastIndex.set(raftState.getLastIndex())); + + MemberNode.verifyRaftState(follower1Node.configDataStore(), ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> assertEquals("Last index", leaderLastIndex.get(), raftState.getLastIndex())); + + MemberNode.verifyRaftState(follower2Node.configDataStore(), ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> assertEquals("Last index", leaderLastIndex.get(), raftState.getLastIndex())); + + MemberNode.verifyRaftState(follower4Node.configDataStore(), ENTITY_OWNERSHIP_SHARD_NAME, + raftState -> assertEquals("Last index", leaderLastIndex.get(), raftState.getLastIndex())); + // Shutdown the leader and follower3 leaderNode.cleanup(); @@ -623,7 +657,7 @@ public class DistributedEntityOwnershipIntegrationTest { @Test public void testOwnerSelectedOnRapidUnregisteringAndRegisteringOfCandidates() throws Exception { - String name = "test"; + String name = "testOwnerSelectedOnRapidUnregisteringAndRegisteringOfCandidates"; MemberNode leaderNode = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name) .moduleShardsConfig(MODULE_SHARDS_CONFIG).schemaContext(SCHEMA_CONTEXT).createOperDatastore(false) .datastoreContextBuilder(leaderDatastoreContextBuilder).build(); @@ -666,7 +700,7 @@ public class DistributedEntityOwnershipIntegrationTest { @Test public void testOwnerSelectedOnRapidRegisteringAndUnregisteringOfCandidates() throws Exception { - String name = "test"; + String name = "testOwnerSelectedOnRapidRegisteringAndUnregisteringOfCandidates"; MemberNode leaderNode = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name) .moduleShardsConfig(MODULE_SHARDS_CONFIG).schemaContext(SCHEMA_CONTEXT).createOperDatastore(false) .datastoreContextBuilder(leaderDatastoreContextBuilder).build();