From 815d3e701ab21c99c8d5d0cabc2b4a11c7575eee Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Thu, 5 Jul 2018 17:00:27 +0200 Subject: [PATCH 1/3] Smaller aesthetic fixes to InternalTestCluster --- .../test/InternalTestCluster.java | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 51c4f4d1e32f3..87d52e6e24f98 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -263,8 +263,6 @@ public InternalTestCluster(long clusterSeed, Path baseDir, this.nodePrefix = nodePrefix; assert nodePrefix != null; - ArrayList> tmpMockPlugins = new ArrayList<>(mockPlugins); - this.mockPlugins = mockPlugins; @@ -458,14 +456,9 @@ private synchronized NodeAndClient getRandomNodeAndClient() { private synchronized NodeAndClient getRandomNodeAndClient(Predicate predicate) { ensureOpen(); - Collection values = nodes.values().stream().filter(predicate).collect(Collectors.toCollection(ArrayList::new)); - if (!values.isEmpty()) { - int whichOne = random.nextInt(values.size()); - for (NodeAndClient nodeAndClient : values) { - if (whichOne-- == 0) { - return nodeAndClient; - } - } + List values = nodes.values().stream().filter(predicate).collect(Collectors.toList()); + if (values.isEmpty() == false) { + return randomFrom(random, values); } return null; } @@ -476,18 +469,14 @@ private synchronized NodeAndClient getRandomNodeAndClient(Predicate 0) { - startDataOnlyNode(Settings.EMPTY); + startDataOnlyNodes(n - size); } else { - startNode(Settings.EMPTY); + startNodes(n - size); } - } - if (added) { validateClusterFormed(); } } @@ -1649,10 +1638,7 @@ public synchronized String startNode(Settings.Builder settings) { * Starts a node with the given settings and returns it's name. */ public synchronized String startNode(Settings settings) { - final int defaultMinMasterNodes = getMinMasterNodes(getMasterNodesCount() + (Node.NODE_MASTER_SETTING.get(settings) ? 1 : 0)); - NodeAndClient buildNode = buildNode(settings, defaultMinMasterNodes); - startAndPublishNodesAndClients(Collections.singletonList(buildNode)); - return buildNode.name; + return startNodes(settings).get(0); } /** From 790b9cff98f92ccd494ffc9f5a1803fb4c97b804 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Thu, 5 Jul 2018 18:38:19 +0200 Subject: [PATCH 2/3] Handle rapid expansion of master-eligible nodes Adding too many master-eligible nodes at once can fail in setting the min_master_ndoes property before the nodes join --- .../java/org/elasticsearch/test/InternalTestCluster.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 87d52e6e24f98..740e4390d5aac 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -1350,8 +1350,9 @@ private synchronized void startAndPublishNodesAndClients(List nod .filter(nac -> nodes.containsKey(nac.name) == false) // filter out old masters .count(); final int currentMasters = getMasterNodesCount(); - if (autoManageMinMasterNodes && currentMasters > 1 && newMasters > 0) { - // special case for 1 node master - we can't update the min master nodes before we add more nodes. + if (autoManageMinMasterNodes && currentMasters > 0 && newMasters > 0 && + getMinMasterNodes(currentMasters + newMasters) <= currentMasters) { + // if we're adding too many master-eligible nodes at once, we can't update the min master setting before adding the nodes. updateMinMasterNodes(currentMasters + newMasters); } List> futures = nodeAndClients.stream().map(node -> executor.submit(node::startNode)).collect(Collectors.toList()); @@ -1366,7 +1367,8 @@ private synchronized void startAndPublishNodesAndClients(List nod } nodeAndClients.forEach(this::publishNode); - if (autoManageMinMasterNodes && currentMasters == 1 && newMasters > 0) { + if (autoManageMinMasterNodes && currentMasters > 0 && newMasters > 0 && + getMinMasterNodes(currentMasters + newMasters) > currentMasters) { // update once masters have joined validateClusterFormed(); updateMinMasterNodes(currentMasters + newMasters); From 48a88954c8ba622d36b4b29133920a4436017978 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Thu, 5 Jul 2018 18:42:56 +0200 Subject: [PATCH 3/3] it's --- .../java/org/elasticsearch/test/InternalTestCluster.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 740e4390d5aac..79965d79f522d 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -1623,21 +1623,21 @@ public synchronized Set nodesInclude(String index) { } /** - * Starts a node with default settings and returns it's name. + * Starts a node with default settings and returns its name. */ public synchronized String startNode() { return startNode(Settings.EMPTY); } /** - * Starts a node with the given settings builder and returns it's name. + * Starts a node with the given settings builder and returns its name. */ public synchronized String startNode(Settings.Builder settings) { return startNode(settings.build()); } /** - * Starts a node with the given settings and returns it's name. + * Starts a node with the given settings and returns its name. */ public synchronized String startNode(Settings settings) { return startNodes(settings).get(0);