diff --git a/docs/changelog/124841.yaml b/docs/changelog/124841.yaml new file mode 100644 index 0000000000000..6f945054224e0 --- /dev/null +++ b/docs/changelog/124841.yaml @@ -0,0 +1,5 @@ +pr: 124841 +summary: Pass `IndexReshardingMetadata` over the wire +area: Distributed +type: bug +issues: [] diff --git a/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java b/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java index 50589785822be..9c9056fcf6326 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java @@ -22,6 +22,7 @@ import org.elasticsearch.cluster.metadata.IndexGraveyard; import org.elasticsearch.cluster.metadata.IndexGraveyardTests; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.IndexReshardingMetadata; import org.elasticsearch.cluster.metadata.IndexTemplateMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.NodesShutdownMetadata; @@ -586,13 +587,18 @@ public IndexMetadata randomCreate(String name) { for (int i = 0; i < aliasCount; i++) { builder.putAlias(randomAlias()); } + if (randomBoolean()) { + builder.reshardingMetadata( + IndexReshardingMetadata.newSplitByMultiple(builder.numberOfShards(), randomIntBetween(2, 5)) + ); + } return builder.build(); } @Override public IndexMetadata randomChange(IndexMetadata part) { IndexMetadata.Builder builder = IndexMetadata.builder(part); - switch (randomIntBetween(0, 3)) { + switch (randomIntBetween(0, 4)) { case 0: builder.settings(Settings.builder().put(part.getSettings()).put(randomSettings(Settings.EMPTY))); break; @@ -609,6 +615,15 @@ public IndexMetadata randomChange(IndexMetadata part) { case 3: builder.putInferenceFields(randomInferenceFields()); break; + case 4: + if (randomBoolean()) { + builder.reshardingMetadata( + IndexReshardingMetadata.newSplitByMultiple(builder.numberOfShards(), randomIntBetween(2, 5)) + ); + } else { + builder.reshardingMetadata(null); + } + break; default: throw new IllegalArgumentException("Shouldn't be here"); } diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 1c49c1e33d3b6..f15283cb33386 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -186,6 +186,7 @@ static TransportVersion def(int id) { public static final TransportVersion INFERENCE_CONTEXT = def(9_028_0_00); public static final TransportVersion ML_INFERENCE_DEEPSEEK = def(9_029_00_0); public static final TransportVersion ESQL_FAILURE_FROM_REMOTE = def(9_030_00_0); + public static final TransportVersion INDEX_RESHARDING_METADATA = def(9_031_0_00); /* * STOP! READ THIS FIRST! No, really, diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java index 2b4e48e935c93..4138a6d4cebe5 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java @@ -1424,6 +1424,11 @@ public IndexLongFieldRange getTimeSeriesTimestampRange(DateFieldMapper.DateField } } + @Nullable + public IndexReshardingMetadata getReshardingMetadata() { + return reshardingMetadata; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -1478,6 +1483,9 @@ public boolean equals(Object o) { if (isSystem != that.isSystem) { return false; } + if (Objects.equals(reshardingMetadata, that.reshardingMetadata) == false) { + return false; + } return true; } @@ -1497,6 +1505,7 @@ public int hashCode() { result = 31 * result + rolloverInfos.hashCode(); result = 31 * result + inferenceFields.hashCode(); result = 31 * result + Boolean.hashCode(isSystem); + result = 31 * result + Objects.hashCode(reshardingMetadata); return result; } @@ -1558,6 +1567,7 @@ private static class IndexMetadataDiff implements Diff { private final IndexMetadataStats stats; private final Double indexWriteLoadForecast; private final Long shardSizeInBytesForecast; + private final IndexReshardingMetadata reshardingMetadata; IndexMetadataDiff(IndexMetadata before, IndexMetadata after) { index = after.index.getName(); @@ -1597,6 +1607,7 @@ private static class IndexMetadataDiff implements Diff { stats = after.stats; indexWriteLoadForecast = after.writeLoadForecast; shardSizeInBytesForecast = after.shardSizeInBytesForecast; + reshardingMetadata = after.reshardingMetadata; } private static final DiffableUtils.DiffableValueReader ALIAS_METADATA_DIFF_VALUE_READER = @@ -1669,6 +1680,11 @@ private static class IndexMetadataDiff implements Diff { } else { eventIngestedRange = IndexLongFieldRange.UNKNOWN; } + if (in.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) { + reshardingMetadata = in.readOptionalWriteable(IndexReshardingMetadata::new); + } else { + reshardingMetadata = null; + } } @Override @@ -1707,6 +1723,9 @@ public void writeTo(StreamOutput out) throws IOException { out.writeOptionalLong(shardSizeInBytesForecast); } eventIngestedRange.writeTo(out); + if (out.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) { + out.writeOptionalWriteable(reshardingMetadata); + } } @Override @@ -1739,6 +1758,7 @@ public IndexMetadata apply(IndexMetadata part) { builder.stats(stats); builder.indexWriteLoadForecast(indexWriteLoadForecast); builder.shardSizeInBytesForecast(shardSizeInBytesForecast); + builder.reshardingMetadata(reshardingMetadata); return builder.build(true); } } @@ -1810,6 +1830,9 @@ public static IndexMetadata readFrom(StreamInput in, @Nullable Function