use of org.elasticsearch.cluster.coordination.AbstractCoordinatorTestCase.Cluster.ClusterNode in project crate by crate.
the class CoordinatorTests method testSettingInitialConfigurationTriggersElection.
public void testSettingInitialConfigurationTriggersElection() {
try (Cluster cluster = new Cluster(randomIntBetween(1, 5))) {
cluster.runFor(defaultMillis(DISCOVERY_FIND_PEERS_INTERVAL_SETTING) * 2 + randomLongBetween(0, 60000), "initial discovery phase");
for (final ClusterNode clusterNode : cluster.clusterNodes) {
final String nodeId = clusterNode.getId();
assertThat(nodeId + " is CANDIDATE", clusterNode.coordinator.getMode(), is(CANDIDATE));
assertThat(nodeId + " is in term 0", clusterNode.coordinator.getCurrentTerm(), is(0L));
assertThat(nodeId + " last accepted in term 0", clusterNode.coordinator.getLastAcceptedState().term(), is(0L));
assertThat(nodeId + " last accepted version 0", clusterNode.coordinator.getLastAcceptedState().version(), is(0L));
assertFalse(nodeId + " has not received an initial configuration", clusterNode.coordinator.isInitialConfigurationSet());
assertTrue(nodeId + " has an empty last-accepted configuration", clusterNode.coordinator.getLastAcceptedState().getLastAcceptedConfiguration().isEmpty());
assertTrue(nodeId + " has an empty last-committed configuration", clusterNode.coordinator.getLastAcceptedState().getLastCommittedConfiguration().isEmpty());
final Set<DiscoveryNode> foundPeers = new HashSet<>();
clusterNode.coordinator.getFoundPeers().forEach(foundPeers::add);
assertTrue(nodeId + " should not have discovered itself", foundPeers.add(clusterNode.getLocalNode()));
assertThat(nodeId + " should have found all peers", foundPeers, hasSize(cluster.size()));
}
final ClusterNode bootstrapNode = cluster.getAnyBootstrappableNode();
bootstrapNode.applyInitialConfiguration();
assertTrue(bootstrapNode.getId() + " has been bootstrapped", bootstrapNode.coordinator.isInitialConfigurationSet());
cluster.stabilise(// pre-voting round and proceed to an election, so there cannot be any collisions
// TODO this wait is unnecessary, we could trigger the election immediately
defaultMillis(ELECTION_INITIAL_TIMEOUT_SETTING) + // Allow two round-trip for pre-voting and voting
4 * DEFAULT_DELAY_VARIABILITY + // Then a commit of the new leader's first cluster state
DEFAULT_CLUSTER_STATE_UPDATE_DELAY + // Then allow time for all the other nodes to join, each of which might cause a reconfiguration
(cluster.size() - 1) * 2 * DEFAULT_CLUSTER_STATE_UPDATE_DELAY);
}
}
use of org.elasticsearch.cluster.coordination.AbstractCoordinatorTestCase.Cluster.ClusterNode in project crate by crate.
the class CoordinatorTests method testAckListenerReceivesNoAckFromHangingFollower.
public void testAckListenerReceivesNoAckFromHangingFollower() {
try (Cluster cluster = new Cluster(3)) {
cluster.runRandomly();
cluster.stabilise();
final ClusterNode leader = cluster.getAnyLeader();
final ClusterNode follower0 = cluster.getAnyNodeExcept(leader);
final ClusterNode follower1 = cluster.getAnyNodeExcept(leader, follower0);
logger.info("--> blocking cluster state application on {}", follower0);
follower0.setClusterStateApplyResponse(ClusterStateApplyResponse.HANG);
logger.info("--> publishing another value");
AckCollector ackCollector = leader.submitValue(randomLong());
cluster.runFor(DEFAULT_CLUSTER_STATE_UPDATE_DELAY, "committing value");
assertTrue("expected immediate ack from " + follower1, ackCollector.hasAckedSuccessfully(follower1));
assertFalse("expected no ack from " + leader, ackCollector.hasAckedSuccessfully(leader));
cluster.stabilise(defaultMillis(PUBLISH_TIMEOUT_SETTING));
assertTrue("expected eventual ack from " + leader, ackCollector.hasAckedSuccessfully(leader));
assertFalse("expected no ack from " + follower0, ackCollector.hasAcked(follower0));
}
}
use of org.elasticsearch.cluster.coordination.AbstractCoordinatorTestCase.Cluster.ClusterNode in project crate by crate.
the class CoordinatorTests method testIncompatibleDiffResendsFullState.
public void testIncompatibleDiffResendsFullState() {
try (Cluster cluster = new Cluster(randomIntBetween(3, 5))) {
cluster.runRandomly();
cluster.stabilise();
final ClusterNode leader = cluster.getAnyLeader();
final ClusterNode follower = cluster.getAnyNodeExcept(leader);
logger.info("--> blackholing {}", follower);
follower.blackhole();
final PublishClusterStateStats prePublishStats = follower.coordinator.stats().getPublishStats();
logger.info("--> submitting first value to {}", leader);
leader.submitValue(randomLong());
cluster.runFor(DEFAULT_CLUSTER_STATE_UPDATE_DELAY, "publish first state");
logger.info("--> healing {}", follower);
follower.heal();
logger.info("--> submitting second value to {}", leader);
leader.submitValue(randomLong());
cluster.stabilise();
final PublishClusterStateStats postPublishStats = follower.coordinator.stats().getPublishStats();
assertEquals(prePublishStats.getFullClusterStateReceivedCount() + 1, postPublishStats.getFullClusterStateReceivedCount());
assertEquals(prePublishStats.getCompatibleClusterStateDiffReceivedCount(), postPublishStats.getCompatibleClusterStateDiffReceivedCount());
assertEquals(prePublishStats.getIncompatibleClusterStateDiffReceivedCount() + 1, postPublishStats.getIncompatibleClusterStateDiffReceivedCount());
}
}
use of org.elasticsearch.cluster.coordination.AbstractCoordinatorTestCase.Cluster.ClusterNode in project crate by crate.
the class CoordinatorTests method testReconfiguresToExcludeMasterIneligibleNodesInVotingConfig.
public void testReconfiguresToExcludeMasterIneligibleNodesInVotingConfig() {
try (Cluster cluster = new Cluster(3)) {
cluster.runRandomly();
cluster.stabilise();
final ClusterNode chosenNode = cluster.getAnyNode();
assertThat(cluster.getAnyLeader().getLastAppliedClusterState().getLastCommittedConfiguration().getNodeIds(), hasItem(chosenNode.getId()));
assertThat(cluster.getAnyLeader().getLastAppliedClusterState().getLastAcceptedConfiguration().getNodeIds(), hasItem(chosenNode.getId()));
final boolean chosenNodeIsLeader = chosenNode == cluster.getAnyLeader();
final long termBeforeRestart = cluster.getAnyNode().coordinator.getCurrentTerm();
logger.info("--> restarting [{}] as a master-ineligible node", chosenNode);
chosenNode.close();
cluster.clusterNodes.replaceAll(cn -> cn == chosenNode ? cn.restartedNode(Function.identity(), Function.identity(), Settings.builder().put(Node.NODE_MASTER_SETTING.getKey(), false).build()) : cn);
cluster.stabilise();
if (chosenNodeIsLeader == false) {
assertThat("term did not change", cluster.getAnyNode().coordinator.getCurrentTerm(), is(termBeforeRestart));
}
assertThat(cluster.getAnyLeader().getLastAppliedClusterState().getLastCommittedConfiguration().getNodeIds(), not(hasItem(chosenNode.getId())));
assertThat(cluster.getAnyLeader().getLastAppliedClusterState().getLastAcceptedConfiguration().getNodeIds(), not(hasItem(chosenNode.getId())));
}
}
use of org.elasticsearch.cluster.coordination.AbstractCoordinatorTestCase.Cluster.ClusterNode in project crate by crate.
the class CoordinatorTests method testCanShrinkFromFiveNodesToThree.
public void testCanShrinkFromFiveNodesToThree() {
try (Cluster cluster = new Cluster(5)) {
cluster.runRandomly();
cluster.stabilise();
{
final ClusterNode leader = cluster.getAnyLeader();
logger.info("setting auto-shrink reconfiguration to false");
leader.submitSetAutoShrinkVotingConfiguration(false);
cluster.stabilise(DEFAULT_CLUSTER_STATE_UPDATE_DELAY);
assertFalse(CLUSTER_AUTO_SHRINK_VOTING_CONFIGURATION.get(leader.getLastAppliedClusterState().metadata().settings()));
}
final ClusterNode disconnect1 = cluster.getAnyNode();
final ClusterNode disconnect2 = cluster.getAnyNodeExcept(disconnect1);
logger.info("--> disconnecting {} and {}", disconnect1, disconnect2);
disconnect1.disconnect();
disconnect2.disconnect();
cluster.stabilise();
final ClusterNode leader = cluster.getAnyLeader();
{
final VotingConfiguration lastCommittedConfiguration = leader.getLastAppliedClusterState().getLastCommittedConfiguration();
assertThat(lastCommittedConfiguration + " should be all nodes", lastCommittedConfiguration.getNodeIds(), equalTo(cluster.clusterNodes.stream().map(ClusterNode::getId).collect(Collectors.toSet())));
}
logger.info("setting auto-shrink reconfiguration to true");
leader.submitSetAutoShrinkVotingConfiguration(true);
// allow for a reconfiguration
cluster.stabilise(DEFAULT_CLUSTER_STATE_UPDATE_DELAY * 2);
assertTrue(CLUSTER_AUTO_SHRINK_VOTING_CONFIGURATION.get(leader.getLastAppliedClusterState().metadata().settings()));
{
final VotingConfiguration lastCommittedConfiguration = leader.getLastAppliedClusterState().getLastCommittedConfiguration();
assertThat(lastCommittedConfiguration + " should be 3 nodes", lastCommittedConfiguration.getNodeIds().size(), equalTo(3));
assertFalse(lastCommittedConfiguration.getNodeIds().contains(disconnect1.getId()));
assertFalse(lastCommittedConfiguration.getNodeIds().contains(disconnect2.getId()));
}
}
}
Aggregations