summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@yahooinc.com>2022-04-20 09:37:22 +0200
committerHåkon Hallingstad <hakon@yahooinc.com>2022-04-20 09:37:22 +0200
commit13ce3ec709d0eaa74fb93ae843ec949d62802a01 (patch)
tree4d62beefa3aa45bbe38d82493d3573b782e17ef4
parent7bc9a2f5b32f7bb240f91bfec165266c4f98724f (diff)
Trigger saveWantedState when nodes are removed or orphaned wanted states are loaded
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterInfo.java19
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java7
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java25
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeLookup.java4
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeStateGatherer.java6
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/RemoteClusterControllerTask.java8
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java22
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/DatabaseHandler.java19
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeListener.java25
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeStateOrHostInfoChangeHandler.java21
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/SlobrokListener.java (renamed from clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeAddedOrRemovedListener.java)4
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequest.java12
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStatesForClusterRequest.java2
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/WantedStateSetter.java4
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java8
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/SlobrokClient.java4
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java6
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java8
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java4
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java13
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java13
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java4
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java8
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java22
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java4
25 files changed, 155 insertions, 117 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterInfo.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterInfo.java
index da5114b8675..2cfaf64fe83 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterInfo.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterInfo.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.clustercontroller.core;
import com.yahoo.vdslib.distribution.ConfiguredNode;
import com.yahoo.vdslib.distribution.Distribution;
import com.yahoo.vdslib.state.Node;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.util.Collection;
import java.util.Collections;
@@ -52,15 +53,23 @@ public class ClusterInfo {
boolean hasConfiguredNode(int index) { return nodes.containsKey(index); }
/** Sets the nodes which belongs to this cluster */
- void setNodes(Collection<ConfiguredNode> newNodes, ContentCluster owner, Distribution distribution) {
+ void setNodes(Collection<ConfiguredNode> newNodes, ContentCluster owner,
+ Distribution distribution, NodeListener nodeListener) {
// Remove info for removed nodes
Set<ConfiguredNode> newNodesSet = new HashSet<>(newNodes);
for (ConfiguredNode existingNode : this.nodes.values()) {
if ( ! newNodesSet.contains(existingNode)) {
- Node existingStorageNode = storageNodeInfo.remove(existingNode.index()).getNode();
- Node existingDistributorNode = distributorNodeInfo.remove(existingNode.index()).getNode();
- allNodeInfo.remove(existingDistributorNode);
- allNodeInfo.remove(existingStorageNode);
+ {
+ Node existingStorageNode = storageNodeInfo.remove(existingNode.index()).getNode();
+ allNodeInfo.remove(existingStorageNode);
+ nodeListener.handleRemovedNode(existingStorageNode);
+ }
+
+ {
+ Node existingDistributorNode = distributorNodeInfo.remove(existingNode.index()).getNode();
+ allNodeInfo.remove(existingDistributorNode);
+ nodeListener.handleRemovedNode(existingDistributorNode);
+ }
}
}
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java
index 579417cb8ae..f2a4a9736c3 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java
@@ -10,6 +10,7 @@ import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.core.status.statuspage.HtmlTable;
import com.yahoo.vespa.clustercontroller.core.status.statuspage.VdsClusterHtmlRenderer;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.SetUnitStateRequest;
@@ -42,7 +43,7 @@ public class ContentCluster {
if (configuredNodes == null) throw new IllegalArgumentException("Nodes must be set");
this.clusterName = clusterName;
this.distribution = distribution;
- setNodes(configuredNodes);
+ setNodes(configuredNodes, new NodeListener() {});
}
// TODO move out, this doesn't belong in a domain model class
@@ -110,8 +111,8 @@ public class ContentCluster {
}
/** Sets the configured nodes of this cluster */
- public final void setNodes(Collection<ConfiguredNode> configuredNodes) {
- clusterInfo.setNodes(configuredNodes, this, distribution);
+ public final void setNodes(Collection<ConfiguredNode> configuredNodes, NodeListener nodeListener) {
+ clusterInfo.setNodes(configuredNodes, this, distribution, nodeListener);
}
public void setStartTimestamp(Node n, long startTimestamp) {
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java
index 1d98b9fe831..7f385c6077c 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java
@@ -12,8 +12,8 @@ import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler;
import com.yahoo.vespa.clustercontroller.core.database.ZooKeeperDatabaseFactory;
import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.core.listeners.SystemStateListener;
import com.yahoo.vespa.clustercontroller.core.rpc.RPCCommunicator;
import com.yahoo.vespa.clustercontroller.core.rpc.RpcServer;
@@ -47,7 +47,7 @@ import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAddedOrRemovedListener, SystemStateListener,
+public class FleetController implements NodeListener, SlobrokListener, SystemStateListener,
Runnable, RemoteClusterControllerTaskScheduler {
private static final Logger logger = Logger.getLogger(FleetController.class.getName());
@@ -332,6 +332,13 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd
}
@Override
+ public void handleRemovedNode(Node node) {
+ verifyInControllerThread();
+ // Prune orphaned wanted states
+ wantedStateChanged = true;
+ }
+
+ @Override
public void handleUpdatedHostInfo(NodeInfo nodeInfo, HostInfo newHostInfo) {
verifyInControllerThread();
triggerBundleRecomputationIfResourceExhaustionStateChanged(nodeInfo, newHostInfo);
@@ -511,7 +518,7 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd
eventLog.setMaxSize(options.eventLogMaxSize, options.eventNodeLogMaxSize);
cluster.setPollingFrequency(options.statePollingFrequency);
cluster.setDistribution(options.storageDistribution);
- cluster.setNodes(options.nodes);
+ cluster.setNodes(options.nodes, databaseContext.getNodeStateUpdateListener());
database.setZooKeeperAddress(options.zooKeeperServerAddress, databaseContext);
database.setZooKeeperSessionTimeout(options.zooKeeperSessionTimeout, databaseContext);
stateGatherer.setMaxSlobrokDisconnectGracePeriod(options.maxSlobrokDisconnectGracePeriod);
@@ -790,8 +797,8 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd
@Override public boolean inMasterMoratorium() { return inMasterMoratorium; }
};
- context.nodeStateOrHostInfoChangeHandler = this;
- context.nodeAddedOrRemovedListener = this;
+ context.nodeListener = this;
+ context.slobrokListener = this;
return context;
}
@@ -1095,7 +1102,7 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd
didWork = true;
}
if (wantedStateChanged) {
- database.saveWantedStates(databaseContext);
+ didWork |= database.saveWantedStates(databaseContext);
wantedStateChanged = false;
}
} else {
@@ -1150,9 +1157,9 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd
@Override
public FleetController getFleetController() { return FleetController.this; }
@Override
- public NodeAddedOrRemovedListener getNodeAddedOrRemovedListener() { return FleetController.this; }
+ public SlobrokListener getNodeAddedOrRemovedListener() { return FleetController.this; }
@Override
- public NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener() { return FleetController.this; }
+ public NodeListener getNodeStateUpdateListener() { return FleetController.this; }
};
public void waitForCompleteCycle(long timeoutMS) {
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeLookup.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeLookup.java
index cdf8b24e72d..882ae8894fa 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeLookup.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeLookup.java
@@ -1,7 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.clustercontroller.core;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
/**
* Interface for a node lookup service, such as slobrok, config, or tier controller.
@@ -10,7 +10,7 @@ public interface NodeLookup {
void shutdown();
- boolean updateCluster(ContentCluster cluster, NodeAddedOrRemovedListener listener);
+ boolean updateCluster(ContentCluster cluster, SlobrokListener listener);
/**
* Returns whether the lookup instance has been able to bootstrap itself with information about nodes.
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeStateGatherer.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeStateGatherer.java
index cb22271b401..69e97de84f9 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeStateGatherer.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeStateGatherer.java
@@ -7,7 +7,7 @@ import java.util.logging.Level;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.util.LinkedList;
import java.util.List;
@@ -54,7 +54,7 @@ public class NodeStateGatherer {
* Sends state requests to nodes that does not have one pending and is due
* for another attempt.
*/
- public boolean sendMessages(ContentCluster cluster, Communicator communicator, NodeStateOrHostInfoChangeHandler listener) {
+ public boolean sendMessages(ContentCluster cluster, Communicator communicator, NodeListener listener) {
boolean sentAnyMessages = false;
long currentTime = timer.getCurrentTimeInMillis();
for (NodeInfo info : cluster.getNodeInfos()) {
@@ -93,7 +93,7 @@ public class NodeStateGatherer {
}
/** Reads replies to get node state requests and create events. */
- public boolean processResponses(NodeStateOrHostInfoChangeHandler listener) {
+ public boolean processResponses(NodeListener listener) {
boolean processedAnyResponses = false;
long currentTime = timer.getCurrentTimeInMillis();
synchronized(monitor) {
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/RemoteClusterControllerTask.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/RemoteClusterControllerTask.java
index 949ad6f56a2..3c2143818e3 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/RemoteClusterControllerTask.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/RemoteClusterControllerTask.java
@@ -2,8 +2,8 @@
package com.yahoo.vespa.clustercontroller.core;
import com.yahoo.vdslib.state.ClusterState;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.time.Instant;
import java.util.Optional;
@@ -15,8 +15,8 @@ public abstract class RemoteClusterControllerTask {
public ClusterState currentConsolidatedState;
public ClusterStateBundle publishedClusterStateBundle;
public MasterInterface masterInfo;
- public NodeStateOrHostInfoChangeHandler nodeStateOrHostInfoChangeHandler;
- public NodeAddedOrRemovedListener nodeAddedOrRemovedListener;
+ public NodeListener nodeListener;
+ public SlobrokListener slobrokListener;
}
private final Object monitor = new Object();
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java
index 47b5b38edc8..4c832592422 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java
@@ -8,7 +8,7 @@ import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.util.Map;
import java.util.Set;
@@ -113,7 +113,7 @@ public class StateChangeHandler {
public void handleNewReportedNodeState(final ClusterState currentClusterState,
final NodeInfo node,
final NodeState reportedState,
- final NodeStateOrHostInfoChangeHandler nodeListener)
+ final NodeListener nodeListener)
{
final NodeState currentState = currentClusterState.getNodeState(node.getNode());
final Level level = (currentState.equals(reportedState) && node.getVersion() == 0) ? Level.FINEST : Level.FINE;
@@ -164,7 +164,7 @@ public class StateChangeHandler {
public void handleMissingNode(final ClusterState currentClusterState,
final NodeInfo node,
- final NodeStateOrHostInfoChangeHandler nodeListener) {
+ final NodeListener nodeListener) {
final long timeNow = timer.getCurrentTimeInMillis();
if (node.getLatestNodeStateRequestTime() != null) {
@@ -241,7 +241,7 @@ public class StateChangeHandler {
// `--> this will require adding more event edges and premature crash handling to it. Which is fine.
public boolean watchTimers(final ContentCluster cluster,
final ClusterState currentClusterState,
- final NodeStateOrHostInfoChangeHandler nodeListener)
+ final NodeListener nodeListener)
{
boolean triggeredAnyTimers = false;
final long currentTime = timer.getCurrentTimeInMillis();
@@ -257,7 +257,7 @@ public class StateChangeHandler {
}
private boolean handleTimeDependentOpsForNode(final ClusterState currentClusterState,
- final NodeStateOrHostInfoChangeHandler nodeListener,
+ final NodeListener nodeListener,
final long currentTime,
final NodeInfo node)
{
@@ -334,7 +334,7 @@ public class StateChangeHandler {
}
private boolean reportDownIfOutdatedSlobrokNode(ClusterState currentClusterState,
- NodeStateOrHostInfoChangeHandler nodeListener,
+ NodeListener nodeListener,
long currentTime,
NodeInfo node,
NodeState lastReportedState)
@@ -379,7 +379,7 @@ public class StateChangeHandler {
private void updateNodeInfoFromReportedState(final NodeInfo node,
final NodeState currentState,
final NodeState reportedState,
- final NodeStateOrHostInfoChangeHandler nodeListener) {
+ final NodeListener nodeListener) {
final long timeNow = timer.getCurrentTimeInMillis();
log.log(Level.FINE, () -> String.format("Finding new cluster state entry for %s switching state %s", node, currentState.getTextualDifference(reportedState)));
@@ -400,7 +400,7 @@ public class StateChangeHandler {
private void markNodeUnstableIfDownEdgeDuringInit(final NodeInfo node,
final NodeState currentState,
final NodeState reportedState,
- final NodeStateOrHostInfoChangeHandler nodeListener,
+ final NodeListener nodeListener,
final long timeNow) {
if (currentState.getState().equals(State.INITIALIZING)
&& reportedState.getState().oneOf("ds")
@@ -419,7 +419,7 @@ public class StateChangeHandler {
private boolean handleImplicitCrashEdgeFromReverseInitProgress(final NodeInfo node,
final NodeState currentState,
final NodeState reportedState,
- final NodeStateOrHostInfoChangeHandler nodeListener,
+ final NodeListener nodeListener,
final long timeNow) {
if (currentState.getState().equals(State.INITIALIZING) &&
(reportedState.getState().equals(State.INITIALIZING) && reportedState.getInitProgress() < currentState.getInitProgress()))
@@ -438,7 +438,7 @@ public class StateChangeHandler {
}
private boolean handleReportedNodeCrashEdge(NodeInfo node, NodeState currentState,
- NodeState reportedState, NodeStateOrHostInfoChangeHandler nodeListener,
+ NodeState reportedState, NodeListener nodeListener,
long timeNow) {
if (nodeUpToDownEdge(node, currentState, reportedState)) {
node.setTransitionTime(timeNow);
@@ -467,7 +467,7 @@ public class StateChangeHandler {
&& (node.getWantedState().getState().equals(State.RETIRED) || !reportedState.getState().equals(State.INITIALIZING));
}
- private boolean handlePrematureCrash(NodeInfo node, NodeStateOrHostInfoChangeHandler changeListener) {
+ private boolean handlePrematureCrash(NodeInfo node, NodeListener changeListener) {
node.setPrematureCrashCount(node.getPrematureCrashCount() + 1);
if (disableUnstableNodes && node.getPrematureCrashCount() > maxPrematureCrashes) {
NodeState wantedState = new NodeState(node.getNode().getType(), State.DOWN)
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/DatabaseHandler.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/DatabaseHandler.java
index 9a528baf875..01b8ed48c80 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/DatabaseHandler.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/DatabaseHandler.java
@@ -10,8 +10,8 @@ import com.yahoo.vespa.clustercontroller.core.FleetControllerContext;
import com.yahoo.vespa.clustercontroller.core.FleetController;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
import com.yahoo.vespa.clustercontroller.core.Timer;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import org.apache.zookeeper.KeeperException;
import java.io.PrintWriter;
@@ -32,8 +32,8 @@ public class DatabaseHandler {
public interface DatabaseContext {
ContentCluster getCluster();
FleetController getFleetController();
- NodeAddedOrRemovedListener getNodeAddedOrRemovedListener();
- NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener();
+ SlobrokListener getNodeAddedOrRemovedListener();
+ NodeListener getNodeStateUpdateListener();
}
private static class Data {
@@ -425,7 +425,7 @@ public class DatabaseHandler {
}
}
- public void saveWantedStates(DatabaseContext databaseContext) {
+ public boolean saveWantedStates(DatabaseContext databaseContext) {
fleetControllerContext.log(logger, Level.FINE, () -> "Checking whether wanted states have changed compared to zookeeper version.");
Map<Node, NodeState> wantedStates = new TreeMap<>();
for (NodeInfo info : databaseContext.getCluster().getNodeInfos()) {
@@ -443,6 +443,9 @@ public class DatabaseHandler {
fleetControllerContext.log(logger, Level.FINE, () -> "Scheduling new wanted states to be stored into zookeeper.");
pendingStore.wantedStates = wantedStates;
doNextZooKeeperTask(databaseContext);
+ return true;
+ } else {
+ return false;
}
}
@@ -465,7 +468,11 @@ public class DatabaseHandler {
boolean altered = false;
for (Node node : wantedStates.keySet()) {
NodeInfo nodeInfo = databaseContext.getCluster().getNodeInfo(node);
- if (nodeInfo == null) continue; // ignore wanted state of nodes which doesn't exist
+ if (nodeInfo == null) {
+ databaseContext.getNodeStateUpdateListener().handleRemovedNode(node);
+ altered = true;
+ continue;
+ }
NodeState wantedState = wantedStates.get(node);
if ( ! nodeInfo.getUserWantedState().equals(wantedState)) {
nodeInfo.setWantedState(wantedState);
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeListener.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeListener.java
new file mode 100644
index 00000000000..351b68b3b57
--- /dev/null
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeListener.java
@@ -0,0 +1,25 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.clustercontroller.core.listeners;
+
+import com.yahoo.vdslib.state.Node;
+import com.yahoo.vdslib.state.NodeState;
+import com.yahoo.vespa.clustercontroller.core.NodeInfo;
+import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
+
+/**
+ * Implemented by classes wanting events when there are node changes.
+ */
+public interface NodeListener {
+
+ default void handleNewNodeState(NodeInfo currentInfo, NodeState newState) {}
+ default void handleNewWantedNodeState(NodeInfo node, NodeState newState) {}
+
+ /** Invoked after NodeInfo has been removed from the content cluster. */
+ default void handleRemovedNode(Node node) {}
+
+ /**
+ * For every getnodestate RPC call, handleUpdatedHostInfo() will be called with the host info JSON string.
+ */
+ default void handleUpdatedHostInfo(NodeInfo node, HostInfo newHostInfo) {}
+
+}
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeStateOrHostInfoChangeHandler.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeStateOrHostInfoChangeHandler.java
deleted file mode 100644
index b76b46b216b..00000000000
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeStateOrHostInfoChangeHandler.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.clustercontroller.core.listeners;
-
-import com.yahoo.vdslib.state.NodeState;
-import com.yahoo.vespa.clustercontroller.core.NodeInfo;
-import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
-
-/**
- * Implemented by classes wanting events when node states changes.
- */
-public interface NodeStateOrHostInfoChangeHandler {
-
- void handleNewNodeState(NodeInfo currentInfo, NodeState newState);
- void handleNewWantedNodeState(NodeInfo node, NodeState newState);
-
- /**
- * For every getnodestate RPC call, handleUpdatedHostInfo() will be called with the host info JSON string.
- */
- void handleUpdatedHostInfo(NodeInfo node, HostInfo newHostInfo);
-
-}
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeAddedOrRemovedListener.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/SlobrokListener.java
index d811708c999..5a397cc4935 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/NodeAddedOrRemovedListener.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/listeners/SlobrokListener.java
@@ -4,9 +4,9 @@ package com.yahoo.vespa.clustercontroller.core.listeners;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
/**
- * Listeners for new nodes detected.
+ * Implemented by classes that wants to be notified of Slobrok events.
*/
-public interface NodeAddedOrRemovedListener {
+public interface SlobrokListener {
void handleNewNode(NodeInfo node);
void handleMissingNode(NodeInfo node);
void handleNewRpcAddress(NodeInfo node);
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequest.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequest.java
index 431c207af5c..ddbda2bf776 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequest.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequest.java
@@ -11,7 +11,7 @@ import com.yahoo.vespa.clustercontroller.core.ContentCluster;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
import com.yahoo.vespa.clustercontroller.core.NodeStateChangeChecker;
import com.yahoo.vespa.clustercontroller.core.RemoteClusterControllerTask;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.core.restapiv2.Id;
import com.yahoo.vespa.clustercontroller.core.restapiv2.MissingIdException;
import com.yahoo.vespa.clustercontroller.core.restapiv2.Request;
@@ -62,7 +62,7 @@ public class SetNodeStateRequest extends Request<SetResponse> {
condition,
newStates,
id.getNode(),
- context.nodeStateOrHostInfoChangeHandler,
+ context.nodeListener,
context.currentConsolidatedState,
context.masterInfo.inMasterMoratorium(),
probe);
@@ -112,7 +112,7 @@ public class SetNodeStateRequest extends Request<SetResponse> {
SetUnitStateRequest.Condition condition,
Map<String, UnitState> newStates,
Node node,
- NodeStateOrHostInfoChangeHandler stateListener,
+ NodeListener stateListener,
ClusterState currentClusterState,
boolean inMasterMoratorium,
boolean probe) throws StateRestApiException {
@@ -159,7 +159,7 @@ public class SetNodeStateRequest extends Request<SetResponse> {
SetUnitStateRequest.Condition condition,
NodeInfo nodeInfo,
ContentCluster cluster,
- NodeStateOrHostInfoChangeHandler stateListener,
+ NodeListener stateListener,
boolean probe) {
if (result.settingWantedStateIsAllowed()) {
setNewWantedState(nodeInfo, newWantedState, stateListener, probe);
@@ -186,7 +186,7 @@ public class SetNodeStateRequest extends Request<SetResponse> {
private static void setDistributorWantedState(ContentCluster cluster,
int index,
NodeState newStorageWantedState,
- NodeStateOrHostInfoChangeHandler stateListener,
+ NodeListener stateListener,
boolean probe) {
Node distributorNode = new Node(NodeType.DISTRIBUTOR, index);
NodeInfo nodeInfo = cluster.getNodeInfo(distributorNode);
@@ -224,7 +224,7 @@ public class SetNodeStateRequest extends Request<SetResponse> {
private static void setNewWantedState(NodeInfo nodeInfo,
NodeState newWantedState,
- NodeStateOrHostInfoChangeHandler stateListener,
+ NodeListener stateListener,
boolean probe) {
if (probe) return;
nodeInfo.setWantedState(newWantedState);
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStatesForClusterRequest.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStatesForClusterRequest.java
index 55ac75957bc..1cc8f2860c6 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStatesForClusterRequest.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStatesForClusterRequest.java
@@ -70,7 +70,7 @@ public class SetNodeStatesForClusterRequest extends Request<SetResponse> {
condition,
newStates,
node,
- context.nodeStateOrHostInfoChangeHandler,
+ context.nodeListener,
context.currentConsolidatedState,
context.masterInfo.inMasterMoratorium(),
probe);
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/WantedStateSetter.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/WantedStateSetter.java
index 8095d37d641..51b2f1cfe4f 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/WantedStateSetter.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/WantedStateSetter.java
@@ -4,7 +4,7 @@ package com.yahoo.vespa.clustercontroller.core.restapiv2.requests;
import com.yahoo.vdslib.state.ClusterState;
import com.yahoo.vdslib.state.Node;
import com.yahoo.vespa.clustercontroller.core.ContentCluster;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.errors.StateRestApiException;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.SetUnitStateRequest;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.response.SetResponse;
@@ -21,7 +21,7 @@ public interface WantedStateSetter {
SetUnitStateRequest.Condition condition,
Map<String, UnitState> newStates,
Node node,
- NodeStateOrHostInfoChangeHandler stateListener,
+ NodeListener stateListener,
ClusterState currentClusterState,
boolean inMasterMoratorium,
boolean probe) throws StateRestApiException;
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
index 60cd3c06893..6e416ce4906 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
@@ -27,8 +27,8 @@ import com.yahoo.vespa.clustercontroller.core.ContentCluster;
import com.yahoo.vespa.clustercontroller.core.MasterElectionHandler;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
import com.yahoo.vespa.clustercontroller.core.Timer;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -186,8 +186,8 @@ public class RpcServer {
}
public boolean handleRpcRequests(ContentCluster cluster, ClusterState systemState,
- NodeStateOrHostInfoChangeHandler changeListener,
- NodeAddedOrRemovedListener addedListener)
+ NodeListener changeListener,
+ SlobrokListener addedListener)
{
boolean handledAnyRequests = false;
if (!isConnected()) {
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/SlobrokClient.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/SlobrokClient.java
index 589e9b25e54..c88bf71af09 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/SlobrokClient.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/SlobrokClient.java
@@ -13,7 +13,7 @@ import com.yahoo.vespa.clustercontroller.core.FleetControllerContext;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
import com.yahoo.vespa.clustercontroller.core.NodeLookup;
import com.yahoo.vespa.clustercontroller.core.Timer;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
import java.util.Iterator;
import java.util.LinkedList;
@@ -78,7 +78,7 @@ public class SlobrokClient implements NodeLookup {
}
@Override
- public boolean updateCluster(ContentCluster cluster, NodeAddedOrRemovedListener listener) {
+ public boolean updateCluster(ContentCluster cluster, SlobrokListener listener) {
if (mirror == null) return false;
int mirrorVersion = mirror.updates();
if (freshMirror) {
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java
index ba2a4352d51..f8d41405e85 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java
@@ -8,7 +8,7 @@ import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import java.util.Collection;
import java.util.HashSet;
@@ -57,7 +57,7 @@ public class ClusterFixture {
private void doReportNodeState(final Node node, final NodeState nodeState) {
final ClusterState stateBefore = rawGeneratedClusterState();
- NodeStateOrHostInfoChangeHandler handler = mock(NodeStateOrHostInfoChangeHandler.class);
+ NodeListener handler = mock(NodeListener.class);
NodeInfo nodeInfo = cluster.getNodeInfo(node);
nodeStateChangeHandler.handleNewReportedNodeState(stateBefore, nodeInfo, nodeState, handler);
@@ -169,7 +169,7 @@ public class ClusterFixture {
Set<ConfiguredNode> configuredNodes = new HashSet<>(cluster.getConfiguredNodes().values());
configuredNodes.remove(new ConfiguredNode(nodeIndex, false));
configuredNodes.add(new ConfiguredNode(nodeIndex, true));
- cluster.setNodes(configuredNodes);
+ cluster.setNodes(configuredNodes, new NodeListener() {});
return this;
}
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java
index a621b0f565a..c461bb125dd 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java
@@ -4,8 +4,8 @@ package com.yahoo.vespa.clustercontroller.core;
import com.yahoo.vespa.clustercontroller.core.database.Database;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseFactory;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -52,12 +52,12 @@ public class DatabaseHandlerTest {
}
@Override
- public NodeAddedOrRemovedListener getNodeAddedOrRemovedListener() {
+ public SlobrokListener getNodeAddedOrRemovedListener() {
return null;
}
@Override
- public NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener() {
+ public NodeListener getNodeStateUpdateListener() {
return null;
}
};
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java
index e999c5b2011..3127201a342 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java
@@ -6,7 +6,7 @@ import com.yahoo.vdslib.state.ClusterState;
import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.State;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
import java.util.ArrayList;
import java.util.List;
@@ -133,7 +133,7 @@ public class DummyCommunicator implements Communicator, NodeLookup {
}
@Override
- public boolean updateCluster(ContentCluster cluster, NodeAddedOrRemovedListener listener) {
+ public boolean updateCluster(ContentCluster cluster, SlobrokListener listener) {
if (newNodes != null) {
List<Node> tmp = newNodes;
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java
index 254f863e9ea..1d4b2a73560 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java
@@ -7,20 +7,19 @@ import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
-
-import static com.yahoo.vespa.clustercontroller.core.matchers.EventForNode.eventForNode;
-import static com.yahoo.vespa.clustercontroller.core.matchers.NodeEventWithDescription.nodeEventWithDescription;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import org.junit.Test;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import static com.yahoo.vespa.clustercontroller.core.matchers.EventForNode.eventForNode;
+import static com.yahoo.vespa.clustercontroller.core.matchers.NodeEventWithDescription.nodeEventWithDescription;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.AllOf.allOf;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -179,7 +178,7 @@ public class GroupAutoTakedownTest {
// However, once grace period expires the group should be taken down.
fixture.timer.advanceTime(1001);
- NodeStateOrHostInfoChangeHandler changeListener = mock(NodeStateOrHostInfoChangeHandler.class);
+ NodeListener changeListener = mock(NodeListener.class);
fixture.nodeStateChangeHandler.watchTimers(
fixture.cluster, fixture.annotatedGeneratedClusterState().getClusterState(), changeListener);
@@ -253,7 +252,7 @@ public class GroupAutoTakedownTest {
nodes.add(new ConfiguredNode(5, true));
// TODO this should ideally also set the retired flag in the distribution
// config, but only the ConfiguredNodes are actually looked at currently.
- fixture.cluster.setNodes(nodes);
+ fixture.cluster.setNodes(nodes, new NodeListener() {});
assertEquals("distributor:6 storage:6 .4.s:d .5.s:r",
stateAfterStorageTransition(fixture, 5, State.UP));
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java
index 95c097c5920..699a35a190c 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java
@@ -9,7 +9,7 @@ import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.core.mocks.TestEventLog;
import com.yahoo.vespa.clustercontroller.core.testutils.LogFormatter;
import org.junit.Before;
@@ -34,7 +34,7 @@ public class StateChangeHandlerTest {
int maxPrematureCrashes = 3;
}
- private static class TestNodeStateOrHostInfoChangeHandler implements NodeStateOrHostInfoChangeHandler {
+ private static class TestNodeListener implements NodeListener {
LinkedList<String> events = new LinkedList<>();
@@ -49,6 +49,11 @@ public class StateChangeHandlerTest {
}
@Override
+ public void handleRemovedNode(Node node) {
+ events.add("removed: " + node);
+ }
+
+ @Override
public void handleUpdatedHostInfo(NodeInfo node, HostInfo newHostInfo) {
events.add(node + " - " + newHostInfo);
}
@@ -68,7 +73,7 @@ public class StateChangeHandlerTest {
private Config config;
private ContentCluster cluster;
private StateChangeHandler nodeStateChangeHandler;
- private TestNodeStateOrHostInfoChangeHandler nodeStateUpdateListener;
+ private TestNodeListener nodeStateUpdateListener;
private final ClusterStateGenerator.Params params = new ClusterStateGenerator.Params();
@Before
@@ -88,7 +93,7 @@ public class StateChangeHandlerTest {
.maxPrematureCrashes(config.maxPrematureCrashes)
.transitionTimes(5000)
.cluster(cluster);
- nodeStateUpdateListener = new TestNodeStateOrHostInfoChangeHandler();
+ nodeStateUpdateListener = new TestNodeListener();
}
private ClusterState currentClusterState() {
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java
index a5bb65e11d0..5a33414c955 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java
@@ -1294,7 +1294,7 @@ public class StateChangeTest extends FleetControllerTest {
NodeState newNodeState = new NodeState(NodeType.STORAGE, State.MAINTENANCE);
NodeInfo nodeInfo = ctx.cluster.getNodeInfo(new Node(NodeType.STORAGE, 0));
nodeInfo.setWantedState(newNodeState);
- ctx.nodeStateOrHostInfoChangeHandler.handleNewWantedNodeState(nodeInfo, newNodeState);
+ ctx.nodeListener.handleNewWantedNodeState(nodeInfo, newNodeState);
invoked = true;
}
}
@@ -1312,7 +1312,7 @@ public class StateChangeTest extends FleetControllerTest {
NodeState newNodeState = new NodeState(NodeType.STORAGE, State.DOWN);
NodeInfo nodeInfo = ctx.cluster.getNodeInfo(new Node(NodeType.STORAGE, 0));
nodeInfo.setWantedState(newNodeState);
- ctx.nodeStateOrHostInfoChangeHandler.handleNewWantedNodeState(nodeInfo, newNodeState);
+ ctx.nodeListener.handleNewWantedNodeState(nodeInfo, newNodeState);
invoked = true;
}
}
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java
index 913485913bf..1832f1132ac 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java
@@ -6,8 +6,8 @@ import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -69,12 +69,12 @@ public class SystemStateBroadcasterTest {
}
@Override
- public NodeAddedOrRemovedListener getNodeAddedOrRemovedListener() {
+ public SlobrokListener getNodeAddedOrRemovedListener() {
return null;
}
@Override
- public NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener() {
+ public NodeListener getNodeStateUpdateListener() {
return null;
}
};
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java
index 95071931a75..f53b2898145 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java
@@ -2,11 +2,12 @@
package com.yahoo.vespa.clustercontroller.core.restapiv2;
import com.yahoo.vdslib.state.ClusterState;
+import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vespa.clustercontroller.core.*;
import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
public class ClusterControllerMock implements RemoteClusterControllerTaskScheduler {
public RemoteClusterControllerTask.Context context = new RemoteClusterControllerTask.Context();
@@ -40,16 +41,21 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul
return fleetControllerMaster;
}
};
- context.nodeStateOrHostInfoChangeHandler = new NodeStateOrHostInfoChangeHandler() {
+ context.nodeListener = new NodeListener() {
@Override
public void handleNewNodeState(NodeInfo currentInfo, NodeState newState) {
- events.append("newNodeState(").append(currentInfo.getNode()).append(": ").append(newState).append("\n");
+ events.append("newNodeState(").append(currentInfo.getNode()).append(": ").append(newState).append('\n');
}
@Override
public void handleNewWantedNodeState(NodeInfo node, NodeState newState) {
- events.append("newWantedNodeState(").append(node.getNode()).append(": ").append(newState).append("\n");
+ events.append("newWantedNodeState(").append(node.getNode()).append(": ").append(newState).append('\n');
+ }
+
+ @Override
+ public void handleRemovedNode(Node node) {
+ events.append("handleRemovedNode(").append(node).append(")\n");
}
@Override
@@ -59,7 +65,7 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul
}
};
- context.nodeAddedOrRemovedListener = new NodeAddedOrRemovedListener() {
+ context.slobrokListener = new SlobrokListener() {
@Override
public void handleNewNode(NodeInfo node) {
@@ -68,12 +74,12 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul
@Override
public void handleMissingNode(NodeInfo node) {
- events.append("newMissingNode(").append(node.getNode()).append("\n");
+ events.append("newMissingNode(").append(node.getNode()).append('\n');
}
@Override
public void handleNewRpcAddress(NodeInfo node) {
- events.append("newRpcAddress(").append(node.getNode()).append("\n");
+ events.append("newRpcAddress(").append(node.getNode()).append('\n');
}
@Override
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java
index 090e80361e5..9f14b2e71d2 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java
@@ -10,7 +10,7 @@ import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.clustercontroller.core.ContentCluster;
import com.yahoo.vespa.clustercontroller.core.NodeInfo;
import com.yahoo.vespa.clustercontroller.core.NodeStateChangeChecker;
-import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler;
+import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.errors.StateRestApiException;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.SetUnitStateRequest;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.response.SetResponse;
@@ -38,7 +38,7 @@ public class SetNodeStateRequestTest {
private final UnitState unitState = mock(UnitState.class);
private final int NODE_INDEX = 2;
private final Node storageNode = new Node(NodeType.STORAGE, NODE_INDEX);
- private final NodeStateOrHostInfoChangeHandler stateListener = mock(NodeStateOrHostInfoChangeHandler.class);
+ private final NodeListener stateListener = mock(NodeListener.class);
private final ClusterState currentClusterState = mock(ClusterState.class);
private boolean inMasterMoratorium = false;
private boolean probe = false;