Commit 0d9bcb1c authored by antirez's avatar antirez
Browse files

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.
parent 7eb47ae2
...@@ -2674,6 +2674,10 @@ void clusterHandleSlaveMigration(int max_slaves) { ...@@ -2674,6 +2674,10 @@ void clusterHandleSlaveMigration(int max_slaves) {
/* Only iterate over working masters. */ /* Only iterate over working masters. */
if (nodeIsSlave(node) || nodeFailed(node)) continue; 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); okslaves = clusterCountNonFailingSlaves(node);
if (okslaves == 0 && target == NULL && node->numslots > 0) if (okslaves == 0 && target == NULL && node->numslots > 0)
...@@ -2912,7 +2916,11 @@ void clusterCron(void) { ...@@ -2912,7 +2916,11 @@ void clusterCron(void) {
if (nodeIsSlave(myself) && nodeIsMaster(node) && !nodeFailed(node)) { if (nodeIsSlave(myself) && nodeIsMaster(node) && !nodeFailed(node)) {
int okslaves = clusterCountNonFailingSlaves(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 (okslaves > max_slaves) max_slaves = okslaves;
if (nodeIsSlave(myself) && myself->slaveof == node) if (nodeIsSlave(myself) && myself->slaveof == node)
this_slaves = okslaves; this_slaves = okslaves;
......
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