From 898b12df2bde612b152742677bc9739b277ab047 Mon Sep 17 00:00:00 2001 From: Andrej Mak Date: Tue, 4 Apr 2017 09:49:54 +0200 Subject: [PATCH] Bug 5280: Enable tests for ClientBackedDatastore Add new test parameter - commitTimeout. New implementation needs more time to commit transaction in some cases e.g. leader down. Change-Id: I33d6312c9b18493e519b8607307c21c1b3a9bc75 Signed-off-by: Andrej Mak (cherry picked from commit 9dde5085f50832148a6f3766e1bc988be0327401) --- ...butedDataStoreRemotingIntegrationTest.java | 48 +++++++++---------- .../cluster/datastore/IntegrationTestKit.java | 10 +++- 2 files changed, 30 insertions(+), 28 deletions(-) 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 3298fa2c05..9b97ee783c 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 @@ -23,7 +23,6 @@ import akka.actor.Address; import akka.actor.AddressFromURIString; import akka.cluster.Cluster; import akka.dispatch.Futures; -import akka.pattern.AskTimeoutException; import akka.pattern.Patterns; import akka.testkit.JavaTestKit; import com.google.common.base.Optional; @@ -118,12 +117,14 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { @Parameters(name = "{0}") public static Collection data() { return Arrays.asList(new Object[][] { - { DistributedDataStore.class }, { ClientBackedDataStore.class } + { DistributedDataStore.class, 7}, { ClientBackedDataStore.class, 60 } }); } - @Parameter + @Parameter(0) public Class testParameter; + @Parameter(1) + public int commitTimeout; private static final String[] CARS_AND_PEOPLE = {"cars", "people"}; private static final String[] CARS = {"cars"}; @@ -197,12 +198,12 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { private void initDatastores(final String type, final String moduleShardsConfig, final String[] shards) throws Exception { - leaderTestKit = new IntegrationTestKit(leaderSystem, leaderDatastoreContextBuilder); + leaderTestKit = new IntegrationTestKit(leaderSystem, leaderDatastoreContextBuilder, commitTimeout); leaderDistributedDataStore = leaderTestKit.setupAbstractDataStore( testParameter, type, moduleShardsConfig, false, shards); - followerTestKit = new IntegrationTestKit(followerSystem, followerDatastoreContextBuilder); + followerTestKit = new IntegrationTestKit(followerSystem, followerDatastoreContextBuilder, commitTimeout); followerDistributedDataStore = followerTestKit.setupAbstractDataStore( testParameter, type, moduleShardsConfig, false, shards); @@ -315,7 +316,8 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { final ActorSystem newSystem = newActorSystem("reinstated-member2", "Member2"); - try (final AbstractDataStore member2Datastore = new IntegrationTestKit(newSystem, leaderDatastoreContextBuilder) + try (AbstractDataStore member2Datastore = new IntegrationTestKit(newSystem, leaderDatastoreContextBuilder, + commitTimeout) .setupAbstractDataStore(testParameter, testName, "module-shards-member2", true, CARS)) { verifyCars(member2Datastore.newReadOnlyTransaction(), car2); } @@ -569,8 +571,6 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { @Test public void testSingleShardTransactionsWithLeaderChanges() throws Exception { - //TODO remove when test passes also for ClientBackedDataStore - Assume.assumeTrue(testParameter.equals(DistributedDataStore.class)); final String testName = "testSingleShardTransactionsWithLeaderChanges"; initDatastoresWithCars(testName); @@ -603,7 +603,7 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { final DatastoreContext.Builder newMember1Builder = DatastoreContext.newBuilder() .shardHeartbeatIntervalInMillis(100).shardElectionTimeoutFactor(5); - IntegrationTestKit newMember1TestKit = new IntegrationTestKit(leaderSystem, newMember1Builder); + IntegrationTestKit newMember1TestKit = new IntegrationTestKit(leaderSystem, newMember1Builder, commitTimeout); try (final AbstractDataStore ds = newMember1TestKit.setupAbstractDataStore( @@ -879,7 +879,8 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { initDatastores(testName, MODULE_SHARDS_CARS_PEOPLE_1_2_3, CARS_AND_PEOPLE); final IntegrationTestKit follower2TestKit = new IntegrationTestKit(follower2System, - DatastoreContext.newBuilderFrom(followerDatastoreContextBuilder.build()).operationTimeoutInMillis(100)); + DatastoreContext.newBuilderFrom(followerDatastoreContextBuilder.build()).operationTimeoutInMillis(100), + commitTimeout); try (final AbstractDataStore follower2DistributedDataStore = follower2TestKit.setupAbstractDataStore( testParameter, testName, MODULE_SHARDS_CARS_PEOPLE_1_2_3, false)) { @@ -985,10 +986,8 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { leaderTestKit.doCommit(successTxCohort); } - @Test(expected = AskTimeoutException.class) + @Test public void testTransactionWithShardLeaderNotResponding() throws Exception { - //TODO remove when test passes also for ClientBackedDataStore - Assume.assumeTrue(testParameter.equals(DistributedDataStore.class)); followerDatastoreContextBuilder.shardElectionTimeoutFactor(50); initDatastoresWithCars("testTransactionWithShardLeaderNotResponding"); @@ -1010,19 +1009,16 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { try { followerTestKit.doCommit(rwTx.ready()); + fail("Exception expected"); } catch (final ExecutionException e) { - assertTrue("Expected ShardLeaderNotRespondingException cause. Actual: " + e.getCause(), - e.getCause() instanceof ShardLeaderNotRespondingException); - assertNotNull("Expected a nested cause", e.getCause().getCause()); - Throwables.propagateIfInstanceOf(e.getCause().getCause(), Exception.class); - Throwables.propagate(e.getCause().getCause()); + final String msg = "Unexpected exception: " + Throwables.getStackTraceAsString(e.getCause()); + assertTrue(msg, Throwables.getRootCause(e) instanceof NoShardLeaderException + || e.getCause() instanceof ShardLeaderNotRespondingException); } } - @Test(expected = NoShardLeaderException.class) + @Test public void testTransactionWithCreateTxFailureDueToNoLeader() throws Exception { - //TODO remove when test passes also for ClientBackedDataStore - Assume.assumeTrue(testParameter.equals(DistributedDataStore.class)); initDatastoresWithCars("testTransactionWithCreateTxFailureDueToNoLeader"); // Do an initial read to get the primary shard info cached. @@ -1047,23 +1043,23 @@ public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { try { followerTestKit.doCommit(rwTx.ready()); + fail("Exception expected"); } catch (final ExecutionException e) { - Throwables.propagateIfInstanceOf(e.getCause(), Exception.class); - Throwables.propagate(e.getCause()); + final String msg = "Expected instance of NoShardLeaderException, actual: \n" + + Throwables.getStackTraceAsString(e.getCause()); + assertTrue(msg, Throwables.getRootCause(e) instanceof NoShardLeaderException); } } @Test public void testTransactionRetryWithInitialAskTimeoutExOnCreateTx() throws Exception { - //TODO remove when test passes also for ClientBackedDataStore - Assume.assumeTrue(testParameter.equals(DistributedDataStore.class)); String testName = "testTransactionRetryWithInitialAskTimeoutExOnCreateTx"; initDatastores(testName, MODULE_SHARDS_CARS_PEOPLE_1_2_3, CARS); final DatastoreContext.Builder follower2DatastoreContextBuilder = DatastoreContext.newBuilder() .shardHeartbeatIntervalInMillis(100).shardElectionTimeoutFactor(5); final IntegrationTestKit follower2TestKit = new IntegrationTestKit( - follower2System, follower2DatastoreContextBuilder); + follower2System, follower2DatastoreContextBuilder, commitTimeout); try (final AbstractDataStore ds = follower2TestKit.setupAbstractDataStore( diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/IntegrationTestKit.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/IntegrationTestKit.java index 93c3e5bc2b..01678ad74e 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/IntegrationTestKit.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/IntegrationTestKit.java @@ -58,10 +58,16 @@ public class IntegrationTestKit extends ShardTestKit { protected DatastoreContext.Builder datastoreContextBuilder; protected DatastoreSnapshot restoreFromSnapshot; + private final int commitTimeout; public IntegrationTestKit(final ActorSystem actorSystem, final Builder datastoreContextBuilder) { + this(actorSystem, datastoreContextBuilder, 7); + } + + public IntegrationTestKit(final ActorSystem actorSystem, final Builder datastoreContextBuilder, int commitTimeout) { super(actorSystem); this.datastoreContextBuilder = datastoreContextBuilder; + this.commitTimeout = commitTimeout; } public DatastoreContext.Builder getDatastoreContextBuilder() { @@ -334,7 +340,7 @@ public class IntegrationTestKit extends ShardTestKit { } public void doCommit(final DOMStoreThreePhaseCommitCohort cohort) throws Exception { - Boolean canCommit = cohort.canCommit().get(7, TimeUnit.SECONDS); + Boolean canCommit = cohort.canCommit().get(commitTimeout, TimeUnit.SECONDS); assertEquals("canCommit", true, canCommit); cohort.preCommit().get(5, TimeUnit.SECONDS); cohort.commit().get(5, TimeUnit.SECONDS); @@ -342,7 +348,7 @@ public class IntegrationTestKit extends ShardTestKit { void doCommit(final ListenableFuture canCommitFuture, final DOMStoreThreePhaseCommitCohort cohort) throws Exception { - Boolean canCommit = canCommitFuture.get(7, TimeUnit.SECONDS); + Boolean canCommit = canCommitFuture.get(commitTimeout, TimeUnit.SECONDS); assertEquals("canCommit", true, canCommit); cohort.preCommit().get(5, TimeUnit.SECONDS); cohort.commit().get(5, TimeUnit.SECONDS); -- 2.36.6