From 53d470f70917fbad148fc82b56c256094d0b6970 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 12 Nov 2025 05:33:43 -0800 Subject: [PATCH] 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); }