From f09b2508f42fcaa14b0fb36a013747611ee2159d Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 8 Apr 2013 19:40:20 +0200 Subject: [PATCH] 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. --- src/cluster.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index 2f412ae5..aad7adae 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) {