diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingMetadata.java index 4ec325c42f3f3..78669ffbd8f93 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingMetadata.java @@ -207,6 +207,10 @@ public static IndexReshardingMetadata newSplitByMultiple(int shardCount, int mul return new IndexReshardingMetadata(IndexReshardingState.Split.newSplitByMultiple(shardCount, multiple)); } + public static boolean isSplitSource(ShardId shardId, @Nullable IndexReshardingMetadata reshardingMetadata) { + return reshardingMetadata != null && reshardingMetadata.isSplit() && reshardingMetadata.getSplit().isSourceShard(shardId.id()); + } + public static boolean isSplitTarget(ShardId shardId, @Nullable IndexReshardingMetadata reshardingMetadata) { return reshardingMetadata != null && reshardingMetadata.isSplit() && reshardingMetadata.getSplit().isTargetShard(shardId.id()); } @@ -221,6 +225,16 @@ public IndexReshardingMetadata transitionSplitTargetToNewState( return new IndexReshardingMetadata(builder.build()); } + public IndexReshardingMetadata transitionSplitSourceToNewState( + ShardId shardId, + IndexReshardingState.Split.SourceShardState newSourceState + ) { + assert state instanceof IndexReshardingState.Split; + IndexReshardingState.Split.Builder builder = new IndexReshardingState.Split.Builder((IndexReshardingState.Split) state); + builder.setSourceShardState(shardId.getId(), newSourceState); + return new IndexReshardingMetadata(builder.build()); + } + /** * @return the split state of this metadata block, or throw IllegalArgumentException if this metadata doesn't represent a split */ diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java index 76f8f58d0b3e4..5bd0fd23e43ee 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java @@ -350,8 +350,12 @@ public SourceShardState getSourceShardState(int shardNum) { return sourceShards[shardNum]; } + public boolean isSourceShard(int shardId) { + return shardId < shardCountBefore(); + } + public boolean isTargetShard(int shardId) { - return shardId >= shardCountBefore(); + return isSourceShard(shardId) == false; } /** @@ -389,6 +393,10 @@ public Stream targetStates() { return Arrays.stream(targetShards); } + public Stream sourceStates() { + return Arrays.stream(sourceShards); + } + /** * Check whether all target shards for the given source shard are done. * @param shardNum a source shard index greater than or equal to 0 and less than the original shard count diff --git a/server/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java b/server/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java index f1cb74e6d0e42..83be37d553fef 100644 --- a/server/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java +++ b/server/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java @@ -1004,7 +1004,7 @@ private static DiscoveryNode findSourceNodeForReshardSplitRecovery( ShardRouting sourceShardRouting = routingTable.shardRoutingTable(sourceShardId).primaryShard(); if (sourceShardRouting.active() == false) { - assert false : sourceShardRouting; + assert false : sourceShardRouting.shortSummary(); logger.trace("can't find reshard split source node because source shard {} is not active.", sourceShardRouting); return null; } @@ -1014,7 +1014,7 @@ private static DiscoveryNode findSourceNodeForReshardSplitRecovery( assert false : "Source node for reshard does not exist: " + sourceShardRouting.currentNodeId(); logger.trace( "can't find reshard split source node because source shard {} is assigned to an unknown node.", - sourceShardRouting + sourceShardRouting.shortSummary() ); return null; }