summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/cluster')
-rw-r--r--container-search/src/main/java/com/yahoo/search/cluster/BaseNodeMonitor.java16
-rw-r--r--container-search/src/main/java/com/yahoo/search/cluster/ClusterMonitor.java23
-rw-r--r--container-search/src/main/java/com/yahoo/search/cluster/TrafficNodeMonitor.java10
3 files changed, 27 insertions, 22 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/cluster/BaseNodeMonitor.java b/container-search/src/main/java/com/yahoo/search/cluster/BaseNodeMonitor.java
index 59674d25402..dd01d895963 100644
--- a/container-search/src/main/java/com/yahoo/search/cluster/BaseNodeMonitor.java
+++ b/container-search/src/main/java/com/yahoo/search/cluster/BaseNodeMonitor.java
@@ -26,25 +26,25 @@ public abstract class BaseNodeMonitor<T> {
/** The object representing the monitored node */
protected T node;
- protected boolean isWorking=true;
+ protected boolean isWorking = true;
/** Whether this node is quarantined for unstability */
- protected boolean isQuarantined=false;
+ protected boolean isQuarantined = false;
/** The last time this node failed, in ms */
- protected long failedAt=0;
+ protected long failedAt = 0;
/** The last time this node responded (failed or succeeded), in ms */
- protected long respondedAt=0;
+ protected long respondedAt = 0;
/** The last time this node responded successfully */
- protected long succeededAt=0;
+ protected long succeededAt = 0;
/** The configuration of this monitor */
protected MonitorConfiguration configuration;
/** Is the node we monitor part of an internal Vespa cluster or not */
- private boolean internal=false;
+ private boolean internal;
public BaseNodeMonitor(boolean internal) {
this.internal=internal;
@@ -54,10 +54,12 @@ public abstract class BaseNodeMonitor<T> {
/**
* Returns whether this node is currently in a state suitable
- * for receiving traffic. As far as we know, that is
+ * for receiving traffic (default true)
*/
public boolean isWorking() { return isWorking; }
+ /** @deprecated Not used */
+ @Deprecated // TODO: Remove on Vespa 8
public boolean isQuarantined() { return isQuarantined; }
/**
diff --git a/container-search/src/main/java/com/yahoo/search/cluster/ClusterMonitor.java b/container-search/src/main/java/com/yahoo/search/cluster/ClusterMonitor.java
index ac0c8375f04..22c7f59872c 100644
--- a/container-search/src/main/java/com/yahoo/search/cluster/ClusterMonitor.java
+++ b/container-search/src/main/java/com/yahoo/search/cluster/ClusterMonitor.java
@@ -22,9 +22,9 @@ import java.util.logging.Logger;
*/
public class ClusterMonitor<T> {
- private MonitorConfiguration configuration = new MonitorConfiguration();
+ private final MonitorConfiguration configuration = new MonitorConfiguration();
- private static Logger log=Logger.getLogger(ClusterMonitor.class.getName());
+ private static Logger log = Logger.getLogger(ClusterMonitor.class.getName());
private NodeManager<T> nodeManager;
@@ -33,7 +33,7 @@ public class ClusterMonitor<T> {
private volatile boolean shutdown = false;
/** A map from Node to corresponding MonitoredNode */
- private final Map<T, BaseNodeMonitor<T>> nodeMonitors = Collections.synchronizedMap(new java.util.LinkedHashMap<>());
+ private final Map<T, TrafficNodeMonitor<T>> nodeMonitors = Collections.synchronizedMap(new java.util.LinkedHashMap<>());
public ClusterMonitor(NodeManager<T> manager) {
nodeManager = manager;
@@ -56,8 +56,7 @@ public class ClusterMonitor<T> {
* @param internal whether or not this node is internal to this cluster
*/
public void add(T node, boolean internal) {
- BaseNodeMonitor<T> monitor = new TrafficNodeMonitor<>(node, configuration, internal);
- nodeMonitors.put(node, monitor);
+ nodeMonitors.put(node, new TrafficNodeMonitor<>(node, configuration, internal));
}
/**
@@ -69,22 +68,20 @@ public class ClusterMonitor<T> {
/** Called from ClusterSearcher/NodeManager when a node failed */
public synchronized void failed(T node, ErrorMessage error) {
- BaseNodeMonitor<T> monitor = nodeMonitors.get(node);
- boolean wasWorking = monitor.isWorking();
+ TrafficNodeMonitor<T> monitor = nodeMonitors.get(node);
+ Boolean wasWorking = monitor.isKnownWorking();
monitor.failed(error);
- if (wasWorking && !monitor.isWorking()) {
+ if (wasWorking != monitor.isKnownWorking())
nodeManager.failed(node);
- }
}
/** Called when a node responded */
public synchronized void responded(T node) {
- BaseNodeMonitor<T> monitor = nodeMonitors.get(node);
- boolean wasFailing =! monitor.isWorking();
+ TrafficNodeMonitor<T> monitor = nodeMonitors.get(node);
+ Boolean wasWorking = monitor.isKnownWorking();
monitor.responded();
- if (wasFailing && monitor.isWorking()) {
+ if (wasWorking != monitor.isKnownWorking())
nodeManager.working(monitor.getNode());
- }
}
/**
diff --git a/container-search/src/main/java/com/yahoo/search/cluster/TrafficNodeMonitor.java b/container-search/src/main/java/com/yahoo/search/cluster/TrafficNodeMonitor.java
index ea881ad8b48..830014bca46 100644
--- a/container-search/src/main/java/com/yahoo/search/cluster/TrafficNodeMonitor.java
+++ b/container-search/src/main/java/com/yahoo/search/cluster/TrafficNodeMonitor.java
@@ -36,6 +36,7 @@ public class TrafficNodeMonitor<T> extends BaseNodeMonitor<T> {
@Override
public void failed(ErrorMessage error) {
respondedAt = now();
+ atStartUp = false;
if (error.getCode() == Error.BACKEND_COMMUNICATION_ERROR.code) {
setWorking(false, "Connection failure: " + error.toString());
@@ -60,9 +61,14 @@ public class TrafficNodeMonitor<T> extends BaseNodeMonitor<T> {
setWorking(true,"Responds correctly");
}
+ /**
+ * Returns whether this node is currently is a state suitable for receiving traffic, or null if not known
+ */
+ public Boolean isKnownWorking() { return atStartUp ? null : isWorking; }
+
/** Thread-safely changes the state of this node if required */
- protected synchronized void setWorking(boolean working,String explanation) {
- if (this.isWorking==working) return; // Old news
+ protected synchronized void setWorking(boolean working, String explanation) {
+ if (this.isWorking == working) return; // Old news
if (explanation==null) {
explanation="";