Commit 6276434a authored by antirez's avatar antirez
Browse files

Sentinel: do not crash against slaves not publishing the runid.

Older versions of Redis (before 2.4.17) don't publish the runid field in
INFO. This commit makes Sentinel able to handle that without crashing.
parent 58186b9d
...@@ -2521,9 +2521,21 @@ void sentinelStartFailoverIfNeeded(sentinelRedisInstance *master) { ...@@ -2521,9 +2521,21 @@ void sentinelStartFailoverIfNeeded(sentinelRedisInstance *master) {
int compareSlavesForPromotion(const void *a, const void *b) { int compareSlavesForPromotion(const void *a, const void *b) {
sentinelRedisInstance **sa = (sentinelRedisInstance **)a, sentinelRedisInstance **sa = (sentinelRedisInstance **)a,
**sb = (sentinelRedisInstance **)b; **sb = (sentinelRedisInstance **)b;
char *sa_runid, *sb_runid;
if ((*sa)->slave_priority != (*sb)->slave_priority) if ((*sa)->slave_priority != (*sb)->slave_priority)
return (*sa)->slave_priority - (*sb)->slave_priority; return (*sa)->slave_priority - (*sb)->slave_priority;
return strcasecmp((*sa)->runid,(*sb)->runid);
/* If priority is the same, select the slave with that has the
* lexicographically smaller runid. Note that we try to handle runid
* == NULL as there are old Redis versions that don't publish runid in
* INFO. A NULL runid is considered bigger than any other runid. */
sa_runid = (*sa)->runid;
sb_runid = (*sb)->runid;
if (sa_runid == NULL && sb_runid == NULL) return 0;
else if (sa_runid == NULL) return 1; /* a > b */
else if (sb_runid == NULL) return -1; /* a < b */
return strcasecmp(sa_runid, sb_runid);
} }
sentinelRedisInstance *sentinelSelectSlave(sentinelRedisInstance *master) { sentinelRedisInstance *sentinelSelectSlave(sentinelRedisInstance *master) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment