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%2FDistributedDataStoreRemotingIntegrationTest.java;h=b1b380e646e1a0e63b1f0b4f3d985c6f45c1a178;hp=d5035b9577e4cca9784814dcb1a315aeaf41e7c2;hb=e8c92cf0ebc968dc37dd549f3eefbd9b09567c4f;hpb=4e097d8d56a7e3814c63a69da183765fd4c78a56 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 d5035b9577..b1b380e646 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 @@ -37,7 +37,6 @@ import akka.testkit.javadsl.TestKit; import com.google.common.base.Stopwatch; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableMap; -import com.google.common.primitives.UnsignedLong; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.Uninterruptibles; @@ -84,6 +83,7 @@ import org.opendaylight.controller.cluster.datastore.persisted.FrontendClientMet import org.opendaylight.controller.cluster.datastore.persisted.FrontendShardDataTreeSnapshotMetadata; import org.opendaylight.controller.cluster.datastore.persisted.MetadataShardDataTreeSnapshot; import org.opendaylight.controller.cluster.datastore.persisted.ShardSnapshotState; +import org.opendaylight.controller.cluster.datastore.utils.UnsignedLongBitmap; import org.opendaylight.controller.cluster.raft.base.messages.TimeoutNow; import org.opendaylight.controller.cluster.raft.client.messages.GetOnDemandRaftState; import org.opendaylight.controller.cluster.raft.client.messages.OnDemandRaftState; @@ -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; @@ -370,10 +371,9 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { writeTx.write(CarsModel.newCarPath("car" + i), CarsModel.newCarEntry("car" + i, Uint64.valueOf(20000))); followerTestKit.doCommit(writeTx.ready()); - DOMStoreReadTransaction domStoreReadTransaction = txChain.newReadOnlyTransaction(); - domStoreReadTransaction.read(CarsModel.BASE_PATH).get(); - - domStoreReadTransaction.close(); + try (var tx = txChain.newReadOnlyTransaction()) { + tx.read(CarsModel.BASE_PATH).get(); + } } // wait to let the shard catch up with purged @@ -388,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); } @@ -406,30 +406,29 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { assertEquals(List.of(), clientMeta.getCurrentHistories()); } - private void assertTellClientMetadata(final FrontendClientMetadata clientMeta, final int numCars) { + private 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(); } - assertEquals(0, metadata.getClosedTransactions().size()); - - final var purgedRanges = metadata.getPurgedTransactions().ranges(); - // FIXME: CONTROLLER-1991: remove this assumption assumeTrue(false); - assertEquals(1, purgedRanges.size()); - final var purgedRange = purgedRanges.first(); - assertEquals(UnsignedLong.ZERO, purgedRange.lower()); - assertEquals(UnsignedLong.valueOf(10), purgedRange.upper()); + assertEquals(UnsignedLongBitmap.of(), metadata.getClosedTransactions()); + 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"); @@ -445,10 +444,9 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { writeTx = txChain.newWriteOnlyTransaction(); writeTx.close(); - DOMStoreReadTransaction domStoreReadTransaction = txChain.newReadOnlyTransaction(); - domStoreReadTransaction.read(CarsModel.BASE_PATH).get(); - - domStoreReadTransaction.close(); + try (var tx = txChain.newReadOnlyTransaction()) { + tx.read(CarsModel.BASE_PATH).get(); + } } writeTx = txChain.newWriteOnlyTransaction(); @@ -468,7 +466,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 + 1); } else { assertAskClientMetadata(clientMeta); } @@ -907,9 +905,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"); @@ -979,6 +974,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())); @@ -1274,9 +1271,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(); @@ -1298,6 +1295,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";