Skip to content
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

Deprecate minimum_master_nodes #37868

Merged
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
cf9a419
Forbid minimum_master_nodes in node settings
DaveCTurner Jan 25, 2019
7aed19d
startNode(Settings.EMPTY) is just startNode()
DaveCTurner Jan 25, 2019
9a952da
startNode(Settings.EMPTY) is just startNode()
DaveCTurner Jan 25, 2019
6dc78b1
Fix REST tests too
DaveCTurner Jan 25, 2019
186a16d
Add NOCOMMIT because we don't want to be so strict
DaveCTurner Jan 26, 2019
05af9a7
Gotta catch them all
DaveCTurner Jan 27, 2019
ba246f5
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 27, 2019
b8f9e45
Fix docs
DaveCTurner Jan 27, 2019
8585d63
Always set discovery.initial_state_timeout: 0s
DaveCTurner Jan 27, 2019
38332f4
Revert no-op changes to GatewayService
DaveCTurner Jan 27, 2019
4871b7e
Remove exception and mark property as deprecated
DaveCTurner Jan 28, 2019
dd30a2e
Validate cluster fully formed before restart, preventing re-bootstrap…
DaveCTurner Jan 28, 2019
b9a64f5
Don't use mmn in REST test regarding settings
DaveCTurner Jan 28, 2019
79f7f41
Remove MMN from comment
DaveCTurner Jan 28, 2019
7c58475
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 28, 2019
c2674ab
Expect warnings in tests
DaveCTurner Jan 28, 2019
7da96d4
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 29, 2019
6f5bb43
Bring comment back
DaveCTurner Jan 29, 2019
7c8a540
Do not set wait_for_joins_timeout on 7.x nodes
DaveCTurner Jan 29, 2019
9137ad2
Use a more specific constant instead of Integer.MAX_VALUE
DaveCTurner Jan 29, 2019
f9fa2d2
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 29, 2019
140dfce
Reducing the recovery timeout changes the expected log message
DaveCTurner Jan 30, 2019
52fdcba
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 30, 2019
9f737b0
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 30, 2019
89bb05f
Merge branch 'master' into 2019-01-25-forbid-minimum-master-nodes
DaveCTurner Jan 30, 2019
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
Original file line number Diff line number Diff line change
Expand Up @@ -356,14 +356,10 @@ class ClusterFormationTasks {
'node.attr.testattr' : 'test'
]
int minimumMasterNodes = node.config.minimumMasterNodes.call()
if (minimumMasterNodes > 0) {
if (node.nodeVersion.before("7.0.0") && minimumMasterNodes > 0) {
esConfig['discovery.zen.minimum_master_nodes'] = minimumMasterNodes
}
if (minimumMasterNodes > 1) {
// don't wait for state.. just start up quickly
// this will also allow new and old nodes in the BWC case to become the master
esConfig['discovery.initial_state_timeout'] = '0s'
}
esConfig['discovery.initial_state_timeout'] = '0s'
ywelsch marked this conversation as resolved.
Show resolved Hide resolved
if (esConfig.containsKey('discovery.zen.master_election.wait_for_joins_timeout') == false) {
ywelsch marked this conversation as resolved.
Show resolved Hide resolved
// If a node decides to become master based on partial information from the pinging, don't let it hang for 30 seconds to correct
// its mistake. Instead, only wait 5s to do another round of pinging.
Expand Down
4 changes: 2 additions & 2 deletions docs/reference/migration/migrate_7_0/discovery.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ settings summary>> for an example, and the
<<modules-discovery-bootstrap-cluster,cluster bootstrapping reference
documentation>> describes this setting in more detail.

The `discovery.zen.minimum_master_nodes` setting is required during a rolling
upgrade from 6.x, but can be removed in all other circumstances.
The `discovery.zen.minimum_master_nodes` setting is permitted, but ignored, on
7.x nodes.

[float]
==== Removing master-eligible nodes sometimes requires voting exclusions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@
import org.elasticsearch.cluster.routing.UnassignedInfo;
import org.elasticsearch.common.Priority;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.Settings.Builder;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.http.HttpServerTransport;
import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.InternalTestCluster;
Expand All @@ -58,11 +56,7 @@ public class Zen2RestApiIT extends ESNetty4IntegTestCase {

@Override
protected Settings nodeSettings(int nodeOrdinal) {
final Builder builder = Settings.builder().put(super.nodeSettings(nodeOrdinal))
.put(TestZenDiscovery.USE_ZEN2.getKey(), true)
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE);

return builder.build();
return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put(TestZenDiscovery.USE_ZEN2.getKey(), true).build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@


import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse;
import org.elasticsearch.common.UUIDs;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.discovery.DiscoveryModule;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
Expand All @@ -41,13 +42,14 @@ public void testMinimumMasterNodesStart() {
.build();
internalCluster().startNode(nodeSettings);

// We try to update minimum_master_nodes now
ClusterUpdateSettingsResponse response = client().admin().cluster().prepareUpdateSettings()
.setPersistentSettings(Settings.builder().put("discovery.zen.minimum_master_nodes", 1))
.setTransientSettings(Settings.builder().put("discovery.zen.minimum_master_nodes", 1))
// We try to update a setting now
final String expectedValue = UUIDs.randomBase64UUID(random());
final String settingName = "cluster.routing.allocation.exclude.any_attribute";
final ClusterUpdateSettingsResponse response = client().admin().cluster().prepareUpdateSettings()
.setPersistentSettings(Settings.builder().put(settingName, expectedValue))
.get();

Integer min = response.getPersistentSettings().getAsInt("discovery.zen.minimum_master_nodes", null);
assertThat(min, is(1));
final String value = response.getPersistentSettings().get(settingName);
assertThat(value, is(expectedValue));
}
}
1 change: 0 additions & 1 deletion qa/rolling-upgrade/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ for (Version version : bwcVersions.wireCompatible) {
dependsOn lastRunner, "${baseName}#oldClusterTestCluster#node${stopNode}.stop"
clusterName = 'rolling-upgrade'
otherUnicastHostAddresses = { getOtherUnicastHostAddresses() }
minimumMasterNodes = { 2 }
autoSetInitialMasterNodes = false
/* Override the data directory so the new node always gets the node we
* just stopped's data directory. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,22 @@
cluster.put_settings:
body:
transient:
discovery.zen.minimum_master_nodes: 1
cluster.routing.allocation.enable: "none"
flat_settings: true

- match: {transient: {discovery.zen.minimum_master_nodes: "1"}}
- match: {transient: {cluster.routing.allocation.enable: "none"}}

- do:
cluster.get_settings:
flat_settings: true

- match: {transient: {discovery.zen.minimum_master_nodes: "1"}}
- match: {transient: {cluster.routing.allocation.enable: "none"}}

- do:
cluster.put_settings:
body:
transient:
discovery.zen.minimum_master_nodes: null
cluster.routing.allocation.enable: null
flat_settings: true

- match: {transient: {}}
Expand All @@ -35,22 +35,22 @@
cluster.put_settings:
body:
persistent:
cluster.routing.allocation.disk.threshold_enabled: false
cluster.routing.allocation.enable: "none"
flat_settings: true

- match: {persistent: {cluster.routing.allocation.disk.threshold_enabled: "false"}}
- match: {persistent: {cluster.routing.allocation.enable: "none"}}

- do:
cluster.get_settings:
flat_settings: true

- match: {persistent: {cluster.routing.allocation.disk.threshold_enabled: "false"}}
- match: {persistent: {cluster.routing.allocation.enable: "none"}}

- do:
cluster.put_settings:
body:
persistent:
cluster.routing.allocation.disk.threshold_enabled: null
cluster.routing.allocation.enable: null
flat_settings: true

- match: {persistent: {}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class ElectMasterService {
private static final Logger logger = LogManager.getLogger(ElectMasterService.class);

public static final Setting<Integer> DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING =
Setting.intSetting("discovery.zen.minimum_master_nodes", -1, Property.Dynamic, Property.NodeScope);
Setting.intSetting("discovery.zen.minimum_master_nodes", -1, Property.Dynamic, Property.NodeScope, Property.Deprecated);

private volatile int minimumMasterNodes;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.discovery.MasterNotDiscoveredException;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.gateway.GatewayService;
import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
Expand Down Expand Up @@ -51,8 +50,7 @@ protected List<Settings> addExtraClusterBootstrapSettings(List<Settings> allNode

public void testIndexExistsWithBlocksInPlace() throws IOException {
Settings settings = Settings.builder()
.put(GatewayService.RECOVER_AFTER_NODES_SETTING.getKey(), 99)
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE).build();
.put(GatewayService.RECOVER_AFTER_NODES_SETTING.getKey(), 99).build();
String node = internalCluster().startNode(settings);

assertThrows(client(node).admin().indices().prepareExists("test").setMasterNodeTimeout(TimeValue.timeValueSeconds(0)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.coordination.ClusterBootstrapService;
import org.elasticsearch.cluster.coordination.FailedToCommitClusterStateException;
import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.Priority;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.discovery.DiscoverySettings;
import org.elasticsearch.cluster.coordination.FailedToCommitClusterStateException;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.discovery.zen.ZenDiscovery;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.node.Node;
Expand Down Expand Up @@ -102,7 +101,6 @@ public void testTwoNodesNoMasterBlock() throws Exception {
bootstrapNodeId = 2;

Settings settings = Settings.builder()
.put("discovery.zen.minimum_master_nodes", 2)
.put(ZenDiscovery.PING_TIMEOUT_SETTING.getKey(), "200ms")
.put("discovery.initial_state_timeout", "500ms")
.build();
Expand Down Expand Up @@ -237,7 +235,6 @@ public void testThreeNodesNoMasterBlock() throws Exception {
bootstrapNodeId = 3;

Settings settings = Settings.builder()
.put("discovery.zen.minimum_master_nodes", 3)
.put(ZenDiscovery.PING_TIMEOUT_SETTING.getKey(), "1s")
.put("discovery.initial_state_timeout", "500ms")
.build();
Expand Down Expand Up @@ -316,11 +313,9 @@ public void testCannotCommitStateThreeNodes() throws Exception {
Settings settings = Settings.builder()
.put(ZenDiscovery.PING_TIMEOUT_SETTING.getKey(), "200ms")
.put("discovery.initial_state_timeout", "500ms")
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), 2)
.put(DiscoverySettings.COMMIT_TIMEOUT_SETTING.getKey(), "100ms") // speed things up
.build();


internalCluster().startNodes(3, settings);
ensureGreen(); // ensure cluster state is recovered before we disrupt things

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import java.util.List;
import java.util.concurrent.ExecutionException;

import static org.elasticsearch.discovery.zen.ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
Expand All @@ -47,12 +46,6 @@
@TestLogging("_root:DEBUG,org.elasticsearch.action.admin.cluster.state:TRACE")
public class SpecificMasterNodesIT extends ESIntegTestCase {

@Override
protected Settings nodeSettings(int nodeOrdinal) {
return Settings.builder().put(super.nodeSettings(nodeOrdinal))
.put(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), 1).build();
}

@Override
protected List<Settings> addExtraClusterBootstrapSettings(List<Settings> allNodesSettings) {
// if it's the first master in the cluster bootstrap the cluster with this node name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.discovery.DiscoverySettings;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.env.Environment;
import org.elasticsearch.env.NodeEnvironment;
import org.elasticsearch.env.NodeMetaData;
Expand Down Expand Up @@ -155,7 +154,6 @@ public void testNoNodeMetaData() throws IOException {
public void testNotBootstrappedCluster() throws Exception {
internalCluster().startNode(
Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.put(DiscoverySettings.INITIAL_STATE_TIMEOUT_SETTING.getKey(), "0s") // to ensure quick node startup
.build());
assertBusy(() -> {
Expand All @@ -172,9 +170,7 @@ public void testNotBootstrappedCluster() throws Exception {

public void testNoManifestFile() throws IOException {
bootstrapNodeId = 1;
internalCluster().startNode(Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
internalCluster().startNode();
ensureStableCluster(1);
NodeEnvironment nodeEnvironment = internalCluster().getMasterNodeInstance(NodeEnvironment.class);
internalCluster().stopRandomDataNode();
Expand All @@ -186,9 +182,7 @@ public void testNoManifestFile() throws IOException {

public void testNoMetaData() throws IOException {
bootstrapNodeId = 1;
internalCluster().startNode(Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
internalCluster().startNode();
ensureStableCluster(1);
NodeEnvironment nodeEnvironment = internalCluster().getMasterNodeInstance(NodeEnvironment.class);
internalCluster().stopRandomDataNode();
Expand All @@ -201,9 +195,7 @@ public void testNoMetaData() throws IOException {

public void testAbortedByUser() throws IOException {
bootstrapNodeId = 1;
internalCluster().startNode(Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
internalCluster().startNode();
ensureStableCluster(1);
internalCluster().stopRandomDataNode();

Expand All @@ -213,13 +205,9 @@ public void testAbortedByUser() throws IOException {

public void test3MasterNodes2Failed() throws Exception {
bootstrapNodeId = 3;
List<String> masterNodes = internalCluster().startMasterOnlyNodes(3, Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
List<String> masterNodes = internalCluster().startMasterOnlyNodes(3, Settings.EMPTY);

String dataNode = internalCluster().startDataOnlyNode(Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
String dataNode = internalCluster().startDataOnlyNode();
createIndex("test");

Client dataNodeClient = internalCluster().client(dataNode);
Expand All @@ -246,9 +234,7 @@ public void test3MasterNodes2Failed() throws Exception {
String.format(Locale.ROOT, UnsafeBootstrapMasterCommand.CLUSTER_STATE_TERM_VERSION_MSG_FORMAT,
metaData.coordinationMetaData().term(), metaData.version())));

internalCluster().startMasterOnlyNode(Settings.builder()
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build());
internalCluster().startMasterOnlyNode();

assertBusy(() -> {
ClusterState state = dataNodeClient.admin().cluster().prepareState().setLocal(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.elasticsearch.common.Priority;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.env.NodeEnvironment;
import org.elasticsearch.gateway.MetaStateService;
import org.elasticsearch.test.ESIntegTestCase;
Expand Down Expand Up @@ -194,7 +195,8 @@ public Settings onNodeStopped(String nodeName) {
}
ClusterHealthResponse clusterHealthResponse = clusterHealthRequestBuilder.get();
assertFalse(nodeName, clusterHealthResponse.isTimedOut());
return Coordinator.addZen1Attribute(false, Settings.builder().put(ZEN2_SETTINGS)).build();
return Coordinator.addZen1Attribute(false, Settings.builder().put(ZEN2_SETTINGS)
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)).build();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add a comment why this is set to MAX_VALUE? Typically you would expect this to be unconfigured. Or we could randomize between unconfigured, configured to num_nodes / 2 + 1 and MAX_VALUE (in case user forgot to remove setting in upgrade)

Copy link
Contributor Author

@DaveCTurner DaveCTurner Jan 29, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I replaced it with a more specific name in 9137ad2. The point is that there's no facility to remove a setting via this API, so we set it to an explicitly silly value and then assert that this is what we wanted when removing it here:

// simulating an upgrade from Zen1 to Zen2, but there's no way to remove a setting when restarting a node, so
// you have to set it to REMOVED_MINIMUM_MASTER_NODES (== Integer.MAX_VALUE) to indicate its removal:
assertTrue(USE_ZEN2.exists(finalSettings));
assertTrue(USE_ZEN2.get(finalSettings));
assertThat(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.get(finalSettings), equalTo(REMOVED_MINIMUM_MASTER_NODES));
final Builder builder = Settings.builder().put(finalSettings);
builder.remove(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey());
finalSettings = builder.build();

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about doing .putNull(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey()) here and then

assertThat(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.get(finalSettings), 
                        equalTo(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getDefault(finalSettings)));

in InternalTestCluster?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting it to null is a legitimate thing that a test might do, and I want to assert that this is not what has happened here.

}
});

Expand Down Expand Up @@ -289,6 +291,7 @@ public Settings onNodeStopped(String nodeName) throws Exception {
return Coordinator.addZen1Attribute(false, Settings.builder())
.put(ZEN2_SETTINGS)
.putList(INITIAL_MASTER_NODES_SETTING.getKey(), nodeNames)
.put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), Integer.MAX_VALUE)
.build();
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.discovery.zen.ElectMasterService;
import org.elasticsearch.discovery.zen.ZenDiscovery;
import org.elasticsearch.monitor.jvm.HotThreads;
import org.elasticsearch.test.ESIntegTestCase;
Expand Down Expand Up @@ -125,11 +124,6 @@ public void testNodesFDAfterMasterReelection() throws Exception {

ensureStableCluster(3);

logger.info("--> reducing min master nodes to 2");
assertAcked(client().admin().cluster().prepareUpdateSettings()
.setTransientSettings(Settings.builder().put(ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), 2))
.get());

String master = internalCluster().getMasterName();
String nonMaster = null;
for (String node : internalCluster().getNodeNames()) {
Expand All @@ -154,7 +148,7 @@ public void testNodesFDAfterMasterReelection() throws Exception {
*/
@TestLogging("_root:DEBUG,org.elasticsearch.cluster.service:TRACE,org.elasticsearch.test.disruption:TRACE")
public void testStaleMasterNotHijackingMajority() throws Exception {
// 3 node cluster with unicast discovery and minimum_master_nodes set to the default of 2:
// 3 node cluster with unicast discovery:
final List<String> nodes = startCluster(3);

// Save the current master node as old master node, because that node will get frozen
Expand Down
Loading