diff options
author | antirez <antirez@gmail.com> | 2013-03-19 16:01:30 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2013-03-19 16:01:30 +0100 |
commit | 4d626230154122bae919125aecedc699b4200a81 (patch) | |
tree | bc1e9df7d343d46183e6e595cc46ecc75993d05b /src | |
parent | 88221f88c05bd9b0ff6e7941006661e630507659 (diff) | |
download | redis-4d626230154122bae919125aecedc699b4200a81.tar.gz |
Cluster: node replication role change handle improved.
The code handling a master that turns into a slave or the contrary was
improved in order to avoid repeating the same operations. Also
the readability and conceptual simplicity was improved.
Diffstat (limited to 'src')
-rw-r--r-- | src/cluster.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/cluster.c b/src/cluster.c index d066c52a3..e571d28d8 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -884,34 +884,33 @@ int clusterProcessPacket(clusterLink *link) { sizeof(hdr->slaveof))) { /* Node is a master. */ - if (sender->flags & REDIS_NODE_SLAVE && - sender->slaveof != NULL) - { - /* If the node changed role and is now a master, remove - * it from the list of slaves of its old master. */ - clusterNodeRemoveSlave(sender->slaveof,sender); + if (sender->flags & REDIS_NODE_SLAVE) { + /* Slave turned into master? Reconfigure it. */ + if (sender->slaveof) + clusterNodeRemoveSlave(sender->slaveof,sender); + sender->flags &= ~REDIS_NODE_SLAVE; + sender->flags |= REDIS_NODE_MASTER; + sender->slaveof = NULL; update_state = 1; update_config = 1; } - sender->flags &= ~REDIS_NODE_SLAVE; - sender->flags |= REDIS_NODE_MASTER; - sender->slaveof = NULL; } else { /* Node is a slave. */ clusterNode *master = clusterLookupNode(hdr->slaveof); if (sender->flags & REDIS_NODE_MASTER) { - /* If the node changed role and is now a slave, clear all - * its slots as them are no longer served. */ + /* Master just turned into a slave? Reconfigure the node. */ clusterDelNodeSlots(sender); + sender->flags &= ~REDIS_NODE_MASTER; + sender->flags |= REDIS_NODE_SLAVE; + /* Remove the list of slaves from the node. */ + if (sender->numslaves) clusterNodeResetSlaves(sender); update_state = 1; update_config = 1; } - sender->flags &= ~REDIS_NODE_MASTER; - sender->flags |= REDIS_NODE_SLAVE; - if (sender->numslaves) clusterNodeResetSlaves(sender); - if (master) { + /* Master node changed for this slave? */ + if (sender->slaveof != master) { clusterNodeAddSlave(master,sender); sender->slaveof = master; } |