|
@@ -908,28 +908,12 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void closeNode() throws IOException {
|
|
|
- markNodeDataDirsAsPendingForWipe(node);
|
|
|
- node.close();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * closes the current node if not already closed, builds a new node object using the current node settings and starts it
|
|
|
- */
|
|
|
- void restart(RestartCallback callback, boolean clearDataIfNeeded, int minMasterNodes) throws Exception {
|
|
|
- if (!node.isClosed()) {
|
|
|
- closeNode();
|
|
|
- }
|
|
|
- recreateNodeOnRestart(callback, clearDataIfNeeded, minMasterNodes, () -> rebuildUnicastHostFiles(emptyList()));
|
|
|
- startNode();
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
- * rebuilds a new node object using the current node settings and starts it
|
|
|
+ * closes the node and prepares it to be restarted
|
|
|
*/
|
|
|
- void recreateNodeOnRestart(RestartCallback callback, boolean clearDataIfNeeded, int minMasterNodes,
|
|
|
- Runnable onTransportServiceStarted) throws Exception {
|
|
|
+ Settings closeForRestart(RestartCallback callback, int minMasterNodes) throws Exception {
|
|
|
assert callback != null;
|
|
|
+ close();
|
|
|
Settings callbackSettings = callback.onNodeStopped(name);
|
|
|
Settings.Builder newSettings = Settings.builder();
|
|
|
if (callbackSettings != null) {
|
|
@@ -939,12 +923,9 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
assert DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.exists(newSettings.build()) == false : "min master nodes is auto managed";
|
|
|
newSettings.put(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey(), minMasterNodes).build();
|
|
|
}
|
|
|
- if (clearDataIfNeeded) {
|
|
|
- clearDataIfNeeded(callback);
|
|
|
- }
|
|
|
- createNewNode(newSettings.build(), onTransportServiceStarted);
|
|
|
- // make sure cached client points to new node
|
|
|
- resetClient();
|
|
|
+ // delete data folders now, before we start other nodes that may claim it
|
|
|
+ clearDataIfNeeded(callback);
|
|
|
+ return newSettings.build();
|
|
|
}
|
|
|
|
|
|
private void clearDataIfNeeded(RestartCallback callback) throws IOException {
|
|
@@ -958,7 +939,10 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void createNewNode(final Settings newSettings, final Runnable onTransportServiceStarted) {
|
|
|
+ private void recreateNode(final Settings newSettings, final Runnable onTransportServiceStarted) {
|
|
|
+ if (closed.get() == false) {
|
|
|
+ throw new IllegalStateException("node " + name + " should be closed before recreating it");
|
|
|
+ }
|
|
|
// use a new seed to make sure we have new node id
|
|
|
final long newIdSeed = NodeEnvironment.NODE_ID_SEED_SETTING.get(node.settings()) + 1;
|
|
|
Settings finalSettings = Settings.builder()
|
|
@@ -978,6 +962,7 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
onTransportServiceStarted.run();
|
|
|
}
|
|
|
});
|
|
|
+ closed.set(false);
|
|
|
markNodeDataDirsAsNotEligableForWipe(node);
|
|
|
}
|
|
|
|
|
@@ -987,7 +972,8 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
resetClient();
|
|
|
} finally {
|
|
|
closed.set(true);
|
|
|
- closeNode();
|
|
|
+ markNodeDataDirsAsPendingForWipe(node);
|
|
|
+ node.close();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1700,7 +1686,10 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
if (updateMinMaster) {
|
|
|
updateMinMasterNodes(masterNodesCount - 1);
|
|
|
}
|
|
|
- nodeAndClient.restart(callback, true, autoManageMinMasterNodes ? getMinMasterNodes(masterNodesCount) : -1);
|
|
|
+ final Settings newSettings = nodeAndClient.closeForRestart(callback,
|
|
|
+ autoManageMinMasterNodes ? getMinMasterNodes(masterNodesCount) : -1);
|
|
|
+ nodeAndClient.recreateNode(newSettings, () -> rebuildUnicastHostFiles(emptyList()));
|
|
|
+ nodeAndClient.startNode();
|
|
|
if (activeDisruptionScheme != null) {
|
|
|
activeDisruptionScheme.applyToNode(nodeAndClient.name, this);
|
|
|
}
|
|
@@ -1721,19 +1710,20 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
*/
|
|
|
public synchronized void fullRestart(RestartCallback callback) throws Exception {
|
|
|
int numNodesRestarted = 0;
|
|
|
+ final Settings[] newNodeSettings = new Settings[nextNodeId.get()];
|
|
|
Map<Set<Role>, List<NodeAndClient>> nodesByRoles = new HashMap<>();
|
|
|
Set[] rolesOrderedByOriginalStartupOrder = new Set[nextNodeId.get()];
|
|
|
+ final int minMasterNodes = autoManageMinMasterNodes ? getMinMasterNodes(getMasterNodesCount()) : -1;
|
|
|
for (NodeAndClient nodeAndClient : nodes.values()) {
|
|
|
callback.doAfterNodes(numNodesRestarted++, nodeAndClient.nodeClient());
|
|
|
- logger.info("Stopping node [{}] ", nodeAndClient.name);
|
|
|
+ logger.info("Stopping and resetting node [{}] ", nodeAndClient.name);
|
|
|
if (activeDisruptionScheme != null) {
|
|
|
activeDisruptionScheme.removeFromNode(nodeAndClient.name, this);
|
|
|
}
|
|
|
- nodeAndClient.closeNode();
|
|
|
- // delete data folders now, before we start other nodes that may claim it
|
|
|
- nodeAndClient.clearDataIfNeeded(callback);
|
|
|
DiscoveryNode discoveryNode = getInstanceFromNode(ClusterService.class, nodeAndClient.node()).localNode();
|
|
|
- rolesOrderedByOriginalStartupOrder[nodeAndClient.nodeAndClientId] = discoveryNode.getRoles();
|
|
|
+ final Settings newSettings = nodeAndClient.closeForRestart(callback, minMasterNodes);
|
|
|
+ newNodeSettings[nodeAndClient.nodeAndClientId()] = newSettings;
|
|
|
+ rolesOrderedByOriginalStartupOrder[nodeAndClient.nodeAndClientId()] = discoveryNode.getRoles();
|
|
|
nodesByRoles.computeIfAbsent(discoveryNode.getRoles(), k -> new ArrayList<>()).add(nodeAndClient);
|
|
|
}
|
|
|
|
|
@@ -1758,10 +1748,8 @@ public final class InternalTestCluster extends TestCluster {
|
|
|
assert nodesByRoles.values().stream().collect(Collectors.summingInt(List::size)) == 0;
|
|
|
|
|
|
for (NodeAndClient nodeAndClient : startUpOrder) {
|
|
|
- logger.info("resetting node [{}] ", nodeAndClient.name);
|
|
|
- // we already cleared data folders, before starting nodes up
|
|
|
- nodeAndClient.recreateNodeOnRestart(callback, false, autoManageMinMasterNodes ? getMinMasterNodes(getMasterNodesCount()) : -1,
|
|
|
- () -> rebuildUnicastHostFiles(startUpOrder));
|
|
|
+ logger.info("creating node [{}] ", nodeAndClient.name);
|
|
|
+ nodeAndClient.recreateNode(newNodeSettings[nodeAndClient.nodeAndClientId()], () -> rebuildUnicastHostFiles(startUpOrder));
|
|
|
}
|
|
|
|
|
|
startAndPublishNodesAndClients(startUpOrder);
|