From 004fbef8475b0af006e52ac65f0c8e3356c55445 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 15 Mar 2013 16:15:40 +0100 Subject: [PATCH] Cluster: remove node from master slaves when it turns into a master. Also, a few nearby comments improved. --- src/cluster.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index 8daad316..78a8b863 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -877,11 +877,13 @@ int clusterProcessPacket(clusterLink *link) { /* Update our info about the node */ if (link->node) link->node->pong_received = time(NULL); - /* Update master/slave info */ + /* Update master/slave state */ if (sender) { if (!memcmp(hdr->slaveof,REDIS_NODE_NULL_NAME, sizeof(hdr->slaveof))) { + if (sender->slaveof) + clusterNodeRemoveSlave(sender->slaveof,sender); sender->flags &= ~REDIS_NODE_SLAVE; sender->flags |= REDIS_NODE_MASTER; sender->slaveof = NULL; @@ -898,7 +900,9 @@ int clusterProcessPacket(clusterLink *link) { } } - /* Update our info about served slots. */ + /* Update our info about served slots. + * Note: this MUST happen after we update the master/slave state + * so that REDIS_NODE_MASTER flag will be set. */ if (sender && sender->flags & REDIS_NODE_MASTER) { int changes, j; @@ -909,7 +913,7 @@ int clusterProcessPacket(clusterLink *link) { if (bitmapTestBit(hdr->myslots,j)) { /* If this slot was not served, or served by a node * in FAIL state, update the table with the new node - * caliming to serve the slot. */ + * claiming to serve the slot. */ if (server.cluster->slots[j] == sender) continue; if (server.cluster->slots[j] == NULL || server.cluster->slots[j]->flags & REDIS_NODE_FAIL)