From 972eb78ee3a2ab58d83177427bc8e1bec69b4e7f Mon Sep 17 00:00:00 2001 From: Nhat Nguyen Date: Thu, 20 Sep 2018 13:44:26 -0400 Subject: [PATCH] TEST: stop assertSeqNos if shards movement (#33875) Currently, assertSeqNos assumes that the cluster is stable at the end of the test (i.e., no more shard movement). However, this assumption does not always hold. In these cases, we can stop the assertion instead of failing a test. Closes #33704 --- .../discovery/ClusterDisruptionIT.java | 1 - .../elasticsearch/test/ESIntegTestCase.java | 28 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/discovery/ClusterDisruptionIT.java b/server/src/test/java/org/elasticsearch/discovery/ClusterDisruptionIT.java index d94d3f26ae071..2998ec8a6ba66 100644 --- a/server/src/test/java/org/elasticsearch/discovery/ClusterDisruptionIT.java +++ b/server/src/test/java/org/elasticsearch/discovery/ClusterDisruptionIT.java @@ -286,7 +286,6 @@ public void testRejoinDocumentExistsInAllShardCopies() throws Exception { } // simulate handling of sending shard failure during an isolation - @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/33704") public void testSendingShardFailure() throws Exception { List nodes = startCluster(3, 2); String masterNode = internalCluster().getMasterName(); diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java index 502568931e184..fad129025401b 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java @@ -197,6 +197,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.BiFunction; import java.util.function.BooleanSupplier; import java.util.function.Function; import java.util.stream.Collectors; @@ -2353,17 +2354,28 @@ public static Index resolveIndex(String index) { } protected void assertSeqNos() throws Exception { + final BiFunction getInstanceShardInstance = (clusterState, shardRouting) -> { + if (shardRouting.assignedToNode() == false) { + return null; + } + final DiscoveryNode assignedNode = clusterState.nodes().get(shardRouting.currentNodeId()); + if (assignedNode == null) { + return null; + } + return internalCluster().getInstance(IndicesService.class, assignedNode.getName()).getShardOrNull(shardRouting.shardId()); + }; assertBusy(() -> { final ClusterState state = clusterService().state(); for (ObjectObjectCursor indexRoutingTable : state.routingTable().indicesRouting()) { for (IntObjectCursor indexShardRoutingTable : indexRoutingTable.value.shards()) { ShardRouting primaryShardRouting = indexShardRoutingTable.value.primaryShard(); - if (primaryShardRouting == null || primaryShardRouting.assignedToNode() == false) { + if (primaryShardRouting == null) { continue; } - DiscoveryNode primaryNode = state.nodes().get(primaryShardRouting.currentNodeId()); - IndexShard primaryShard = internalCluster().getInstance(IndicesService.class, primaryNode.getName()) - .indexServiceSafe(primaryShardRouting.index()).getShard(primaryShardRouting.id()); + final IndexShard primaryShard = getInstanceShardInstance.apply(state, primaryShardRouting); + if (primaryShard == null) { + continue; //just ignore - shard movement + } final SeqNoStats primarySeqNoStats; final ObjectLongMap syncGlobalCheckpoints; try { @@ -2375,12 +2387,10 @@ protected void assertSeqNos() throws Exception { assertThat(primaryShardRouting + " should have set the global checkpoint", primarySeqNoStats.getGlobalCheckpoint(), not(equalTo(SequenceNumbers.UNASSIGNED_SEQ_NO))); for (ShardRouting replicaShardRouting : indexShardRoutingTable.value.replicaShards()) { - if (replicaShardRouting.assignedToNode() == false) { - continue; + final IndexShard replicaShard = getInstanceShardInstance.apply(state, replicaShardRouting); + if (replicaShard == null) { + continue; //just ignore - shard movement } - DiscoveryNode replicaNode = state.nodes().get(replicaShardRouting.currentNodeId()); - IndexShard replicaShard = internalCluster().getInstance(IndicesService.class, replicaNode.getName()) - .indexServiceSafe(replicaShardRouting.index()).getShard(replicaShardRouting.id()); final SeqNoStats seqNoStats; try { seqNoStats = replicaShard.seqNoStats();