56
56
import org .elasticsearch .test .InternalTestCluster .RestartCallback ;
57
57
58
58
import java .io .IOException ;
59
+ import java .nio .file .Files ;
59
60
import java .nio .file .Path ;
60
61
import java .util .List ;
61
62
import java .util .Map ;
@@ -533,7 +534,7 @@ public void testHalfDeletedIndexImport() throws Exception {
533
534
// // term in the coordination metadata
534
535
// .coordinationMetaData(CoordinationMetaData.builder(metaData.coordinationMetaData()).term(0L).build())
535
536
// // add a tombstone but do not delete the index metadata from disk
536
- // .putCustom(IndexGraveyard.TYPE, IndexGraveyard.builder().addTombstone(metaData.index("test").getIndex()).build()).build());
537
+ // .putCustom(IndexGraveyard.TYPE, IndexGraveyard.builder().addTombstone(metaData.index("test").getIndex()).build()).build());
537
538
// for (final Path path : paths) {
538
539
// try (Stream<Path> stateFiles = Files.list(path.resolve(MetaDataStateFormat.STATE_DIR_NAME))) {
539
540
// for (final Path manifestPath : stateFiles
@@ -549,6 +550,90 @@ public void testHalfDeletedIndexImport() throws Exception {
549
550
assertBusy (() -> assertThat (internalCluster ().getInstance (NodeEnvironment .class ).availableIndexFolders (), empty ()));
550
551
}
551
552
553
+ public void testOnlyWritesIndexMetaDataFilesOnDataNodes () throws Exception {
554
+ final String masterNode = internalCluster ().startMasterOnlyNode ();
555
+ final String dataNode = internalCluster ().startDataOnlyNode ();
556
+ final String mixedNode = internalCluster ().startNode ();
557
+
558
+ createIndex ("test" , Settings .builder ()
559
+ .put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , between (1 , 3 ))
560
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 1 )
561
+ .build ());
562
+ ensureGreen ("test" );
563
+
564
+ final String indexUUID = client ().admin ().indices ().prepareStats ("test" ).get ().getIndex ("test" ).getUuid ();
565
+
566
+ final Path [] masterPaths = internalCluster ().getInstance (NodeEnvironment .class , masterNode ).nodeDataPaths ();
567
+ final Path [] dataPaths = internalCluster ().getInstance (NodeEnvironment .class , dataNode ).nodeDataPaths ();
568
+ final Path [] mixedPaths = internalCluster ().getInstance (NodeEnvironment .class , mixedNode ).nodeDataPaths ();
569
+
570
+ for (final Path path : masterPaths ) {
571
+ assertFalse ("master: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER )));
572
+ }
573
+ for (final Path path : dataPaths ) {
574
+ assertTrue ("data: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
575
+ }
576
+ for (final Path path : mixedPaths ) {
577
+ assertTrue ("mixed: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
578
+ }
579
+
580
+ logger .info ("--> remove shards from data node, to check the index folder is cleaned up" );
581
+ assertAcked (client ().admin ().indices ().prepareUpdateSettings ("test" ).setSettings (Settings .builder ()
582
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 )
583
+ .put (IndexMetaData .INDEX_ROUTING_EXCLUDE_GROUP_PREFIX + "._name" , dataNode )));
584
+ assertFalse (client ().admin ().cluster ().prepareHealth ("test" ).setWaitForGreenStatus ()
585
+ .setWaitForNoInitializingShards (true ).setWaitForEvents (Priority .LANGUID ).get ().isTimedOut ());
586
+
587
+ for (final Path path : masterPaths ) {
588
+ assertFalse ("master: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER )));
589
+ }
590
+ for (final Path path : mixedPaths ) {
591
+ assertTrue ("mixed: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
592
+ }
593
+ assertBusy (() -> {
594
+ for (final Path path : dataPaths ) {
595
+ assertFalse ("data: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
596
+ }
597
+ });
598
+
599
+ logger .info ("--> remove shards from mixed master/data node, to check the index folder is cleaned up" );
600
+ assertAcked (client ().admin ().indices ().prepareUpdateSettings ("test" ).setSettings (Settings .builder ()
601
+ .put (IndexMetaData .INDEX_ROUTING_EXCLUDE_GROUP_PREFIX + "._name" , mixedNode )));
602
+ assertFalse (client ().admin ().cluster ().prepareHealth ("test" ).setWaitForGreenStatus ()
603
+ .setWaitForNoInitializingShards (true ).setWaitForEvents (Priority .LANGUID ).get ().isTimedOut ());
604
+
605
+ for (final Path path : masterPaths ) {
606
+ assertFalse ("master: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER )));
607
+ }
608
+ for (final Path path : dataPaths ) {
609
+ assertTrue ("data: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
610
+ }
611
+ assertBusy (() -> {
612
+ for (final Path path : mixedPaths ) {
613
+ assertFalse ("mixed: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
614
+ }
615
+ });
616
+
617
+ logger .info ("--> delete index and check the index folder is cleaned up on all nodes" );
618
+ assertAcked (client ().admin ().indices ().prepareUpdateSettings ("test" ).setSettings (Settings .builder ()
619
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 1 )
620
+ .putNull (IndexMetaData .INDEX_ROUTING_EXCLUDE_GROUP_PREFIX + "._name" )));
621
+ ensureGreen ("test" );
622
+ assertAcked (client ().admin ().indices ().prepareDelete ("test" ));
623
+
624
+ for (final Path path : masterPaths ) {
625
+ assertFalse ("master: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER )));
626
+ }
627
+ assertBusy (() -> {
628
+ for (final Path path : dataPaths ) {
629
+ assertFalse ("data: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
630
+ }
631
+ for (final Path path : mixedPaths ) {
632
+ assertFalse ("mixed: " + path , Files .exists (path .resolve (NodeEnvironment .INDICES_FOLDER ).resolve (indexUUID )));
633
+ }
634
+ });
635
+ }
636
+
552
637
private void restartNodesOnBrokenClusterState (ClusterState .Builder clusterStateBuilder ) throws Exception {
553
638
Map <String , LucenePersistedStateFactory > lucenePersistedStateFactories = Stream .of (internalCluster ().getNodeNames ())
554
639
.collect (Collectors .toMap (Function .identity (),
0 commit comments