summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-08-30 17:57:02 +0200
committerantirez <antirez@gmail.com>2012-09-27 13:06:01 +0200
commitef792fc95067472494ce9c1cc179aad00ca45fae (patch)
tree260e79ace4d0030fda045571ae4bf871f133ee41
parentde499f7f7ebe22087e0f2dda963de38d15003093 (diff)
downloadredis-ef792fc95067472494ce9c1cc179aad00ca45fae.tar.gz
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.
-rw-r--r--src/sentinel.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/sentinel.c b/src/sentinel.c
index 11df7335c..659820f67 100644
--- a/src/sentinel.c
+++ b/src/sentinel.c
@@ -2521,9 +2521,21 @@ void sentinelStartFailoverIfNeeded(sentinelRedisInstance *master) {
int compareSlavesForPromotion(const void *a, const void *b) {
sentinelRedisInstance **sa = (sentinelRedisInstance **)a,
**sb = (sentinelRedisInstance **)b;
+ char *sa_runid, *sb_runid;
+
if ((*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) {