summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-06-19 10:28:27 +0200
committerantirez <antirez@gmail.com>2014-06-19 10:28:27 +0200
commit94bc467328cfaf9f8561e146fda1dfcc91f5c70e (patch)
tree57caacee07e1f863ad8f1d644490d0c7bc3302a7
parent1c343ec29f49bbe8c83a61b1c5c10d5ec3c1ca8f (diff)
downloadredis-94bc467328cfaf9f8561e146fda1dfcc91f5c70e.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.c10
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,