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:
parent
0b6a3cd138
commit
cc6a4bb467
|
@ -0,0 +1,5 @@
|
|||
pr: 124841
|
||||
summary: Pass `IndexReshardingMetadata` over the wire
|
||||
area: Distributed
|
||||
type: bug
|
||||
issues: []
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue