Skip to content

Remove dependency on cluster state API in SpecificMasterNodesIT #127213

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Rename methods
  • Loading branch information
nielsbauman committed Apr 25, 2025
commit d52575fbd6e31567e87bcb7f87715e7134850930
Original file line number Diff line number Diff line change
Expand Up @@ -30,56 +30,56 @@ public void testSimpleOnlyMasterNodeElection() throws Exception {
internalCluster().setBootstrapMasterNodeIndex(0);
logger.info("--> start data node / non master node");
internalCluster().startNode(Settings.builder().put(dataOnlyNode()).put("discovery.initial_state_timeout", "1s"));
awaitAndAssertMasterNotFound();
awaitMasterNotFound();

logger.info("--> start master node");
final String masterNodeName = internalCluster().startMasterOnlyNode();

awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), masterNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitMasterNode(internalCluster().getMasterName(), masterNodeName);

logger.info("--> stop master node");
Settings masterDataPathSettings = internalCluster().dataPathSettings(internalCluster().getMasterName());
internalCluster().stopCurrentMasterNode();

awaitAndAssertMasterNotFound();
awaitMasterNotFound();

logger.info("--> start previous master node again");
final String nextMasterEligibleNodeName = internalCluster().startNode(
Settings.builder().put(nonDataNode(masterNode())).put(masterDataPathSettings)
);
awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligibleNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), nextMasterEligibleNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligibleNodeName);
awaitMasterNode(internalCluster().getMasterName(), nextMasterEligibleNodeName);
}

public void testElectOnlyBetweenMasterNodes() throws Exception {
internalCluster().setBootstrapMasterNodeIndex(0);
logger.info("--> start data node / non master node");
internalCluster().startNode(Settings.builder().put(dataOnlyNode()).put("discovery.initial_state_timeout", "1s"));
awaitAndAssertMasterNotFound();
awaitMasterNotFound();

logger.info("--> start master node (1)");
final String masterNodeName = internalCluster().startMasterOnlyNode();
awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), masterNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitMasterNode(internalCluster().getMasterName(), masterNodeName);

logger.info("--> start master node (2)");
final String nextMasterEligableNodeName = internalCluster().startMasterOnlyNode();
awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), masterNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), masterNodeName);
awaitMasterNode(internalCluster().getMasterName(), masterNodeName);

logger.info("--> closing master node (1)");
client().execute(
TransportAddVotingConfigExclusionsAction.TYPE,
new AddVotingConfigExclusionsRequest(TEST_REQUEST_TIMEOUT, masterNodeName)
).get();
// removing the master from the voting configuration immediately triggers the master to step down
awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligableNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), nextMasterEligableNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligableNodeName);
awaitMasterNode(internalCluster().getMasterName(), nextMasterEligableNodeName);

internalCluster().stopNode(masterNodeName);
awaitAndAssertMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligableNodeName);
awaitAndAssertMasterNode(internalCluster().getMasterName(), nextMasterEligableNodeName);
awaitMasterNode(internalCluster().getNonMasterNodeName(), nextMasterEligableNodeName);
awaitMasterNode(internalCluster().getMasterName(), nextMasterEligableNodeName);
}

public void testAliasFilterValidation() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -942,13 +942,13 @@ public void waitNoPendingTasksOnAll() throws Exception {
}

/**
* Waits for the node {@code viaNode} to see {@code masterNodeName} as the master node in the cluster state and asserts that.
* Waits for the node {@code viaNode} to see {@code masterNodeName} as the master node in the cluster state.
* Note that this does not guarantee that all other nodes in the cluster are on the same cluster state version already.
*
* @param viaNode the node to check the cluster state one
* @param masterNodeName the master node name that we wait for
*/
public void awaitAndAssertMasterNode(String viaNode, String masterNodeName) {
public void awaitMasterNode(String viaNode, String masterNodeName) {
var listener = ClusterServiceUtils.addTemporaryStateListener(
internalCluster().clusterService(viaNode),
state -> Optional.ofNullable(state.nodes().getMasterNode()).map(m -> m.getName().equals(masterNodeName)).orElse(false),
Expand All @@ -958,9 +958,10 @@ public void awaitAndAssertMasterNode(String viaNode, String masterNodeName) {
}

/**
* Waits for a random node in the cluster to not see a master node in the cluster state and asserts that.
* Waits for a random node in the cluster to not see a master node in the cluster state.
* Note that this does not guarantee that all other nodes in the cluster are on the same cluster state version already.
*/
public void awaitAndAssertMasterNotFound() {
public void awaitMasterNotFound() {
var viaNode = internalCluster().getRandomNodeName();
// We use a temporary state listener instead of `awaitClusterState` here because the `ClusterStateObserver` doesn't run the
// predicate if the cluster state version didn't change. When a master node leaves the cluster (i.e. what this method is used for),
Expand Down