Skip to content

Commit d3feb06

Browse files
committed
Clear templates before Adding; Use NamedWriteableAwareStreamInput for RemoteCustomMetadata
Signed-off-by: Sooraj Sinha <[email protected]>
1 parent 47feca7 commit d3feb06

File tree

5 files changed

+129
-5
lines changed

5 files changed

+129
-5
lines changed

server/src/main/java/org/opensearch/cluster/metadata/Metadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,11 @@ public Builder templates(Map<String, IndexTemplateMetadata> templates) {
12861286
return this;
12871287
}
12881288

1289+
public Builder removeAllTemplates() {
1290+
this.templates.clear();
1291+
return this;
1292+
}
1293+
12891294
public Builder templates(TemplatesMetadata templatesMetadata) {
12901295
this.templates.putAll(templatesMetadata.getTemplates());
12911296
return this;

server/src/main/java/org/opensearch/gateway/remote/RemoteClusterStateService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,7 @@ private ClusterState readClusterStateInParallel(
12321232
metadataBuilder.transientSettings((Settings) remoteReadResult.getObj());
12331233
break;
12341234
case TEMPLATES_METADATA:
1235+
metadataBuilder.removeAllTemplates();
12351236
metadataBuilder.templates((TemplatesMetadata) remoteReadResult.getObj());
12361237
break;
12371238
case HASHES_OF_CONSISTENT_SETTINGS:

server/src/main/java/org/opensearch/gateway/remote/model/RemoteCustomMetadata.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.opensearch.common.io.Streams;
1313
import org.opensearch.common.remote.AbstractRemoteWritableBlobEntity;
1414
import org.opensearch.common.remote.BlobPathParameters;
15+
import org.opensearch.core.common.io.stream.NamedWriteableAwareStreamInput;
1516
import org.opensearch.core.common.io.stream.NamedWriteableRegistry;
1617
import org.opensearch.core.common.io.stream.StreamInput;
1718
import org.opensearch.core.compress.Compressor;
@@ -122,6 +123,7 @@ public UploadedMetadata getUploadedMetadata() {
122123

123124
public static Custom readFrom(StreamInput streamInput, NamedWriteableRegistry namedWriteableRegistry, String customType)
124125
throws IOException {
125-
return namedWriteableRegistry.getReader(Custom.class, customType).read(streamInput);
126+
StreamInput in = new NamedWriteableAwareStreamInput(streamInput, namedWriteableRegistry);
127+
return namedWriteableRegistry.getReader(Custom.class, customType).read(in);
126128
}
127129
}

server/src/test/java/org/opensearch/cluster/metadata/MetadataTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,48 @@ public void testIsSegmentReplicationDisabled() {
14821482
assertFalse(metadata.isSegmentReplicationEnabled(indexName));
14831483
}
14841484

1485+
public void testTemplatesMetadata() {
1486+
TemplatesMetadata templatesMetadata1 = TemplatesMetadata.builder()
1487+
.put(
1488+
IndexTemplateMetadata.builder("template_1")
1489+
.patterns(Arrays.asList("bar-*", "foo-*"))
1490+
.settings(Settings.builder().put("random_index_setting_" + randomAlphaOfLength(3), randomAlphaOfLength(5)).build())
1491+
.build()
1492+
)
1493+
.build();
1494+
Metadata metadata1 = Metadata.builder().templates(templatesMetadata1).build();
1495+
assertThat(metadata1.templates(), is(templatesMetadata1.getTemplates()));
1496+
1497+
TemplatesMetadata templatesMetadata2 = TemplatesMetadata.builder()
1498+
.put(
1499+
IndexTemplateMetadata.builder("template_2")
1500+
.patterns(Arrays.asList("bar-*", "foo-*"))
1501+
.settings(Settings.builder().put("random_index_setting_" + randomAlphaOfLength(3), randomAlphaOfLength(5)).build())
1502+
.build()
1503+
)
1504+
.build();
1505+
1506+
Metadata metadata2 = Metadata.builder(metadata1).templates(templatesMetadata2).build();
1507+
1508+
Map<String, IndexTemplateMetadata> allTemplates = new HashMap<>(templatesMetadata1.getTemplates());
1509+
allTemplates.putAll(templatesMetadata2.getTemplates());
1510+
1511+
assertThat(metadata2.templates(), is(allTemplates));
1512+
1513+
TemplatesMetadata templatesMetadata3 = TemplatesMetadata.builder()
1514+
.put(
1515+
IndexTemplateMetadata.builder("template_3")
1516+
.patterns(Arrays.asList("bar-*", "foo-*"))
1517+
.settings(Settings.builder().put("random_index_setting_" + randomAlphaOfLength(3), randomAlphaOfLength(5)).build())
1518+
.build()
1519+
)
1520+
.build();
1521+
1522+
Metadata metadata3 = Metadata.builder(metadata2).removeAllTemplates().templates(templatesMetadata3).build();
1523+
1524+
assertThat(metadata3.templates(), is(templatesMetadata3.getTemplates()));
1525+
}
1526+
14851527
public static Metadata randomMetadata() {
14861528
Metadata.Builder md = Metadata.builder()
14871529
.put(buildIndexMetadata("index", "alias", randomBoolean() ? null : randomBoolean()).build(), randomBoolean())

server/src/test/java/org/opensearch/gateway/remote/model/RemoteCustomMetadataTests.java

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package org.opensearch.gateway.remote.model;
1010

11+
import org.opensearch.Version;
12+
import org.opensearch.cluster.ClusterModule;
1113
import org.opensearch.cluster.metadata.IndexGraveyard;
1214
import org.opensearch.cluster.metadata.Metadata.Custom;
1315
import org.opensearch.common.blobstore.BlobPath;
@@ -16,13 +18,20 @@
1618
import org.opensearch.common.settings.ClusterSettings;
1719
import org.opensearch.common.settings.Settings;
1820
import org.opensearch.core.common.io.stream.NamedWriteableRegistry;
21+
import org.opensearch.core.common.io.stream.NamedWriteableRegistry.Entry;
22+
import org.opensearch.core.common.io.stream.StreamInput;
23+
import org.opensearch.core.common.io.stream.StreamOutput;
1924
import org.opensearch.core.compress.Compressor;
2025
import org.opensearch.core.compress.NoneCompressor;
2126
import org.opensearch.core.index.Index;
27+
import org.opensearch.core.xcontent.XContentBuilder;
2228
import org.opensearch.gateway.remote.ClusterMetadataManifest.UploadedMetadata;
2329
import org.opensearch.gateway.remote.RemoteClusterStateUtils;
2430
import org.opensearch.index.remote.RemoteStoreUtils;
2531
import org.opensearch.index.translog.transfer.BlobStoreTransferService;
32+
import org.opensearch.persistent.PersistentTaskParams;
33+
import org.opensearch.persistent.PersistentTasksCustomMetadata;
34+
import org.opensearch.persistent.PersistentTasksCustomMetadata.Assignment;
2635
import org.opensearch.repositories.blobstore.BlobStoreRepository;
2736
import org.opensearch.test.OpenSearchTestCase;
2837
import org.opensearch.threadpool.TestThreadPool;
@@ -33,6 +42,7 @@
3342
import java.io.IOException;
3443
import java.io.InputStream;
3544
import java.util.List;
45+
import java.util.Objects;
3646

3747
import static org.opensearch.gateway.remote.RemoteClusterStateUtils.GLOBAL_METADATA_CURRENT_CODEC_VERSION;
3848
import static org.opensearch.gateway.remote.model.RemoteCustomMetadata.CUSTOM_DELIMITER;
@@ -216,24 +226,88 @@ public void testGetUploadedMetadata() throws IOException {
216226

217227
public void testSerDe() throws IOException {
218228
Custom customMetadata = getCustomMetadata();
229+
verifySerDe(customMetadata, IndexGraveyard.TYPE);
230+
}
231+
232+
public void testSerDeForPersistentTasks() throws IOException {
233+
Custom customMetadata = getPersistentTasksMetadata();
234+
verifySerDe(customMetadata, PersistentTasksCustomMetadata.TYPE);
235+
}
236+
237+
private void verifySerDe(Custom objectToUpload, String objectType) throws IOException {
219238
RemoteCustomMetadata remoteObjectForUpload = new RemoteCustomMetadata(
220-
customMetadata,
221-
IndexGraveyard.TYPE,
239+
objectToUpload,
240+
objectType,
222241
METADATA_VERSION,
223242
clusterUUID,
224243
compressor,
225-
namedWriteableRegistry
244+
customWritableRegistry()
226245
);
227246
try (InputStream inputStream = remoteObjectForUpload.serialize()) {
228247
remoteObjectForUpload.setFullBlobName(BlobPath.cleanPath());
229248
assertThat(inputStream.available(), greaterThan(0));
230249
Custom readCustomMetadata = remoteObjectForUpload.deserialize(inputStream);
231-
assertThat(readCustomMetadata, is(customMetadata));
250+
assertThat(readCustomMetadata, is(objectToUpload));
232251
}
233252
}
234253

254+
private NamedWriteableRegistry customWritableRegistry() {
255+
List<Entry> entries = ClusterModule.getNamedWriteables();
256+
entries.add(new Entry(PersistentTaskParams.class, TestPersistentTaskParams.PARAM_NAME, TestPersistentTaskParams::new));
257+
return new NamedWriteableRegistry(entries);
258+
}
259+
235260
public static Custom getCustomMetadata() {
236261
return IndexGraveyard.builder().addTombstone(new Index("test-index", "3q2423")).build();
237262
}
238263

264+
private static Custom getPersistentTasksMetadata() {
265+
return PersistentTasksCustomMetadata.builder()
266+
.addTask("_task_1", "testTaskName", new TestPersistentTaskParams("task param data"), new Assignment(null, "_reason"))
267+
.build();
268+
}
269+
270+
public static class TestPersistentTaskParams implements PersistentTaskParams {
271+
272+
private static final String PARAM_NAME = "testTaskName";
273+
274+
private final String data;
275+
276+
public TestPersistentTaskParams(String data) {
277+
this.data = data;
278+
}
279+
280+
public TestPersistentTaskParams(StreamInput in) throws IOException {
281+
this(in.readString());
282+
}
283+
284+
@Override
285+
public String getWriteableName() {
286+
return PARAM_NAME;
287+
}
288+
289+
@Override
290+
public Version getMinimalSupportedVersion() {
291+
return Version.V_2_13_0;
292+
}
293+
294+
@Override
295+
public void writeTo(StreamOutput out) throws IOException {
296+
out.writeString(data);
297+
}
298+
299+
@Override
300+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
301+
return builder.startObject().field("data_field", data);
302+
}
303+
304+
@Override
305+
public boolean equals(Object o) {
306+
if (this == o) return true;
307+
if (o == null || getClass() != o.getClass()) return false;
308+
TestPersistentTaskParams that = (TestPersistentTaskParams) o;
309+
return Objects.equals(data, that.data);
310+
}
311+
}
312+
239313
}

0 commit comments

Comments
 (0)