4444import static org .elasticsearch .health .HealthStatus .YELLOW ;
4545import static org .elasticsearch .indices .recovery .RecoverySettings .INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING ;
4646import static org .elasticsearch .node .Node .INITIAL_STATE_TIMEOUT_SETTING ;
47- import static org .elasticsearch .test .NodeRoles .dataNode ;
4847import static org .elasticsearch .test .NodeRoles .dataOnlyNode ;
4948import static org .elasticsearch .test .NodeRoles .masterNode ;
5049import static org .hamcrest .Matchers .allOf ;
@@ -139,6 +138,11 @@ private void assertMasterNode(Client client, String node) {
139138
140139 public static void writeJSONFile (String node , String json , Logger logger , Long version ) throws Exception {
141140 FileSettingsService fileSettingsService = internalCluster ().getInstance (FileSettingsService .class , node );
141+ writeJSONFile (node , json , logger , version , fileSettingsService .watchedFile ());
142+ }
143+
144+ public static void writeJSONFile (String node , String json , Logger logger , Long version , Path targetPath ) throws Exception {
145+ FileSettingsService fileSettingsService = internalCluster ().getInstance (FileSettingsService .class , node );
142146
143147 Files .createDirectories (fileSettingsService .watchedFileDir ());
144148 Path tempFilePath = createTempFile ();
@@ -152,8 +156,8 @@ public static void writeJSONFile(String node, String json, Logger logger, Long v
152156 do {
153157 try {
154158 // this can fail on Windows because of timing
155- Files .move (tempFilePath , fileSettingsService . watchedFile () , StandardCopyOption .ATOMIC_MOVE );
156- logger .info ("--> after writing JSON config to node {} with path {}" , node , tempFilePath );
159+ Files .move (tempFilePath , targetPath , StandardCopyOption .ATOMIC_MOVE );
160+ logger .info ("--> after writing JSON config to node {} with path {}" , node , targetPath );
157161 return ;
158162 } catch (IOException e ) {
159163 logger .info ("--> retrying writing a settings file [{}]" , retryCount );
@@ -503,6 +507,35 @@ public void testSettingsAppliedOnMasterReElection() throws Exception {
503507 assertClusterStateSaveOK (savedClusterState .v1 (), savedClusterState .v2 (), "43mb" );
504508 }
505509
510+ public void testSymlinkUpdateTriggerReload () throws Exception {
511+ internalCluster ().setBootstrapMasterNodeIndex (0 );
512+ final String masterNode = internalCluster ().startMasterOnlyNode ();
513+ FileSettingsService masterFileSettingsService = internalCluster ().getInstance (FileSettingsService .class , masterNode );
514+ Path baseDir = masterFileSettingsService .watchedFileDir ();
515+ assertBusy (() -> assertTrue (masterFileSettingsService .watching ()));
516+
517+ {
518+ var savedClusterState = setupClusterStateListener (masterNode );
519+ // Create the settings.json as a symlink to simulate k8 setup
520+ // settings.json -> ..data/settings.json
521+ // ..data -> ..TIMESTAMP_TEMP_FOLDER_1
522+ var fileDir = Files .createDirectories (baseDir .resolve ("..TIMESTAMP_TEMP_FOLDER_1" ));
523+ writeJSONFile (masterNode , testJSON , logger , versionCounter .incrementAndGet (), fileDir .resolve ("settings.json" ));
524+ var dataDir = Files .createSymbolicLink (baseDir .resolve ("..data" ), fileDir .getFileName ());
525+ Files .createSymbolicLink (baseDir .resolve ("settings.json" ), dataDir .getFileName ().resolve ("settings.json" ));
526+ assertClusterStateSaveOK (savedClusterState .v1 (), savedClusterState .v2 (), "50mb" );
527+ }
528+ {
529+ var savedClusterState = setupClusterStateListener (masterNode );
530+ // Update ..data symlink to ..data -> ..TIMESTAMP_TEMP_FOLDER_2 to simulate kubernetes secret update
531+ var fileDir = Files .createDirectories (baseDir .resolve ("..TIMESTAMP_TEMP_FOLDER_2" ));
532+ writeJSONFile (masterNode , testJSON43mb , logger , versionCounter .incrementAndGet (), fileDir .resolve ("settings.json" ));
533+ Files .deleteIfExists (baseDir .resolve ("..data" ));
534+ Files .createSymbolicLink (baseDir .resolve ("..data" ), fileDir .getFileName ());
535+ assertClusterStateSaveOK (savedClusterState .v1 (), savedClusterState .v2 (), "43mb" );
536+ }
537+ }
538+
506539 public void testHealthIndicatorWithSingleNode () throws Exception {
507540 internalCluster ().setBootstrapMasterNodeIndex (0 );
508541 logger .info ("--> start the node" );
0 commit comments