diff --git a/server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java b/server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java index 34a0024c1a467..1a079d03405d7 100644 --- a/server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java +++ b/server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java @@ -343,14 +343,20 @@ private static boolean assertConsistentEntries(Map entries) { assert entry.repository().equals(repository) : "mismatched repository " + entry + " tracked under " + repository; for (Map.Entry shard : entry.shardsByRepoShardId().entrySet()) { final RepositoryShardId sid = shard.getKey(); + final ShardSnapshotStatus shardSnapshotStatus = shard.getValue(); assert assertShardStateConsistent( entriesForRepository, assignedShards, queuedShards, sid.indexName(), sid.shardId(), - shard.getValue() + shardSnapshotStatus ); + + assert entry.state() != State.ABORTED + || shardSnapshotStatus.state == ShardState.ABORTED + || shardSnapshotStatus.state().completed() + : sid + " is in state " + shardSnapshotStatus.state() + " in aborted snapshot " + entry.snapshot; } } // make sure in-flight-shard-states can be built cleanly for the entries without tripping assertions diff --git a/server/src/test/java/org/elasticsearch/snapshots/SnapshotsInProgressSerializationTests.java b/server/src/test/java/org/elasticsearch/snapshots/SnapshotsInProgressSerializationTests.java index b5ab6be586670..74277954b8002 100644 --- a/server/src/test/java/org/elasticsearch/snapshots/SnapshotsInProgressSerializationTests.java +++ b/server/src/test/java/org/elasticsearch/snapshots/SnapshotsInProgressSerializationTests.java @@ -523,8 +523,15 @@ public void testXContent() throws IOException { } public static State randomState(Map shards) { - return SnapshotsInProgress.completed(shards.values()) - ? randomFrom(State.SUCCESS, State.FAILED) - : randomFrom(State.STARTED, State.INIT, State.ABORTED); + if (SnapshotsInProgress.completed(shards.values())) { + return randomFrom(State.SUCCESS, State.FAILED); + } + if (shards.values() + .stream() + .map(SnapshotsInProgress.ShardSnapshotStatus::state) + .allMatch(st -> st.completed() || st == ShardState.ABORTED)) { + return State.ABORTED; + } + return randomFrom(State.STARTED, State.INIT); } }