Skip to content

Commit cc6a4bb

Browse files
authored
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.
1 parent 0b6a3cd commit cc6a4bb

File tree

5 files changed

+80
-1
lines changed

5 files changed

+80
-1
lines changed

docs/changelog/124841.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 124841
2+
summary: Pass `IndexReshardingMetadata` over the wire
3+
area: Distributed
4+
type: bug
5+
issues: []

server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.elasticsearch.cluster.metadata.IndexGraveyard;
2323
import org.elasticsearch.cluster.metadata.IndexGraveyardTests;
2424
import org.elasticsearch.cluster.metadata.IndexMetadata;
25+
import org.elasticsearch.cluster.metadata.IndexReshardingMetadata;
2526
import org.elasticsearch.cluster.metadata.IndexTemplateMetadata;
2627
import org.elasticsearch.cluster.metadata.Metadata;
2728
import org.elasticsearch.cluster.metadata.NodesShutdownMetadata;
@@ -586,13 +587,18 @@ public IndexMetadata randomCreate(String name) {
586587
for (int i = 0; i < aliasCount; i++) {
587588
builder.putAlias(randomAlias());
588589
}
590+
if (randomBoolean()) {
591+
builder.reshardingMetadata(
592+
IndexReshardingMetadata.newSplitByMultiple(builder.numberOfShards(), randomIntBetween(2, 5))
593+
);
594+
}
589595
return builder.build();
590596
}
591597

