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%2FDistributedDataStoreRemotingIntegrationTest.java;h=a8faac46cc408202050c7dc2f3ba6792788ef0ae;hb=refs%2Fchanges%2F49%2F85749%2F63;hp=542a79840d6b7fa753616dfb823e3844b2e2637d;hpb=8e4ea1b1109f2c4bf167cd2cca2a7ffe2e1f7b73;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java index 542a79840d..a8faac46cc 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java @@ -124,6 +124,7 @@ 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.collection.Set; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.FiniteDuration; @@ -387,7 +388,7 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { final var clientMeta = frontendMetadata.getClients().get(0); if (leaderDistributedDataStore.getActorUtils().getDatastoreContext().isUseTellBasedProtocol()) { - assertTellClientMetadata(clientMeta, numCars); + assertTellClientMetadata(clientMeta, numCars * 2); } else { assertAskClientMetadata(clientMeta); } @@ -400,29 +401,31 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { } } - private void assertAskClientMetadata(final FrontendClientMetadata clientMeta) { + private static void assertAskClientMetadata(final FrontendClientMetadata clientMeta) { // ask based should track no metadata assertEquals(List.of(), clientMeta.getCurrentHistories()); } - private void assertTellClientMetadata(final FrontendClientMetadata clientMeta, final int numCars) { + private static void assertTellClientMetadata(final FrontendClientMetadata clientMeta, final long lastPurged) { final var iterator = clientMeta.getCurrentHistories().iterator(); var metadata = iterator.next(); while (iterator.hasNext() && metadata.getHistoryId() != 1) { metadata = iterator.next(); } - // FIXME: CONTROLLER-1991: remove this assumption - assumeTrue(false); - assertEquals(UnsignedLongBitmap.of(), metadata.getClosedTransactions()); - assertEquals("[[0.." + numCars * 2 + "]]", metadata.getPurgedTransactions().toString()); + assertEquals("[[0.." + lastPurged + "]]", metadata.getPurgedTransactions().ranges().toString()); } @Test public void testCloseTransactionMetadataLeak() throws Exception { - // FIXME: Ask-based frontend seems to have some issues with back to back close - assumeTrue(testParameter.isAssignableFrom(TestClientBackedDataStore.class)); + // FIXME: CONTROLLER-2016: ask-based frontend triggers this: + // + // java.lang.IllegalStateException: Previous transaction + // member-2-datastore-testCloseTransactionMetadataLeak-fe-0-chn-1-txn-1-0 is not ready yet + // at org.opendaylight.controller.cluster.datastore.TransactionChainProxy$Allocated.checkReady() + // at org.opendaylight.controller.cluster.datastore.TransactionChainProxy.newReadOnlyTransaction() + assumeTrue(testParameter.isAssignableFrom(ClientBackedDataStore.class)); initDatastoresWithCars("testCloseTransactionMetadataLeak"); @@ -435,21 +438,17 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { int numCars = 5; for (int i = 0; i < numCars; i++) { - writeTx = txChain.newWriteOnlyTransaction(); - writeTx.close(); + try (var tx = txChain.newWriteOnlyTransaction()) { + // Empty on purpose + } try (var tx = txChain.newReadOnlyTransaction()) { tx.read(CarsModel.BASE_PATH).get(); } } - writeTx = txChain.newWriteOnlyTransaction(); - writeTx.write(CarsModel.BASE_PATH, CarsModel.emptyContainer()); - writeTx.write(CarsModel.CAR_LIST_PATH, CarsModel.newCarMapNode()); - followerTestKit.doCommit(writeTx.ready()); - // wait to let the shard catch up with purged - await("Close transaction purge leak test.").atMost(5, TimeUnit.SECONDS) + await("wait for purges to settle").atMost(5, TimeUnit.SECONDS) .pollInterval(500, TimeUnit.MILLISECONDS) .untilAsserted(() -> { final var localShard = leaderDistributedDataStore.getActorUtils().findLocalShard("cars") @@ -460,17 +459,11 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { final var clientMeta = frontendMetadata.getClients().get(0); if (leaderDistributedDataStore.getActorUtils().getDatastoreContext().isUseTellBasedProtocol()) { - assertTellClientMetadata(clientMeta, numCars); + assertTellClientMetadata(clientMeta, numCars * 2); } else { assertAskClientMetadata(clientMeta); } }); - - try (var tx = txChain.newReadOnlyTransaction()) { - final var body = tx.read(CarsModel.CAR_LIST_PATH).get(5, TimeUnit.SECONDS).orElseThrow().body(); - assertThat(body, instanceOf(Collection.class)); - assertEquals(numCars, ((Collection) body).size()); - } } @Test @@ -899,9 +892,6 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { @Test public void testTransactionForwardedToLeaderAfterRetry() throws Exception { - // FIXME: remove when test passes also for ClientBackedDataStore - assumeTrue(DistributedDataStore.class.isAssignableFrom(testParameter)); - followerDatastoreContextBuilder.shardBatchedModificationCount(2); leaderDatastoreContextBuilder.shardBatchedModificationCount(2); initDatastoresWithCarsAndPeople("testTransactionForwardedToLeaderAfterRetry"); @@ -971,6 +961,8 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { cars.add(CarsModel.newCarEntry("car" + carIndex, Uint64.valueOf(carIndex))); readWriteTx.write(CarsModel.newCarPath("car" + carIndex), cars.getLast()); + // FIXME: CONTROLLER-2017: ClientBackedDataStore reports only 4 transactions + assumeTrue(DistributedDataStore.class.isAssignableFrom(testParameter)); IntegrationTestKit.verifyShardStats(leaderDistributedDataStore, "cars", stats -> assertEquals("getReadWriteTransactionCount", 5, stats.getReadWriteTransactionCount())); @@ -1078,7 +1070,7 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { @Test public void testTransactionWithIsolatedLeader() throws Exception { - // FIXME: remove when test passes also for ClientBackedDataStore + // FIXME: CONTROLLER-2018: remove when test passes also for ClientBackedDataStore assumeTrue(DistributedDataStore.class.isAssignableFrom(testParameter)); // Set the isolated leader check interval high so we can control the switch to IsolatedLeader. @@ -1266,9 +1258,9 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { Member follower2Member = follower2Cluster.readView().self(); await().atMost(10, TimeUnit.SECONDS) - .until(() -> leaderCluster.readView().unreachableMembers().contains(follower2Member)); + .until(() -> containsUnreachable(leaderCluster, follower2Member)); await().atMost(10, TimeUnit.SECONDS) - .until(() -> followerCluster.readView().unreachableMembers().contains(follower2Member)); + .until(() -> containsUnreachable(followerCluster, follower2Member)); ActorRef followerCars = followerDistributedDataStore.getActorUtils().findLocalShard("cars").get(); @@ -1290,6 +1282,13 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { ds2.close(); } + private static Boolean containsUnreachable(final Cluster cluster, final Member member) { + // unreachableMembers() returns scala.collection.immutable.Set, but we are using scala.collection.Set to fix JDT + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=468276#c32 + final Set members = cluster.readView().unreachableMembers(); + return members.contains(member); + } + @Test public void testInstallSnapshot() throws Exception { final String testName = "testInstallSnapshot"; @@ -1410,14 +1409,10 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { @Test public void testSnapshotOnRootOverwrite() throws Exception { - // FIXME: ClientBackedDatastore does not have stable indexes/term, the snapshot index seems to fluctuate - assumeTrue(DistributedDataStore.class.isAssignableFrom(testParameter)); - - final String testName = "testSnapshotOnRootOverwrite"; - final String[] shards = {"cars", "default"}; - initDatastores(testName, "module-shards-default-cars-member1-and-2.conf", shards, - leaderDatastoreContextBuilder.snapshotOnRootOverwrite(true), - followerDatastoreContextBuilder.snapshotOnRootOverwrite(true)); + initDatastores("testSnapshotOnRootOverwrite", "module-shards-default-cars-member1-and-2.conf", + new String[] {"cars", "default"}, + leaderDatastoreContextBuilder.snapshotOnRootOverwrite(true), + followerDatastoreContextBuilder.snapshotOnRootOverwrite(true)); leaderTestKit.waitForMembersUp("member-2"); final ContainerNode rootNode = ImmutableContainerNodeBuilder.create() @@ -1427,6 +1422,9 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { leaderTestKit.testWriteTransaction(leaderDistributedDataStore, YangInstanceIdentifier.empty(), rootNode); + // FIXME: CONTROLLER-2020: ClientBackedDatastore does not have stable indexes/term, + // the snapshot index seems to fluctuate + assumeTrue(DistributedDataStore.class.isAssignableFrom(testParameter)); IntegrationTestKit.verifyShardState(leaderDistributedDataStore, "cars", state -> assertEquals(1, state.getSnapshotIndex())); @@ -1464,7 +1462,7 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { verifySnapshot("member-2-shard-cars-testSnapshotOnRootOverwrite", 12); } - private void verifySnapshot(final String persistenceId, final long lastAppliedIndex) { + private static void verifySnapshot(final String persistenceId, final long lastAppliedIndex) { await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { List snap = InMemorySnapshotStore.getSnapshots(persistenceId, Snapshot.class); assertEquals(1, snap.size());