From 48acc675dd2cdc20f7e24a8a6cf909e3467ab628 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 12 Nov 2013 13:30:31 +0100 Subject: [PATCH] Sentinel: wait some time between failover attempts. --- src/sentinel.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/sentinel.c b/src/sentinel.c index 90c5ef2e..1edcf763 100644 --- a/src/sentinel.c +++ b/src/sentinel.c @@ -179,7 +179,7 @@ typedef struct sentinelRedisInstance { uint64_t failover_epoch; /* Epoch of the currently started failover. */ int failover_state; /* See SENTINEL_FAILOVER_STATE_* defines. */ mstime_t failover_state_change_time; - mstime_t failover_start_time; /* When to start to failover if leader. */ + mstime_t failover_start_time; /* Last failover attempt start time. */ mstime_t failover_timeout; /* Max time to refresh failover state. */ struct sentinelRedisInstance *promoted_slave; /* Promoted slave instance. */ /* Scripts executed to notify admin or reconfigure clients: when they @@ -2413,7 +2413,7 @@ char *sentinelVoteLeader(sentinelRedisInstance *master, uint64_t req_epoch, char } *leader_epoch = master->leader_epoch; - return master->leader; + return master->leader ? sdsnew(master->leader) : NULL; } struct sentinelLeader { @@ -2542,6 +2542,7 @@ void sentinelStartFailover(sentinelRedisInstance *master) { master->flags |= SRI_FAILOVER_IN_PROGRESS; master->failover_epoch = ++sentinel.current_epoch; sentinelEvent(REDIS_WARNING,"+failover-triggered",master,"%@"); + master->failover_start_time = mstime(); master->failover_state_change_time = mstime(); } @@ -2561,6 +2562,10 @@ void sentinelStartFailoverIfNeeded(sentinelRedisInstance *master) { /* Failover already in progress? */ if (master->flags & SRI_FAILOVER_IN_PROGRESS) return; + /* Last failover attempt started too little time ago? */ + if (mstime() - master->failover_start_time < + SENTINEL_PUBLISH_PERIOD*4) return; + sentinelStartFailover(master); } -- GitLab