From 8dea2029a4ec3382b7d80de82d793ef2ba2773e5 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 3 Mar 2014 11:12:11 +0100 Subject: [PATCH] Fix configEpoch assignment when a cluster slot gets "closed". This is still code to rework in order to use agreement to obtain a new configEpoch when a slot is migrated, however this commit handles the special case that happens when the nodes are just started and everybody has a configEpoch of 0. In this special condition to have the maximum configEpoch is not enough as the special epoch 0 is not unique (all the others are). This does not fixes the intrinsic race condition of a failover happening while we are resharding, that will be addressed later. --- src/cluster.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cluster.c b/src/cluster.c index f47799ac..afea589e 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -3180,7 +3180,9 @@ void clusterCommand(redisClient *c) { * the master is failed over by a slave. */ uint64_t maxEpoch = clusterGetMaxEpoch(); - if (myself->configEpoch != maxEpoch) { + if (myself->configEpoch == 0 || + myself->configEpoch != maxEpoch) + { server.cluster->currentEpoch++; myself->configEpoch = server.cluster->currentEpoch; clusterDoBeforeSleep(CLUSTER_TODO_FSYNC_CONFIG);