From 0d9bcb1c12b73ea3835528a02a142cb6ec681a84 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 25 Jul 2014 11:02:09 +0200 Subject: [PATCH] Cluster: don't migrate to a master that never had slaves. Replica migration algorithm modified so that slaves never try to migrate to masters that were never configured to have slaves in the past. We want the algorithm to take care of masters that remained without *working* slaves, but that used to have slaves according to the cluster configuration. --- src/cluster.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/cluster.c b/src/cluster.c index a2d79164..0d908349 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -2674,6 +2674,10 @@ void clusterHandleSlaveMigration(int max_slaves) { /* Only iterate over working masters. */ if (nodeIsSlave(node) || nodeFailed(node)) continue; + /* If this master never had slaves so far, don't migrate. We want + * to migrate to a master that remained orphaned, not masters that + * were never configured to have slaves. */ + if (node->numslaves == 0) continue; okslaves = clusterCountNonFailingSlaves(node); if (okslaves == 0 && target == NULL && node->numslots > 0) @@ -2912,7 +2916,11 @@ void clusterCron(void) { if (nodeIsSlave(myself) && nodeIsMaster(node) && !nodeFailed(node)) { int okslaves = clusterCountNonFailingSlaves(node); - if (okslaves == 0 && node->numslots > 0) orphaned_masters++; + /* A master is orphaned if it is serving a non-zero number of + * slots, have no working slaves, but used to have at least one + * slave. */ + if (okslaves == 0 && node->numslots > 0 && node->numslaves) + orphaned_masters++; if (okslaves > max_slaves) max_slaves = okslaves; if (nodeIsSlave(myself) && myself->slaveof == node) this_slaves = okslaves;