From a2c2ef7de593ca9ae80b09c3b243965a746a106c Mon Sep 17 00:00:00 2001 From: antirez Date: Sat, 7 Jun 2014 14:25:47 +0200 Subject: [PATCH] Cluster: SET-CONFIG-EPOCH should update currentEpoch. SET-CONFIG-EPOCH, used by redis-trib at cluster creation time, failed to update the currentEpoch, making it possible after a failover for a server to set its configEpoch to a value smaller than the current one (since configEpochs are obtained using currentEpoch). The bug totally break the Redis Cluster algorithms and protocols allowing for permanent split brain conditions about the slots configuration as shown in issue #1799. --- src/cluster.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cluster.c b/src/cluster.c index 948cc914..bdaf36fb 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -3790,6 +3790,8 @@ void clusterCommand(redisClient *c) { addReplyError(c,"Node config epoch is already non-zero"); } else { myself->configEpoch = epoch; + if (server.cluster->currentEpoch < epoch) + server.cluster->currentEpoch = epoch; /* No need to fsync the config here since in the unlucky event * of a failure to persist the config, the conflict resolution code * will assign an unique config to this node. */