Pass IndexReshardingMetadata over the wire (#124841)

* Pass IndexReshardingMetadata over the wire

When I introduced IndexReshardingMetadata I inadvertently
only covered local serialization. It was not getting sent or
received over the wire. This fixes that.
This commit is contained in:
Brendan Cully 2025-03-17 11:35:35 -07:00 committed by GitHub
parent 0b6a3cd138
commit cc6a4bb467
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 80 additions and 1 deletions

View File

@ -0,0 +1,5 @@
pr: 124841
summary: Pass `IndexReshardingMetadata` over the wire
area: Distributed
type: bug
issues: []

View File

@ -22,6 +22,7 @@ import org.elasticsearch.cluster.metadata.DesiredNodesTestCase;
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 class ClusterStateDiffIT extends ESIntegTestCase {
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 class ClusterStateDiffIT extends ESIntegTestCase {
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");
}

View File

@ -186,6 +186,7 @@ public class TransportVersions {
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,

View File

@ -1424,6 +1424,11 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
}
}
@Nullable
public IndexReshardingMetadata getReshardingMetadata() {
return reshardingMetadata;
}
@Override
public boolean equals(Object o) {
if (this == o) {
@ -1478,6 +1483,9 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
if (isSystem != that.isSystem) {
return false;
}
if (Objects.equals(reshardingMetadata, that.reshardingMetadata) == false) {
return false;
}
return true;
}
@ -1497,6 +1505,7 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
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 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
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 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
stats = after.stats;
indexWriteLoadForecast = after.writeLoadForecast;
shardSizeInBytesForecast = after.shardSizeInBytesForecast;
reshardingMetadata = after.reshardingMetadata;
}
private static final DiffableUtils.DiffableValueReader<String, AliasMetadata> ALIAS_METADATA_DIFF_VALUE_READER =
@ -1669,6 +1680,11 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
} 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 class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
out.writeOptionalLong(shardSizeInBytesForecast);
}
eventIngestedRange.writeTo(out);
if (out.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
out.writeOptionalWriteable(reshardingMetadata);
}
}
@Override
@ -1739,6 +1758,7 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
builder.stats(stats);
builder.indexWriteLoadForecast(indexWriteLoadForecast);
builder.shardSizeInBytesForecast(shardSizeInBytesForecast);
builder.reshardingMetadata(reshardingMetadata);
return builder.build(true);
}
}
@ -1810,6 +1830,9 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
builder.shardSizeInBytesForecast(in.readOptionalLong());
}
builder.eventIngestedRange(IndexLongFieldRange.readFrom(in));
if (in.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
builder.reshardingMetadata(in.readOptionalWriteable(IndexReshardingMetadata::new));
}
return builder.build(true);
}
@ -1859,6 +1882,9 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
out.writeOptionalLong(shardSizeInBytesForecast);
}
eventIngestedRange.writeTo(out);
if (out.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
out.writeOptionalWriteable(reshardingMetadata);
}
}
@Override

View File

@ -9,6 +9,8 @@
package org.elasticsearch.cluster.metadata;
import org.elasticsearch.TransportVersion;
import org.elasticsearch.TransportVersions;
import org.elasticsearch.action.admin.indices.rollover.MaxAgeCondition;
import org.elasticsearch.action.admin.indices.rollover.MaxDocsCondition;
import org.elasticsearch.action.admin.indices.rollover.MaxPrimaryShardDocsCondition;
@ -166,6 +168,7 @@ public class IndexMetadataTests extends ESTestCase {
assertEquals(metadata.getForecastedWriteLoad(), fromXContentMeta.getForecastedWriteLoad());
assertEquals(metadata.getForecastedShardSizeInBytes(), fromXContentMeta.getForecastedShardSizeInBytes());
assertEquals(metadata.getInferenceFields(), fromXContentMeta.getInferenceFields());
assertEquals(metadata.getReshardingMetadata(), fromXContentMeta.getReshardingMetadata());
final BytesStreamOutput out = new BytesStreamOutput();
metadata.writeTo(out);
@ -192,6 +195,7 @@ public class IndexMetadataTests extends ESTestCase {
assertEquals(metadata.getForecastedShardSizeInBytes(), deserialized.getForecastedShardSizeInBytes());
assertEquals(metadata.getInferenceFields(), deserialized.getInferenceFields());
assertEquals(metadata.getEventIngestedRange(), deserialized.getEventIngestedRange());
assertEquals(metadata.getReshardingMetadata(), deserialized.getReshardingMetadata());
}
}
@ -676,6 +680,34 @@ public class IndexMetadataTests extends ESTestCase {
assertThat(idxMeta2.getInferenceFields(), equalTo(dynamicFields));
}
public void testReshardingBWCSerialization() throws IOException {
final int numShards = randomIntBetween(1, 8);
final var settings = indexSettings(IndexVersion.current(), numShards, 0);
final var reshardingMetadata = IndexReshardingMetadata.newSplitByMultiple(numShards, randomIntBetween(2, 5));
IndexMetadata idx = IndexMetadata.builder("test").settings(settings).reshardingMetadata(reshardingMetadata).build();
// the version prior to TransportVersions.INDEX_RESHARDING_METADATA
final var version = TransportVersions.ESQL_FAILURE_FROM_REMOTE;
// should round trip
final var deserialized = roundTripWithVersion(idx, version);
// but be missing resharding metadata
assertNull(deserialized.getReshardingMetadata());
// but otherwise be equal
assertEquals(idx, IndexMetadata.builder(deserialized).reshardingMetadata(reshardingMetadata).build());
}
private IndexMetadata roundTripWithVersion(IndexMetadata indexMetadata, TransportVersion version) throws IOException {
try (BytesStreamOutput out = new BytesStreamOutput()) {
out.setTransportVersion(version);
indexMetadata.writeTo(out);
try (StreamInput in = new NamedWriteableAwareStreamInput(out.bytes().streamInput(), writableRegistry())) {
in.setTransportVersion(version);
return IndexMetadata.readFrom(in);
}
}
}
private static Settings indexSettingsWithDataTier(String dataTier) {
return indexSettings(IndexVersion.current(), 1, 0).put(DataTier.TIER_PREFERENCE, dataTier).build();
}