From 9dab52cdfc1d679629046899c85a6b5139ab5945 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Tue, 16 Aug 2016 14:31:20 +0200 Subject: Only use direct dispatch when the local node is responding --- .../com/yahoo/search/cluster/BaseNodeMonitor.java | 3 +- .../com/yahoo/search/cluster/ClusterMonitor.java | 37 +++++++++++----------- .../com/yahoo/search/cluster/ClusterSearcher.java | 9 ++++-- .../java/com/yahoo/search/cluster/NodeManager.java | 11 ++++--- .../yahoo/search/cluster/TrafficNodeMonitor.java | 21 ++++++------ 5 files changed, 43 insertions(+), 38 deletions(-) (limited to 'container-search/src/main/java/com/yahoo/search/cluster') 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 de67369a231..9aafdb8b236 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 @@ -21,7 +21,7 @@ import com.yahoo.search.result.ErrorMessage; */ public abstract class BaseNodeMonitor { - protected static Logger log=Logger.getLogger(BaseNodeMonitor.class.getName()); + protected static Logger log = Logger.getLogger(BaseNodeMonitor.class.getName()); /** The object representing the monitored node */ protected T node; @@ -90,4 +90,5 @@ public abstract class BaseNodeMonitor { /** Returns whether or not this is monitoring an internal node. Default is false. */ public boolean isInternal() { return internal; } + } 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 619beb0a8d1..2ccb57c6e83 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 @@ -24,7 +24,7 @@ import java.util.logging.Logger; */ public class ClusterMonitor { - private MonitorConfiguration configuration=new MonitorConfiguration(); + private MonitorConfiguration configuration = new MonitorConfiguration(); private static Logger log=Logger.getLogger(ClusterMonitor.class.getName()); @@ -35,14 +35,18 @@ public class ClusterMonitor { private volatile boolean shutdown = false; /** A map from Node to corresponding MonitoredNode */ - private Map> nodeMonitors= - Collections.synchronizedMap(new java.util.LinkedHashMap>()); + private Map> nodeMonitors = Collections.synchronizedMap(new java.util.LinkedHashMap<>()); - public ClusterMonitor(NodeManager manager, String monitorConfigID) { - nodeManager=manager; - monitorThread=new MonitorThread("search.clustermonitor"); + /** @deprecated use the constructor with just the first argument instead */ + @Deprecated + public ClusterMonitor(NodeManager manager, String ignored) { + this(manager); + } + + public ClusterMonitor(NodeManager manager) { + nodeManager = manager; + monitorThread = new MonitorThread("search.clustermonitor"); monitorThread.start(); - log.fine("checkInterval is " + configuration.getCheckInterval()+" ms"); } /** Returns the configuration of this cluster monitor */ @@ -59,10 +63,9 @@ public class ClusterMonitor { * @param node the object representing the node * @param internal whether or not this node is internal to this cluster */ - public void add(T node,boolean internal) { - BaseNodeMonitor monitor=new TrafficNodeMonitor<>(node,configuration,internal); - // BaseNodeMonitor monitor=new NodeMonitor(node,configuration); - nodeMonitors.put(node,monitor); + public void add(T node, boolean internal) { + BaseNodeMonitor monitor = new TrafficNodeMonitor<>(node, configuration, internal); + nodeMonitors.put(node, monitor); } /** @@ -74,8 +77,8 @@ public class ClusterMonitor { /** Called from ClusterSearcher/NodeManager when a node failed */ public synchronized void failed(T node, ErrorMessage error) { - BaseNodeMonitor monitor=nodeMonitors.get(node); - boolean wasWorking=monitor.isWorking(); + BaseNodeMonitor monitor = nodeMonitors.get(node); + boolean wasWorking = monitor.isWorking(); monitor.failed(error); if (wasWorking && !monitor.isWorking()) { nodeManager.failed(node); @@ -85,7 +88,7 @@ public class ClusterMonitor { /** Called when a node responded */ public synchronized void responded(T node) { BaseNodeMonitor monitor = nodeMonitors.get(node); - boolean wasFailing=!monitor.isWorking(); + boolean wasFailing =! monitor.isWorking(); monitor.responded(); if (wasFailing && monitor.isWorking()) { nodeManager.working(monitor.getNode()); @@ -96,11 +99,9 @@ public class ClusterMonitor { * Ping all nodes which needs pinging to discover state changes */ public void ping(Executor executor) { - for (Iterator> i=nodeMonitorIterator(); i.hasNext(); ) { + for (Iterator> i = nodeMonitorIterator(); i.hasNext(); ) { BaseNodeMonitor monitor= i.next(); - // always ping - // if (monitor.isIdle()) - nodeManager.ping(monitor.getNode(),executor); // Cause call to failed or responded + nodeManager.ping(monitor.getNode(), executor); // Cause call to failed or responded } } diff --git a/container-search/src/main/java/com/yahoo/search/cluster/ClusterSearcher.java b/container-search/src/main/java/com/yahoo/search/cluster/ClusterSearcher.java index 893d6193bef..d5ab94e7ec1 100644 --- a/container-search/src/main/java/com/yahoo/search/cluster/ClusterSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/cluster/ClusterSearcher.java @@ -3,9 +3,11 @@ package com.yahoo.search.cluster; import com.yahoo.component.ComponentId; import com.yahoo.container.protect.Error; +import com.yahoo.fs4.mplex.Backend; import com.yahoo.log.LogLevel; import com.yahoo.prelude.Ping; import com.yahoo.prelude.Pong; +import com.yahoo.prelude.fastsearch.FastSearcher; import com.yahoo.yolean.Exceptions; import com.yahoo.search.Query; import com.yahoo.search.Result; @@ -31,12 +33,12 @@ import java.util.concurrent.*; * The connection objects should implement a good toString to ease diagnostics. * * @author bratseth - * @author Arne Bergene Fossaa + * @author Arne Bergene Fossaa */ public abstract class ClusterSearcher extends PingableSearcher implements NodeManager { private final Hasher hasher; - private final ClusterMonitor monitor = new ClusterMonitor<>(this, "dummy"); + private final ClusterMonitor monitor = new ClusterMonitor<>(this); /** * Creates a new cluster searcher @@ -59,7 +61,7 @@ public abstract class ClusterSearcher extends PingableSearcher implements Nod } /** - * Pinging a node by sending a query NodeManager method, called from ClusterMonitor + * Pinging a node, called from ClusterMonitor */ @Override public final void ping(T p, Executor executor) { @@ -344,4 +346,5 @@ public abstract class ClusterSearcher extends PingableSearcher implements Nod } } + } diff --git a/container-search/src/main/java/com/yahoo/search/cluster/NodeManager.java b/container-search/src/main/java/com/yahoo/search/cluster/NodeManager.java index ce221fa1479..25582e43f5e 100644 --- a/container-search/src/main/java/com/yahoo/search/cluster/NodeManager.java +++ b/container-search/src/main/java/com/yahoo/search/cluster/NodeManager.java @@ -12,12 +12,15 @@ import java.util.concurrent.Executor; public interface NodeManager { /** Called when a failed node is working (ready for production) again */ - public void working(T node); + void working(T node); /** Called when a working node fails */ - public void failed(T node); + void failed(T node); - /** Called when a node should be pinged */ - public void ping(T node, Executor executor); + /** + * Called when a node should be pinged. + * This *must* lead to either a call to NodeMonitor.failed or NodeMonitor.responded + */ + void ping(T node, Executor executor); } 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 6464f0101be..7681ae89f18 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 @@ -3,7 +3,6 @@ package com.yahoo.search.cluster; import com.yahoo.search.result.ErrorMessage; - /** * This node monitor is responsible for maintaining the state of a monitored node. * It has the following properties: @@ -12,16 +11,15 @@ import com.yahoo.search.result.ErrorMessage; *
  • A node is put back in operation when it responds correctly again * * - * @author Steinar Knutsen + * @author Steinar Knutsen */ public class TrafficNodeMonitor extends BaseNodeMonitor { - /** - * Creates a new node monitor for a node - */ - public TrafficNodeMonitor(T node,MonitorConfiguration configuration,boolean internal) { + + /** Creates a new node monitor for a node */ + public TrafficNodeMonitor(T node, MonitorConfiguration configuration, boolean internal) { super(internal); - this.node=node; - this.configuration=configuration; + this.node = node; + this.configuration = configuration; } /** Whether or not this has ever responded successfully */ @@ -32,11 +30,11 @@ public class TrafficNodeMonitor extends BaseNodeMonitor { /** * Called when this node fails. * - * @param error A container which should contain a short description + * @param error a container which should contain a short description */ @Override public void failed(ErrorMessage error) { - respondedAt=now(); + respondedAt = now(); switch (error.getCode()) { // TODO: Remove hard coded error messages. @@ -63,9 +61,8 @@ public class TrafficNodeMonitor extends BaseNodeMonitor { succeededAt=respondedAt; atStartUp = false; - if (!isWorking) { + if (!isWorking) setWorking(true,"Responds correctly"); - } } /** Thread-safely changes the state of this node if required */ -- cgit v1.2.3