592598
@Override
593599
public IndexMetadata randomChange(IndexMetadata part) {
594600
IndexMetadata.Builder builder = IndexMetadata.builder(part);
595-
switch (randomIntBetween(0, 3)) {
601+
switch (randomIntBetween(0, 4)) {
596602
case 0:
597603
builder.settings(Settings.builder().put(part.getSettings()).put(randomSettings(Settings.EMPTY)));
598604
break;
@@ -609,6 +615,15 @@ public IndexMetadata randomChange(IndexMetadata part) {
609615
case 3:
610616
builder.putInferenceFields(randomInferenceFields());
611617
break;
618+
case 4:
619+
if (randomBoolean()) {
620+
builder.reshardingMetadata(
621+
IndexReshardingMetadata.newSplitByMultiple(builder.numberOfShards(), randomIntBetween(2, 5))
622+
);
623+
} else {
624+
builder.reshardingMetadata(null);
625+
}
626+
break;
612627
default:
613628
throw new IllegalArgumentException("Shouldn't be here");
614629
}

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ static TransportVersion def(int id) {
186186
public static final TransportVersion INFERENCE_CONTEXT = def(9_028_0_00);
187187
public static final TransportVersion ML_INFERENCE_DEEPSEEK = def(9_029_00_0);
188188
public static final TransportVersion ESQL_FAILURE_FROM_REMOTE = def(9_030_00_0);
189+
public static final TransportVersion INDEX_RESHARDING_METADATA = def(9_031_0_00);
189190

190191
/*
191192
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,6 +1424,11 @@ public IndexLongFieldRange getTimeSeriesTimestampRange(DateFieldMapper.DateField
14241424
}
14251425
}
14261426

1427+
@Nullable
1428+
public IndexReshardingMetadata getReshardingMetadata() {
1429+
return reshardingMetadata;
1430+
}
1431+
14271432
@Override
14281433
public boolean equals(Object o) {
14291434
if (this == o) {
@@ -1478,6 +1483,9 @@ public boolean equals(Object o) {
14781483
if (isSystem != that.isSystem) {
14791484
return false;
14801485
}
1486+
if (Objects.equals(reshardingMetadata, that.reshardingMetadata) == false) {
1487+
return false;
1488+
}
14811489
return true;
14821490
}
14831491

@@ -1497,6 +1505,7 @@ public int hashCode() {
14971505
result = 31 * result + rolloverInfos.hashCode();
14981506
result = 31 * result + inferenceFields.hashCode();
14991507
result = 31 * result + Boolean.hashCode(isSystem);
1508+
result = 31 * result + Objects.hashCode(reshardingMetadata);
15001509
return result;
15011510
}
15021511

@@ -1558,6 +1567,7 @@ private static class IndexMetadataDiff implements Diff<IndexMetadata> {
15581567
private final IndexMetadataStats stats;
15591568
private final Double indexWriteLoadForecast;
15601569
private final Long shardSizeInBytesForecast;
1570+
private final IndexReshardingMetadata reshardingMetadata;
15611571

15621572
IndexMetadataDiff(IndexMetadata before, IndexMetadata after) {
15631573
index = after.index.getName();
@@ -1597,6 +1607,7 @@ private static class IndexMetadataDiff implements Diff<IndexMetadata> {
15971607
stats = after.stats;
15981608
indexWriteLoadForecast = after.writeLoadForecast;
15991609
shardSizeInBytesForecast = after.shardSizeInBytesForecast;
1610+
reshardingMetadata = after.reshardingMetadata;
16001611
}
16011612

16021613
private static final DiffableUtils.DiffableValueReader<String, AliasMetadata> ALIAS_METADATA_DIFF_VALUE_READER =
@@ -1669,6 +1680,11 @@ private static class IndexMetadataDiff implements Diff<IndexMetadata> {
16691680
} else {
16701681
eventIngestedRange = IndexLongFieldRange.UNKNOWN;
16711682
}
1683+
if (in.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
1684+
reshardingMetadata = in.readOptionalWriteable(IndexReshardingMetadata::new);
1685+
} else {
1686+
reshardingMetadata = null;
1687+
}
16721688
}
16731689

16741690
@Override
@@ -1707,6 +1723,9 @@ public void writeTo(StreamOutput out) throws IOException {
17071723
out.writeOptionalLong(shardSizeInBytesForecast);
17081724
}
17091725
eventIngestedRange.writeTo(out);
1726+
if (out.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
1727+
out.writeOptionalWriteable(reshardingMetadata);
1728+
}
17101729
}
17111730

17121731
@Override
@@ -1739,6 +1758,7 @@ public IndexMetadata apply(IndexMetadata part) {
17391758
builder.stats(stats);
17401759
builder.indexWriteLoadForecast(indexWriteLoadForecast);
17411760
builder.shardSizeInBytesForecast(shardSizeInBytesForecast);
1761+
builder.reshardingMetadata(reshardingMetadata);
17421762
return builder.build(true);
17431763
}
17441764
}
@@ -1810,6 +1830,9 @@ public static IndexMetadata readFrom(StreamInput in, @Nullable Function<String,
18101830
builder.shardSizeInBytesForecast(in.readOptionalLong());
18111831
}
18121832
builder.eventIngestedRange(IndexLongFieldRange.readFrom(in));
1833+
if (in.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
1834+
builder.reshardingMetadata(in.readOptionalWriteable(IndexReshardingMetadata::new));
1835+
}
18131836
return builder.build(true);
18141837
}
18151838

@@ -1859,6 +1882,9 @@ public void writeTo(StreamOutput out, boolean mappingsAsHash) throws IOException
18591882
out.writeOptionalLong(shardSizeInBytesForecast);
18601883
}
18611884
eventIngestedRange.writeTo(out);
1885+
if (out.getTransportVersion().onOrAfter(TransportVersions.INDEX_RESHARDING_METADATA)) {
1886+
out.writeOptionalWriteable(reshardingMetadata);
1887+
}
18621888
}
18631889

18641890
@Override

server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package org.elasticsearch.cluster.metadata;
1111

12+
import org.elasticsearch.TransportVersion;
13+
import org.elasticsearch.TransportVersions;
1214
import org.elasticsearch.action.admin.indices.rollover.MaxAgeCondition;
1315
import org.elasticsearch.action.admin.indices.rollover.MaxDocsCondition;
1416
import org.elasticsearch.action.admin.indices.rollover.MaxPrimaryShardDocsCondition;
@@ -166,6 +168,7 @@ public void testIndexMetadataSerialization() throws IOException {
166168
assertEquals(metadata.getForecastedWriteLoad(), fromXContentMeta.getForecastedWriteLoad());
167169
assertEquals(metadata.getForecastedShardSizeInBytes(), fromXContentMeta.getForecastedShardSizeInBytes());
168170
assertEquals(metadata.getInferenceFields(), fromXContentMeta.getInferenceFields());
171+
assertEquals(metadata.getReshardingMetadata(), fromXContentMeta.getReshardingMetadata());
169172

170173
final BytesStreamOutput out = new BytesStreamOutput();
171174
metadata.writeTo(out);
@@ -192,6 +195,7 @@ public void testIndexMetadataSerialization() throws IOException {
192195
assertEquals(metadata.getForecastedShardSizeInBytes(), deserialized.getForecastedShardSizeInBytes());
193196
assertEquals(metadata.getInferenceFields(), deserialized.getInferenceFields());
194197
assertEquals(metadata.getEventIngestedRange(), deserialized.getEventIngestedRange());
198+
assertEquals(metadata.getReshardingMetadata(), deserialized.getReshardingMetadata());
195199
}
196200
}
197201

@@ -676,6 +680,34 @@ public void testInferenceFieldMetadata() {
676680
assertThat(idxMeta2.getInferenceFields(), equalTo(dynamicFields));
677681
}
678682

683+
public void testReshardingBWCSerialization() throws IOException {
684+
final int numShards = randomIntBetween(1, 8);
685+
final var settings = indexSettings(IndexVersion.current(), numShards, 0);
686+
final var reshardingMetadata = IndexReshardingMetadata.newSplitByMultiple(numShards, randomIntBetween(2, 5));
687+
IndexMetadata idx = IndexMetadata.builder("test").settings(settings).reshardingMetadata(reshardingMetadata).build();
688+
689+
// the version prior to TransportVersions.INDEX_RESHARDING_METADATA
690+
final var version = TransportVersions.ESQL_FAILURE_FROM_REMOTE;
691+
// should round trip
692+
final var deserialized = roundTripWithVersion(idx, version);
693+
694+
// but be missing resharding metadata
695+
assertNull(deserialized.getReshardingMetadata());
696+
// but otherwise be equal
697+
assertEquals(idx, IndexMetadata.builder(deserialized).reshardingMetadata(reshardingMetadata).build());
698+
}
699+
700+
private IndexMetadata roundTripWithVersion(IndexMetadata indexMetadata, TransportVersion version) throws IOException {
701+
try (BytesStreamOutput out = new BytesStreamOutput()) {
702+
out.setTransportVersion(version);
703+
indexMetadata.writeTo(out);
704+
try (StreamInput in = new NamedWriteableAwareStreamInput(out.bytes().streamInput(), writableRegistry())) {
705+
in.setTransportVersion(version);
706+
return IndexMetadata.readFrom(in);
707+
}
708+
}
709+
}
710+
679711
private static Settings indexSettingsWithDataTier(String dataTier) {
680712
return indexSettings(IndexVersion.current(), 1, 0).put(DataTier.TIER_PREFERENCE, dataTier).build();
681713
}

0 commit comments

Comments
 (0)