Skip to content

Commit 501a702

Browse files
authored
Clear templates before Adding; Use NamedWriteableAwareStreamInput for RemoteCustomMetadata; Correct the check for deciding upload of HashesOfConsistentSettings (#14513)
* Clear templates before Adding; Use NamedWriteableAwareStreamInput for RemoteCustomMetadata * Correct the check for deciding upload of hashes of consistent settings Signed-off-by: Sooraj Sinha <soosinha@amazon.com>
1 parent e82b432 commit 501a702

File tree

6 files changed

+239
-11
lines changed

6 files changed

+239
-11
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,7 @@ public Builder templates(Map<String, IndexTemplateMetadata> templates) {
12871287
}
12881288

12891289
public Builder templates(TemplatesMetadata templatesMetadata) {
1290+
this.templates.clear();
12901291
this.templates.putAll(templatesMetadata.getTemplates());
12911292
return this;
12921293
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
356356
&& clusterState.getNodes().delta(previousClusterState.getNodes()).hasChanges();
357357
final boolean updateClusterBlocks = isPublicationEnabled && !clusterState.blocks().equals(previousClusterState.blocks());
358358
final boolean updateHashesOfConsistentSettings = isPublicationEnabled
359-
|| Metadata.isHashesOfConsistentSettingsEqual(previousClusterState.metadata(), clusterState.metadata()) == false;
359+
&& Metadata.isHashesOfConsistentSettingsEqual(previousClusterState.metadata(), clusterState.metadata()) == false;
360360

361361
uploadedMetadataResults = writeMetadataInParallel(
362362
clusterState,
@@ -476,7 +476,8 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
476476
return manifestDetails;
477477
}
478478

479-
private UploadedMetadataResults writeMetadataInParallel(
479+
// package private for testing
480+
UploadedMetadataResults writeMetadataInParallel(
480481
ClusterState clusterState,
481482
List<IndexMetadata> indexToUpload,
482483
Map<String, IndexMetadata> prevIndexMetadataByName,

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

+4-1
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,8 @@ 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+
try (StreamInput in = new NamedWriteableAwareStreamInput(streamInput, namedWriteableRegistry)) {
127+
return namedWriteableRegistry.getReader(Custom.class, customType).read(in);
128+
}
126129
}
127130
}

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

+27
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,33 @@ 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+
assertThat(metadata2.templates(), is(templatesMetadata2.getTemplates()));
1509+
1510+
}
1511+
14851512
public static Metadata randomMetadata() {
14861513
Metadata.Builder md = Metadata.builder()
14871514
.put(buildIndexMetadata("index", "alias", randomBoolean() ? null : randomBoolean()).build(), randomBoolean())

server/src/test/java/org/opensearch/gateway/remote/RemoteClusterStateServiceTests.java

+121-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.opensearch.cluster.metadata.IndexTemplateMetadata;
2121
import org.opensearch.cluster.metadata.Metadata;
2222
import org.opensearch.cluster.metadata.TemplatesMetadata;
23+
import org.opensearch.cluster.node.DiscoveryNode;
2324
import org.opensearch.cluster.node.DiscoveryNodes;
2425
import org.opensearch.cluster.routing.RoutingTable;
2526
import org.opensearch.cluster.routing.remote.InternalRemoteRoutingTableService;
@@ -92,6 +93,7 @@
9293

9394
import org.mockito.ArgumentCaptor;
9495
import org.mockito.ArgumentMatchers;
96+
import org.mockito.Mockito;
9597

9698
import static java.util.stream.Collectors.toList;
9799
import static org.opensearch.common.util.FeatureFlags.REMOTE_PUBLICATION_EXPERIMENTAL;
@@ -111,13 +113,15 @@
111113
import static org.opensearch.node.remotestore.RemoteStoreNodeAttribute.REMOTE_STORE_REPOSITORY_SETTINGS_ATTRIBUTE_KEY_PREFIX;
112114
import static org.opensearch.node.remotestore.RemoteStoreNodeAttribute.REMOTE_STORE_REPOSITORY_TYPE_ATTRIBUTE_KEY_FORMAT;
113115
import static org.opensearch.node.remotestore.RemoteStoreNodeAttribute.REMOTE_STORE_ROUTING_TABLE_REPOSITORY_NAME_ATTRIBUTE_KEY;
116+
import static org.hamcrest.Matchers.anEmptyMap;
114117
import static org.hamcrest.Matchers.equalTo;
115118
import static org.hamcrest.Matchers.is;
116119
import static org.hamcrest.Matchers.not;
117120
import static org.hamcrest.Matchers.notNullValue;
118121
import static org.hamcrest.Matchers.nullValue;
119122
import static org.mockito.ArgumentMatchers.any;
120123
import static org.mockito.ArgumentMatchers.anyString;
124+
import static org.mockito.ArgumentMatchers.eq;
121125
import static org.mockito.Mockito.doAnswer;
122126
import static org.mockito.Mockito.doThrow;
123127
import static org.mockito.Mockito.mock;
@@ -518,11 +522,13 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
518522
final ClusterMetadataManifest previousManifest = ClusterMetadataManifest.builder().indices(Collections.emptyList()).build();
519523

520524
remoteClusterStateService.start();
521-
final ClusterMetadataManifest manifest = remoteClusterStateService.writeIncrementalMetadata(
525+
final RemoteClusterStateService rcssSpy = Mockito.spy(remoteClusterStateService);
526+
final RemoteClusterStateManifestInfo manifestInfo = rcssSpy.writeIncrementalMetadata(
522527
previousClusterState,
523528
clusterState,
524529
previousManifest
525-
).getClusterMetadataManifest();
530+
);
531+
final ClusterMetadataManifest manifest = manifestInfo.getClusterMetadataManifest();
526532
final UploadedIndexMetadata uploadedIndexMetadata = new UploadedIndexMetadata("test-index", "index-uuid", "metadata-filename__2");
527533
final List<UploadedIndexMetadata> indices = List.of(uploadedIndexMetadata);
528534

@@ -535,6 +541,24 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
535541
.previousClusterUUID("prev-cluster-uuid")
536542
.build();
537543

544+
Mockito.verify(rcssSpy)
545+
.writeMetadataInParallel(
546+
eq(clusterState),
547+
eq(new ArrayList<IndexMetadata>(clusterState.metadata().indices().values())),
548+
eq(Collections.singletonMap(indices.get(0).getIndexName(), null)),
549+
eq(clusterState.metadata().customs()),
550+
eq(true),
551+
eq(true),
552+
eq(true),
553+
eq(false),
554+
eq(false),
555+
eq(false),
556+
eq(Collections.emptyMap()),
557+
eq(false),
558+
eq(Collections.emptyList())
559+
);
560+
561+
assertThat(manifestInfo.getManifestFileName(), notNullValue());
538562
assertThat(manifest.getIndices().size(), is(1));
539563
assertThat(manifest.getIndices().get(0).getIndexName(), is(uploadedIndexMetadata.getIndexName()));
540564
assertThat(manifest.getIndices().get(0).getIndexUUID(), is(uploadedIndexMetadata.getIndexUUID()));
@@ -543,6 +567,95 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
543567
assertThat(manifest.getStateVersion(), is(expectedManifest.getStateVersion()));
544568
assertThat(manifest.getClusterUUID(), is(expectedManifest.getClusterUUID()));
545569
assertThat(manifest.getStateUUID(), is(expectedManifest.getStateUUID()));
570+
assertThat(manifest.getHashesOfConsistentSettings(), nullValue());
571+
assertThat(manifest.getDiscoveryNodesMetadata(), nullValue());
572+
assertThat(manifest.getClusterBlocksMetadata(), nullValue());
573+
assertThat(manifest.getClusterStateCustomMap(), anEmptyMap());
574+
assertThat(manifest.getTransientSettingsMetadata(), nullValue());
575+
assertThat(manifest.getTemplatesMetadata(), notNullValue());
576+
assertThat(manifest.getCoordinationMetadata(), notNullValue());
577+
assertThat(manifest.getCustomMetadataMap().size(), is(2));
578+
assertThat(manifest.getIndicesRouting().size(), is(0));
579+
}
580+
581+
public void testWriteIncrementalMetadataSuccessWhenPublicationEnabled() throws IOException {
582+
publicationEnabled = true;
583+
Settings nodeSettings = Settings.builder().put(REMOTE_PUBLICATION_EXPERIMENTAL, publicationEnabled).build();
584+
FeatureFlags.initializeFeatureFlags(nodeSettings);
585+
remoteClusterStateService = new RemoteClusterStateService(
586+
"test-node-id",
587+
repositoriesServiceSupplier,
588+
settings,
589+
clusterService,
590+
() -> 0L,
591+
threadPool,
592+
List.of(new RemoteIndexPathUploader(threadPool, settings, repositoriesServiceSupplier, clusterSettings)),
593+
writableRegistry()
594+
);
595+
final ClusterState clusterState = generateClusterStateWithOneIndex().nodes(nodesWithLocalNodeClusterManager()).build();
596+
mockBlobStoreObjects();
597+
final CoordinationMetadata coordinationMetadata = CoordinationMetadata.builder().term(1L).build();
598+
final ClusterState previousClusterState = ClusterState.builder(ClusterName.DEFAULT)
599+
.metadata(Metadata.builder().coordinationMetadata(coordinationMetadata))
600+
.build();
601+
602+
final ClusterMetadataManifest previousManifest = ClusterMetadataManifest.builder().indices(Collections.emptyList()).build();
603+
604+
remoteClusterStateService.start();
605+
final RemoteClusterStateService rcssSpy = Mockito.spy(remoteClusterStateService);
606+
final RemoteClusterStateManifestInfo manifestInfo = rcssSpy.writeIncrementalMetadata(
607+
previousClusterState,
608+
clusterState,
609+
previousManifest
610+
);
611+
final ClusterMetadataManifest manifest = manifestInfo.getClusterMetadataManifest();
612+
final UploadedIndexMetadata uploadedIndexMetadata = new UploadedIndexMetadata("test-index", "index-uuid", "metadata-filename__2");
613+
final List<UploadedIndexMetadata> indices = List.of(uploadedIndexMetadata);
614+
615+
final ClusterMetadataManifest expectedManifest = ClusterMetadataManifest.builder()
616+
.indices(indices)
617+
.clusterTerm(1L)
618+
.stateVersion(1L)
619+
.stateUUID("state-uuid")
620+
.clusterUUID("cluster-uuid")
621+
.previousClusterUUID("prev-cluster-uuid")
622+
.build();
623+
624+
Mockito.verify(rcssSpy)
625+
.writeMetadataInParallel(
626+
eq(clusterState),
627+
eq(new ArrayList<IndexMetadata>(clusterState.metadata().indices().values())),
628+
eq(Collections.singletonMap(indices.get(0).getIndexName(), null)),
629+
eq(clusterState.metadata().customs()),
630+
eq(true),
631+
eq(true),
632+
eq(true),
633+
eq(true),
634+
eq(false),
635+
eq(false),
636+
eq(Collections.emptyMap()),
637+
eq(true),
638+
Mockito.anyList()
639+
);
640+
641+
assertThat(manifestInfo.getManifestFileName(), notNullValue());
642+
assertThat(manifest.getIndices().size(), is(1));
643+
assertThat(manifest.getIndices().get(0).getIndexName(), is(uploadedIndexMetadata.getIndexName()));
644+
assertThat(manifest.getIndices().get(0).getIndexUUID(), is(uploadedIndexMetadata.getIndexUUID()));
645+
assertThat(manifest.getIndices().get(0).getUploadedFilename(), notNullValue());
646+
assertThat(manifest.getClusterTerm(), is(expectedManifest.getClusterTerm()));
647+
assertThat(manifest.getStateVersion(), is(expectedManifest.getStateVersion()));
648+
assertThat(manifest.getClusterUUID(), is(expectedManifest.getClusterUUID()));
649+
assertThat(manifest.getStateUUID(), is(expectedManifest.getStateUUID()));
650+
assertThat(manifest.getHashesOfConsistentSettings(), notNullValue());
651+
assertThat(manifest.getDiscoveryNodesMetadata(), notNullValue());
652+
assertThat(manifest.getClusterBlocksMetadata(), nullValue());
653+
assertThat(manifest.getClusterStateCustomMap(), anEmptyMap());
654+
assertThat(manifest.getTransientSettingsMetadata(), nullValue());
655+
assertThat(manifest.getTemplatesMetadata(), notNullValue());
656+
assertThat(manifest.getCoordinationMetadata(), notNullValue());
657+
assertThat(manifest.getCustomMetadataMap().size(), is(2));
658+
assertThat(manifest.getIndicesRouting().size(), is(1));
546659
}
547660

548661
/*
@@ -2012,7 +2125,9 @@ static ClusterState.Builder generateClusterStateWithOneIndex() {
20122125
.build();
20132126
final CoordinationMetadata coordinationMetadata = CoordinationMetadata.builder().term(1L).build();
20142127
final Settings settings = Settings.builder().put("mock-settings", true).build();
2015-
final TemplatesMetadata templatesMetadata = TemplatesMetadata.EMPTY_METADATA;
2128+
final TemplatesMetadata templatesMetadata = TemplatesMetadata.builder()
2129+
.put(IndexTemplateMetadata.builder("template1").settings(idxSettings).patterns(List.of("test*")).build())
2130+
.build();
20162131
final CustomMetadata1 customMetadata1 = new CustomMetadata1("custom-metadata-1");
20172132
return ClusterState.builder(ClusterName.DEFAULT)
20182133
.version(1L)
@@ -2025,14 +2140,16 @@ static ClusterState.Builder generateClusterStateWithOneIndex() {
20252140
.coordinationMetadata(coordinationMetadata)
20262141
.persistentSettings(settings)
20272142
.templates(templatesMetadata)
2143+
.hashesOfConsistentSettings(Map.of("key1", "value1", "key2", "value2"))
20282144
.putCustom(customMetadata1.getWriteableName(), customMetadata1)
20292145
.build()
20302146
)
20312147
.routingTable(RoutingTable.builder().addAsNew(indexMetadata).version(1L).build());
20322148
}
20332149

20342150
static DiscoveryNodes nodesWithLocalNodeClusterManager() {
2035-
return DiscoveryNodes.builder().clusterManagerNodeId("cluster-manager-id").localNodeId("cluster-manager-id").build();
2151+
final DiscoveryNode localNode = new DiscoveryNode("cluster-manager-id", buildNewFakeTransportAddress(), Version.CURRENT);
2152+
return DiscoveryNodes.builder().clusterManagerNodeId("cluster-manager-id").localNodeId("cluster-manager-id").add(localNode).build();
20362153
}
20372154

20382155
private static class CustomMetadata1 extends TestCustomMetadata {

0 commit comments

Comments
 (0)