Explorar el Código

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.
Brendan Cully hace 7 meses
padre
commit
cc6a4bb467

+ 5 - 0
docs/changelog/124841.yaml

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

+ 16 - 1
server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java

@@ -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");
                 }

+ 1 - 0
server/src/main/java/org/elasticsearch/TransportVersions.java

@@ -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,

+ 26 - 0
server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java

@@ -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

+ 32 - 0
server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java

@@ -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();
     }