From 53d470f70917fbad148fc82b56c256094d0b6970 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 12 Nov 2025 05:33:43 -0800 Subject: [PATCH 1/2] Fix test race condition in file settings monitoring When file settings tests look for changes in cluster state to assert application of changes they do so by adding a cluster state listener. But if there are no more cluster state updates after the listener is added the test will never see the initial state of file settings. This commit ensures the current cluster state is seen in that case. closes #36454 --- .../service/FileSettingsServiceIT.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java b/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java index de4c01a9a5455..3fcbc47b24b32 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java @@ -15,6 +15,7 @@ import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.cluster.ClusterChangedEvent; +import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateListener; import org.elasticsearch.cluster.metadata.ReservedStateErrorMetadata; import org.elasticsearch.cluster.metadata.ReservedStateHandlerMetadata; @@ -39,6 +40,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; import java.util.stream.Stream; import static org.elasticsearch.cluster.metadata.ReservedStateMetadata.EMPTY_VERSION; @@ -194,22 +196,31 @@ private Tuple setupClusterStateListener(String node, ClusterService clusterService = internalCluster().clusterService(node); CountDownLatch savedClusterState = new CountDownLatch(1); AtomicLong metadataVersion = new AtomicLong(-1); - clusterService.addListener(new ClusterStateListener() { - @Override - public void clusterChanged(ClusterChangedEvent event) { - ReservedStateMetadata reservedState = event.state().metadata().reservedStateMetadata().get(FileSettingsService.NAMESPACE); + Function clusterStateProcessor = clusterState -> { + synchronized (savedClusterState) { + ReservedStateMetadata reservedState = clusterState.metadata().reservedStateMetadata().get(FileSettingsService.NAMESPACE); if (reservedState != null && reservedState.version() == fileSettingsVersion) { - clusterService.removeListener(this); - metadataVersion.set(event.state().metadata().version()); + metadataVersion.set(clusterState.metadata().version()); savedClusterState.countDown(); logger.info( "done waiting for file settings [version: {}, metadata version: {}]", - event.state().version(), - event.state().metadata().version() + clusterState.version(), + clusterState.metadata().version() ); + return true; + } + return false; + } + }; + clusterService.addListener(new ClusterStateListener() { + @Override + public void clusterChanged(ClusterChangedEvent event) { + if (clusterStateProcessor.apply(event.state())) { + clusterService.removeListener(this); } } }); + clusterStateProcessor.apply(clusterService.state()); return new Tuple<>(savedClusterState, metadataVersion); } From 0216cca981e55f41d74564c868595c4b9b2db7ae Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 17 Nov 2025 15:41:25 -0800 Subject: [PATCH 2/2] tweak --- .../service/FileSettingsServiceIT.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java b/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java index 3fcbc47b24b32..9448d60c2eb50 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/reservedstate/service/FileSettingsServiceIT.java @@ -197,20 +197,18 @@ private Tuple setupClusterStateListener(String node, CountDownLatch savedClusterState = new CountDownLatch(1); AtomicLong metadataVersion = new AtomicLong(-1); Function clusterStateProcessor = clusterState -> { - synchronized (savedClusterState) { - ReservedStateMetadata reservedState = clusterState.metadata().reservedStateMetadata().get(FileSettingsService.NAMESPACE); - if (reservedState != null && reservedState.version() == fileSettingsVersion) { - metadataVersion.set(clusterState.metadata().version()); - savedClusterState.countDown(); - logger.info( - "done waiting for file settings [version: {}, metadata version: {}]", - clusterState.version(), - clusterState.metadata().version() - ); - return true; - } - return false; + ReservedStateMetadata reservedState = clusterState.metadata().reservedStateMetadata().get(FileSettingsService.NAMESPACE); + if (reservedState != null && reservedState.version() == fileSettingsVersion) { + metadataVersion.set(clusterState.metadata().version()); + savedClusterState.countDown(); + logger.info( + "done waiting for file settings [version: {}, metadata version: {}]", + clusterState.version(), + clusterState.metadata().version() + ); + return true; } + return false; }; clusterService.addListener(new ClusterStateListener() { @Override