diff options
author | antirez <antirez@gmail.com> | 2014-06-19 10:28:27 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-06-21 15:18:33 +0200 |
commit | 6588ef29441643c7e58a070b2549dffbca4159a8 (patch) | |
tree | 0a739d38bf056f65159f018f9ddd581c2b244717 | |
parent | 64e618d10c9ac8173bce89f674ceacd34d468c6f (diff) | |
download | redis-6588ef29441643c7e58a070b2549dffbca4159a8.tar.gz |
Sentinel: handle SRI_PROMOTED flag correctly.
Lack of check of the SRI_PROMOTED flag caused Sentienl to act with the
promoted slave turned into a master during failover like if it was a
normal instance.
Normally this problem was not apparent because during real failovers the
old master is down so the bugged code path was not entered, however with
manual failovers via the SENTINEL FAILOVER command, the problem was
easily triggered.
This commit prevents promoted slaves from getting reconfigured, moreover
we now explicitly check that during a failover the slave turning into a
master is the one we selected for promotion and not a different one.
-rw-r--r-- | src/sentinel.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/sentinel.c b/src/sentinel.c index 25efdf6f3..ae447e172 100644 --- a/src/sentinel.c +++ b/src/sentinel.c @@ -1902,7 +1902,8 @@ void sentinelRefreshInstanceInfo(sentinelRedisInstance *ri, const char *info) { if ((ri->flags & SRI_SLAVE) && role == SRI_MASTER) { /* If this is a promoted slave we can change state to the * failover state machine. */ - if ((ri->master->flags & SRI_FAILOVER_IN_PROGRESS) && + if ((ri->flags & SRI_PROMOTED) && + (ri->master->flags & SRI_FAILOVER_IN_PROGRESS) && (ri->master->failover_state == SENTINEL_FAILOVER_STATE_WAIT_PROMOTION)) { @@ -1926,9 +1927,10 @@ void sentinelRefreshInstanceInfo(sentinelRedisInstance *ri, const char *info) { * going forward, to receive new configs if any. */ mstime_t wait_time = SENTINEL_PUBLISH_PERIOD*4; - if (sentinelMasterLooksSane(ri->master) && - sentinelRedisInstanceNoDownFor(ri,wait_time) && - mstime() - ri->role_reported_time > wait_time) + if (!(ri->flags & SRI_PROMOTED) && + sentinelMasterLooksSane(ri->master) && + sentinelRedisInstanceNoDownFor(ri,wait_time) && + mstime() - ri->role_reported_time > wait_time) { int retval = sentinelSendSlaveOf(ri, ri->master->addr->ip, |