20
20
import org .opensearch .cluster .metadata .IndexTemplateMetadata ;
21
21
import org .opensearch .cluster .metadata .Metadata ;
22
22
import org .opensearch .cluster .metadata .TemplatesMetadata ;
23
+ import org .opensearch .cluster .node .DiscoveryNode ;
23
24
import org .opensearch .cluster .node .DiscoveryNodes ;
24
25
import org .opensearch .cluster .routing .RoutingTable ;
25
26
import org .opensearch .cluster .routing .remote .InternalRemoteRoutingTableService ;
92
93
93
94
import org .mockito .ArgumentCaptor ;
94
95
import org .mockito .ArgumentMatchers ;
96
+ import org .mockito .Mockito ;
95
97
96
98
import static java .util .stream .Collectors .toList ;
97
99
import static org .opensearch .common .util .FeatureFlags .REMOTE_PUBLICATION_EXPERIMENTAL ;
111
113
import static org .opensearch .node .remotestore .RemoteStoreNodeAttribute .REMOTE_STORE_REPOSITORY_SETTINGS_ATTRIBUTE_KEY_PREFIX ;
112
114
import static org .opensearch .node .remotestore .RemoteStoreNodeAttribute .REMOTE_STORE_REPOSITORY_TYPE_ATTRIBUTE_KEY_FORMAT ;
113
115
import static org .opensearch .node .remotestore .RemoteStoreNodeAttribute .REMOTE_STORE_ROUTING_TABLE_REPOSITORY_NAME_ATTRIBUTE_KEY ;
116
+ import static org .hamcrest .Matchers .anEmptyMap ;
114
117
import static org .hamcrest .Matchers .equalTo ;
115
118
import static org .hamcrest .Matchers .is ;
116
119
import static org .hamcrest .Matchers .not ;
117
120
import static org .hamcrest .Matchers .notNullValue ;
118
121
import static org .hamcrest .Matchers .nullValue ;
119
122
import static org .mockito .ArgumentMatchers .any ;
120
123
import static org .mockito .ArgumentMatchers .anyString ;
124
+ import static org .mockito .ArgumentMatchers .eq ;
121
125
import static org .mockito .Mockito .doAnswer ;
122
126
import static org .mockito .Mockito .doThrow ;
123
127
import static org .mockito .Mockito .mock ;
@@ -518,11 +522,13 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
518
522
final ClusterMetadataManifest previousManifest = ClusterMetadataManifest .builder ().indices (Collections .emptyList ()).build ();
519
523
520
524
remoteClusterStateService .start ();
521
- final ClusterMetadataManifest manifest = remoteClusterStateService .writeIncrementalMetadata (
525
+ final RemoteClusterStateService rcssSpy = Mockito .spy (remoteClusterStateService );
526
+ final RemoteClusterStateManifestInfo manifestInfo = rcssSpy .writeIncrementalMetadata (
522
527
previousClusterState ,
523
528
clusterState ,
524
529
previousManifest
525
- ).getClusterMetadataManifest ();
530
+ );
531
+ final ClusterMetadataManifest manifest = manifestInfo .getClusterMetadataManifest ();
526
532
final UploadedIndexMetadata uploadedIndexMetadata = new UploadedIndexMetadata ("test-index" , "index-uuid" , "metadata-filename__2" );
527
533
final List <UploadedIndexMetadata > indices = List .of (uploadedIndexMetadata );
528
534
@@ -535,6 +541,24 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
535
541
.previousClusterUUID ("prev-cluster-uuid" )
536
542
.build ();
537
543
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 ());
538
562
assertThat (manifest .getIndices ().size (), is (1 ));
539
563
assertThat (manifest .getIndices ().get (0 ).getIndexName (), is (uploadedIndexMetadata .getIndexName ()));
540
564
assertThat (manifest .getIndices ().get (0 ).getIndexUUID (), is (uploadedIndexMetadata .getIndexUUID ()));
@@ -543,6 +567,95 @@ public void testWriteIncrementalMetadataSuccess() throws IOException {
543
567
assertThat (manifest .getStateVersion (), is (expectedManifest .getStateVersion ()));
544
568
assertThat (manifest .getClusterUUID (), is (expectedManifest .getClusterUUID ()));
545
569
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 ));
546
659
}
547
660
548
661
/*
@@ -2012,7 +2125,9 @@ static ClusterState.Builder generateClusterStateWithOneIndex() {
2012
2125
.build ();
2013
2126
final CoordinationMetadata coordinationMetadata = CoordinationMetadata .builder ().term (1L ).build ();
2014
2127
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 ();
2016
2131
final CustomMetadata1 customMetadata1 = new CustomMetadata1 ("custom-metadata-1" );
2017
2132
return ClusterState .builder (ClusterName .DEFAULT )
2018
2133
.version (1L )
@@ -2025,14 +2140,16 @@ static ClusterState.Builder generateClusterStateWithOneIndex() {
2025
2140
.coordinationMetadata (coordinationMetadata )
2026
2141
.persistentSettings (settings )
2027
2142
.templates (templatesMetadata )
2143
+ .hashesOfConsistentSettings (Map .of ("key1" , "value1" , "key2" , "value2" ))
2028
2144
.putCustom (customMetadata1 .getWriteableName (), customMetadata1 )
2029
2145
.build ()
2030
2146
)
2031
2147
.routingTable (RoutingTable .builder ().addAsNew (indexMetadata ).version (1L ).build ());
2032
2148
}
2033
2149
2034
2150
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 ();
2036
2153
}
2037
2154
2038
2155
private static class CustomMetadata1 extends TestCustomMetadata {
0 commit comments