diff --git a/src/cluster.c b/src/cluster.c index 1bc4cc0cb0b82688e351cd455de24d83099804e4..65de12fbc73d9c668dcdd536def8d796069a8656 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -107,6 +107,7 @@ int clusterLoadConfig(char *filename) { n->flags |= REDIS_NODE_PFAIL; } else if (!strcasecmp(s,"fail")) { n->flags |= REDIS_NODE_FAIL; + n->fail_time = time(NULL); } else if (!strcasecmp(s,"handshake")) { n->flags |= REDIS_NODE_HANDSHAKE; } else if (!strcasecmp(s,"noaddr")) { @@ -341,6 +342,7 @@ clusterNode *createClusterNode(char *nodename, int flags) { node->slaves = NULL; node->slaveof = NULL; node->ping_sent = node->pong_received = 0; + node->fail_time = 0; node->configdigest = NULL; node->configdigest_ts = 0; node->link = NULL; @@ -594,6 +596,7 @@ void markNodeAsFailingIfNeeded(clusterNode *node) { /* Mark the node as failing. */ node->flags &= ~REDIS_NODE_PFAIL; node->flags |= REDIS_NODE_FAIL; + node->fail_time = time(NULL); /* Broadcast the failing node name to everybody */ clusterSendFail(node->name); @@ -907,6 +910,7 @@ int clusterProcessPacket(clusterLink *link) { "FAIL message received from %.40s about %.40s", hdr->sender, hdr->data.fail.about.nodename); failing->flags |= REDIS_NODE_FAIL; + failing->fail_time = time(NULL); failing->flags &= ~REDIS_NODE_PFAIL; clusterUpdateState(); clusterSaveConfigOrDie(); diff --git a/src/redis.h b/src/redis.h index d93455ba44151d0decfc0e2e33a18f32719bab93..940b4f26c9040ccf2026e34f82387cc9d1041979 100644 --- a/src/redis.h +++ b/src/redis.h @@ -559,6 +559,7 @@ struct clusterNode { struct clusterNode *slaveof; /* pointer to the master node */ time_t ping_sent; /* Unix time we sent latest ping */ time_t pong_received; /* Unix time we received the pong */ + time_t fail_time; /* Unix time when FAIL flag was set */ char *configdigest; /* Configuration digest of this node */ time_t configdigest_ts; /* Configuration digest timestamp */ char ip[16]; /* Latest known IP address of this node */