summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2013-04-08 19:40:20 +0200
committerantirez <antirez@gmail.com>2013-04-08 19:40:20 +0200
commitf09b2508f42fcaa14b0fb36a013747611ee2159d (patch)
treee9c6da4e151e0cdf69a0106b52da05b8e4d48cb9
parentace86cfaefa5f182535b748803cc8d8a3eb96794 (diff)
downloadredis-f09b2508f42fcaa14b0fb36a013747611ee2159d.tar.gz
Cluster: properly send ping to nodes not pinged foro too much time.
In commit d728ec6 it was introduced the concept of sending a ping to every node not receiving a ping since node_timeout/2 seconds. However the code was located in a place that was not executed because of a previous conditional causing the loop to re-iterate. This caused false positives in nodes availability detection. The current code is still not perfect as a node may be detected to be in PFAIL state even if it does not reply for just node_timeout/2 seconds that is not correct. There is a plan to improve this code ASAP.
-rw-r--r--src/cluster.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/cluster.c b/src/cluster.c
index 2f412ae50..aad7adaec 100644
--- a/src/cluster.c
+++ b/src/cluster.c
@@ -1555,11 +1555,6 @@ void clusterCron(void) {
(REDIS_NODE_MYSELF|REDIS_NODE_NOADDR|REDIS_NODE_HANDSHAKE))
continue;
- /* Check only if we already sent a ping and did not received
- * a reply yet. */
- if (node->ping_sent == 0 ||
- node->ping_sent <= node->pong_received) continue;
-
/* If our ping is older than half the cluster timeout (may happen
* in a cluster with many nodes), send a new ping. */
if (node->link &&
@@ -1569,6 +1564,11 @@ void clusterCron(void) {
continue;
}
+ /* Check only if we already sent a ping and did not received
+ * a reply yet. */
+ if (node->ping_sent == 0 ||
+ node->ping_sent <= node->pong_received) continue;
+
/* If we never received a pong, use the ping time to compute
* the delay. */
if (node->pong_received) {