Sentinel: limit reconnection frequency to the ping period

This commit is contained in:
antirez 2015-05-13 14:23:57 +02:00
parent 0eb0b55ff0
commit 3ab49895b4

View File

@ -146,6 +146,8 @@ typedef struct instanceLink {
mstime_t last_pong_time; /* Last time the instance replied to ping, mstime_t last_pong_time; /* Last time the instance replied to ping,
whatever the reply was. That's used to check whatever the reply was. That's used to check
if the link is idle and must be reconnected. */ if the link is idle and must be reconnected. */
mstime_t last_reconn_time; /* Last reconnection attempt performed when
the link was down. */
} instanceLink; } instanceLink;
typedef struct sentinelRedisInstance { typedef struct sentinelRedisInstance {
@ -921,6 +923,7 @@ instanceLink *createInstanceLink(void) {
link->pc = NULL; link->pc = NULL;
link->cc_conn_time = 0; link->cc_conn_time = 0;
link->pc_conn_time = 0; link->pc_conn_time = 0;
link->last_reconn_time = 0;
link->pc_last_activity = 0; link->pc_last_activity = 0;
/* We set the last_ping_time to "now" even if we actually don't have yet /* We set the last_ping_time to "now" even if we actually don't have yet
* a connection with the node, nor we sent a ping. * a connection with the node, nor we sent a ping.
@ -1826,6 +1829,10 @@ void sentinelSetClientName(sentinelRedisInstance *ri, redisAsyncContext *c, char
void sentinelReconnectInstance(sentinelRedisInstance *ri) { void sentinelReconnectInstance(sentinelRedisInstance *ri) {
if (ri->link->disconnected == 0) return; if (ri->link->disconnected == 0) return;
instanceLink *link = ri->link; instanceLink *link = ri->link;
mstime_t now = mstime();
if (now - ri->link->last_reconn_time < SENTINEL_PING_PERIOD) return;
ri->link->last_reconn_time = now;
/* Commands connection. */ /* Commands connection. */
if (link->cc == NULL) { if (link->cc == NULL) {