From efb503b7dc49290d3ba15095d5d692e141f3cbf8 Mon Sep 17 00:00:00 2001 From: Oleksandr Kolomiiets Date: Fri, 27 Jun 2025 09:57:29 -0700 Subject: [PATCH 1/2] Delete unowned documents during split --- .../cluster/metadata/IndexReshardingMetadata.java | 14 ++++++++++++++ .../cluster/metadata/IndexReshardingState.java | 13 ++++++++++++- .../cluster/IndicesClusterStateService.java | 4 ++-- 3 files changed, 28 insertions(+), 3 deletions(-) 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..ce582e6ed4122 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java @@ -21,8 +21,11 @@ import java.io.IOException; import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.stream.IntStream; import java.util.stream.Stream; /** @@ -350,8 +353,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 +396,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; } From 426933a3b39875756aeebb34a98548552215ad0c Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Fri, 27 Jun 2025 17:30:46 +0000 Subject: [PATCH 2/2] [CI] Auto commit changes from spotless --- .../elasticsearch/cluster/metadata/IndexReshardingState.java | 3 --- 1 file changed, 3 deletions(-) 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 ce582e6ed4122..5bd0fd23e43ee 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexReshardingState.java @@ -21,11 +21,8 @@ import java.io.IOException; import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Objects; -import java.util.stream.IntStream; import java.util.stream.Stream; /**