|
|
@@ -44,7 +44,6 @@ import java.util.stream.Stream;
|
|
|
import static org.elasticsearch.health.HealthStatus.YELLOW;
|
|
|
import static org.elasticsearch.indices.recovery.RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING;
|
|
|
import static org.elasticsearch.node.Node.INITIAL_STATE_TIMEOUT_SETTING;
|
|
|
-import static org.elasticsearch.test.NodeRoles.dataNode;
|
|
|
import static org.elasticsearch.test.NodeRoles.dataOnlyNode;
|
|
|
import static org.elasticsearch.test.NodeRoles.masterNode;
|
|
|
import static org.hamcrest.Matchers.allOf;
|
|
|
@@ -139,6 +138,11 @@ public class FileSettingsServiceIT extends ESIntegTestCase {
|
|
|
|
|
|
public static void writeJSONFile(String node, String json, Logger logger, Long version) throws Exception {
|
|
|
FileSettingsService fileSettingsService = internalCluster().getInstance(FileSettingsService.class, node);
|
|
|
+ writeJSONFile(node, json, logger, version, fileSettingsService.watchedFile());
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void writeJSONFile(String node, String json, Logger logger, Long version, Path targetPath) throws Exception {
|
|
|
+ FileSettingsService fileSettingsService = internalCluster().getInstance(FileSettingsService.class, node);
|
|
|
|
|
|
Files.createDirectories(fileSettingsService.watchedFileDir());
|
|
|
Path tempFilePath = createTempFile();
|
|
|
@@ -152,8 +156,8 @@ public class FileSettingsServiceIT extends ESIntegTestCase {
|
|
|
do {
|
|
|
try {
|
|
|
// this can fail on Windows because of timing
|
|
|
- Files.move(tempFilePath, fileSettingsService.watchedFile(), StandardCopyOption.ATOMIC_MOVE);
|
|
|
- logger.info("--> after writing JSON config to node {} with path {}", node, tempFilePath);
|
|
|
+ Files.move(tempFilePath, targetPath, StandardCopyOption.ATOMIC_MOVE);
|
|
|
+ logger.info("--> after writing JSON config to node {} with path {}", node, targetPath);
|
|
|
return;
|
|
|
} catch (IOException e) {
|
|
|
logger.info("--> retrying writing a settings file [{}]", retryCount);
|
|
|
@@ -503,6 +507,35 @@ public class FileSettingsServiceIT extends ESIntegTestCase {
|
|
|
assertClusterStateSaveOK(savedClusterState.v1(), savedClusterState.v2(), "43mb");
|
|
|
}
|
|
|
|
|
|
+ public void testSymlinkUpdateTriggerReload() throws Exception {
|
|
|
+ internalCluster().setBootstrapMasterNodeIndex(0);
|
|
|
+ final String masterNode = internalCluster().startMasterOnlyNode();
|
|
|
+ FileSettingsService masterFileSettingsService = internalCluster().getInstance(FileSettingsService.class, masterNode);
|
|
|
+ Path baseDir = masterFileSettingsService.watchedFileDir();
|
|
|
+ assertBusy(() -> assertTrue(masterFileSettingsService.watching()));
|
|
|
+
|
|
|
+ {
|
|
|
+ var savedClusterState = setupClusterStateListener(masterNode);
|
|
|
+ // Create the settings.json as a symlink to simulate k8 setup
|
|
|
+ // settings.json -> ..data/settings.json
|
|
|
+ // ..data -> ..TIMESTAMP_TEMP_FOLDER_1
|
|
|
+ var fileDir = Files.createDirectories(baseDir.resolve("..TIMESTAMP_TEMP_FOLDER_1"));
|
|
|
+ writeJSONFile(masterNode, testJSON, logger, versionCounter.incrementAndGet(), fileDir.resolve("settings.json"));
|
|
|
+ var dataDir = Files.createSymbolicLink(baseDir.resolve("..data"), fileDir.getFileName());
|
|
|
+ Files.createSymbolicLink(baseDir.resolve("settings.json"), dataDir.getFileName().resolve("settings.json"));
|
|
|
+ assertClusterStateSaveOK(savedClusterState.v1(), savedClusterState.v2(), "50mb");
|
|
|
+ }
|
|
|
+ {
|
|
|
+ var savedClusterState = setupClusterStateListener(masterNode);
|
|
|
+ // Update ..data symlink to ..data -> ..TIMESTAMP_TEMP_FOLDER_2 to simulate kubernetes secret update
|
|
|
+ var fileDir = Files.createDirectories(baseDir.resolve("..TIMESTAMP_TEMP_FOLDER_2"));
|
|
|
+ writeJSONFile(masterNode, testJSON43mb, logger, versionCounter.incrementAndGet(), fileDir.resolve("settings.json"));
|
|
|
+ Files.deleteIfExists(baseDir.resolve("..data"));
|
|
|
+ Files.createSymbolicLink(baseDir.resolve("..data"), fileDir.getFileName());
|
|
|
+ assertClusterStateSaveOK(savedClusterState.v1(), savedClusterState.v2(), "43mb");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public void testHealthIndicatorWithSingleNode() throws Exception {
|
|
|
internalCluster().setBootstrapMasterNodeIndex(0);
|
|
|
logger.info("--> start the node");
|