diff --git a/server/src/main/java/org/opensearch/action/admin/cluster/state/TransportClusterStateAction.java b/server/src/main/java/org/opensearch/action/admin/cluster/state/TransportClusterStateAction.java index 9f40fe2e83461..fdcb3ee6346b6 100644 --- a/server/src/main/java/org/opensearch/action/admin/cluster/state/TransportClusterStateAction.java +++ b/server/src/main/java/org/opensearch/action/admin/cluster/state/TransportClusterStateAction.java @@ -125,9 +125,12 @@ protected void clusterManagerOperation( ? clusterState -> true : clusterState -> clusterState.metadata().version() >= request.waitForMetadataVersion(); + // action will be executed on local node, if either the request is local only (or) the local node has the same cluster-state as + // ClusterManager final Predicate acceptableClusterStateOrNotMasterPredicate = request.local() - ? acceptableClusterStatePredicate - : acceptableClusterStatePredicate.or(clusterState -> clusterState.nodes().isLocalNodeElectedClusterManager() == false); + || !state.nodes().isLocalNodeElectedClusterManager() + ? acceptableClusterStatePredicate + : acceptableClusterStatePredicate.or(clusterState -> clusterState.nodes().isLocalNodeElectedClusterManager() == false); if (acceptableClusterStatePredicate.test(state)) { ActionListener.completeWith(listener, () -> buildResponse(request, state)); diff --git a/server/src/main/java/org/opensearch/cluster/coordination/ClusterStateTermVersion.java b/server/src/main/java/org/opensearch/cluster/coordination/ClusterStateTermVersion.java index 5c292e85d5301..bc992826c400f 100644 --- a/server/src/main/java/org/opensearch/cluster/coordination/ClusterStateTermVersion.java +++ b/server/src/main/java/org/opensearch/cluster/coordination/ClusterStateTermVersion.java @@ -15,6 +15,9 @@ import java.io.IOException; +/** + * Identifies a specific version of ClusterState at a node. + */ public class ClusterStateTermVersion implements Writeable { private final ClusterName clusterName; diff --git a/server/src/test/java/org/opensearch/action/support/clustermanager/TransportClusterManagerTermCheckTests.java b/server/src/test/java/org/opensearch/action/support/clustermanager/TransportClusterManagerTermCheckTests.java index 1890a8d646e35..d22d4871d92af 100644 --- a/server/src/test/java/org/opensearch/action/support/clustermanager/TransportClusterManagerTermCheckTests.java +++ b/server/src/test/java/org/opensearch/action/support/clustermanager/TransportClusterManagerTermCheckTests.java @@ -250,15 +250,15 @@ public void testTermCheckNoMatchWithClusterManager() throws ExecutionException, CapturingTransport.CapturedRequest termCheckRequest = transport.capturedRequests()[0]; assertTrue(termCheckRequest.node.isClusterManagerNode()); assertThat(termCheckRequest.action, equalTo("cluster:monitor/term")); - GetTermVersionResponse termVersionResponse = new GetTermVersionResponse( + GetTermVersionResponse noMatchResponse = new GetTermVersionResponse( new ClusterStateTermVersion( clusterService.state().getClusterName(), - clusterService.state().stateUUID(), + clusterService.state().metadata().clusterUUID(), clusterService.state().term(), clusterService.state().version() - 1 ) ); - transport.handleResponse(termCheckRequest.requestId, termVersionResponse); + transport.handleResponse(termCheckRequest.requestId, noMatchResponse); assertFalse(listener.isDone()); assertThat(transport.capturedRequests().length, equalTo(2));