summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2013-03-19 16:01:30 +0100
committerantirez <antirez@gmail.com>2013-03-19 16:01:30 +0100
commit4d626230154122bae919125aecedc699b4200a81 (patch)
treebc1e9df7d343d46183e6e595cc46ecc75993d05b /src
parent88221f88c05bd9b0ff6e7941006661e630507659 (diff)
downloadredis-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.c29
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;
}