From 349bfaee88c000ecc9bff2abb2f5a16e8cedfe3d Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 17 Nov 2025 16:30:29 -0800 Subject: [PATCH] Fix test race condition in file settings monitoring (#137965) 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, 18 insertions(+), 9 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..9448d60c2eb50 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,29 @@ private Tuple setupClusterStateListener(String node, ClusterService clusterService = internalCluster().clusterService(node); CountDownLatch savedClusterState = new CountDownLatch(1); AtomicLong metadataVersion = new AtomicLong(-1); + Function clusterStateProcessor = clusterState -> { + 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 public void clusterChanged(ClusterChangedEvent event) { - ReservedStateMetadata reservedState = event.state().metadata().reservedStateMetadata().get(FileSettingsService.NAMESPACE); - if (reservedState != null && reservedState.version() == fileSettingsVersion) { + if (clusterStateProcessor.apply(event.state())) { clusterService.removeListener(this); - metadataVersion.set(event.state().metadata().version()); - savedClusterState.countDown(); - logger.info( - "done waiting for file settings [version: {}, metadata version: {}]", - event.state().version(), - event.state().metadata().version() - ); } } }); + clusterStateProcessor.apply(clusterService.state()); return new Tuple<>(savedClusterState, metadataVersion); }