Cluster: node deletion cleanup / centralization.
This commit is contained in:
parent
c13e0820ad
commit
735adaa62d
@ -819,6 +819,7 @@ int clusterCountNonFailingSlaves(clusterNode *n) {
|
|||||||
return okslaves;
|
return okslaves;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Low level cleanup of the node structure. Only called by clusterDelNode(). */
|
||||||
void freeClusterNode(clusterNode *n) {
|
void freeClusterNode(clusterNode *n) {
|
||||||
sds nodename;
|
sds nodename;
|
||||||
int j;
|
int j;
|
||||||
@ -830,10 +831,15 @@ void freeClusterNode(clusterNode *n) {
|
|||||||
n->slaves[j]->slaveof = NULL;
|
n->slaves[j]->slaveof = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove this node from the list of slaves of its master. */
|
||||||
|
if (nodeIsSlave(n) && n->slaveof) clusterNodeRemoveSlave(n->slaveof,n);
|
||||||
|
|
||||||
|
/* Unlink from the set of nodes. */
|
||||||
nodename = sdsnewlen(n->name, REDIS_CLUSTER_NAMELEN);
|
nodename = sdsnewlen(n->name, REDIS_CLUSTER_NAMELEN);
|
||||||
redisAssert(dictDelete(server.cluster->nodes,nodename) == DICT_OK);
|
redisAssert(dictDelete(server.cluster->nodes,nodename) == DICT_OK);
|
||||||
sdsfree(nodename);
|
sdsfree(nodename);
|
||||||
if (n->slaveof) clusterNodeRemoveSlave(n->slaveof, n);
|
|
||||||
|
/* Release link and associated data structures. */
|
||||||
if (n->link) freeClusterLink(n->link);
|
if (n->link) freeClusterLink(n->link);
|
||||||
listRelease(n->fail_reports);
|
listRelease(n->fail_reports);
|
||||||
zfree(n);
|
zfree(n);
|
||||||
@ -848,11 +854,16 @@ int clusterAddNode(clusterNode *node) {
|
|||||||
return (retval == DICT_OK) ? REDIS_OK : REDIS_ERR;
|
return (retval == DICT_OK) ? REDIS_OK : REDIS_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a node from the cluster:
|
/* Remove a node from the cluster. The functio performs the high level
|
||||||
* 1) Mark all the nodes handled by it as unassigned.
|
* cleanup, calling freeClusterNode() for the low level cleanup.
|
||||||
* 2) Remove all the failure reports sent by this node.
|
* Here we do the following:
|
||||||
* 3) Free the node, that will in turn remove it from the hash table
|
*
|
||||||
* and from the list of slaves of its master, if it is a slave node.
|
* 1) Mark all the slots handled by it as unassigned.
|
||||||
|
* 2) Remove all the failure reports sent by this node and referenced by
|
||||||
|
* other nodes.
|
||||||
|
* 3) Free the node with freeClusterNode() that will in turn remove it
|
||||||
|
* from the hash table and from the list of slaves of its master, if
|
||||||
|
* it is a slave node.
|
||||||
*/
|
*/
|
||||||
void clusterDelNode(clusterNode *delnode) {
|
void clusterDelNode(clusterNode *delnode) {
|
||||||
int j;
|
int j;
|
||||||
@ -879,11 +890,7 @@ void clusterDelNode(clusterNode *delnode) {
|
|||||||
}
|
}
|
||||||
dictReleaseIterator(di);
|
dictReleaseIterator(di);
|
||||||
|
|
||||||
/* 3) Remove this node from its master's slaves if needed. */
|
/* 3) Free the node, unlinking it from the cluster. */
|
||||||
if (nodeIsSlave(delnode) && delnode->slaveof)
|
|
||||||
clusterNodeRemoveSlave(delnode->slaveof,delnode);
|
|
||||||
|
|
||||||
/* 4) Free the node, unlinking it from the cluster. */
|
|
||||||
freeClusterNode(delnode);
|
freeClusterNode(delnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1619,7 +1626,7 @@ int clusterProcessPacket(clusterLink *link) {
|
|||||||
}
|
}
|
||||||
/* Free this node as we already have it. This will
|
/* Free this node as we already have it. This will
|
||||||
* cause the link to be freed as well. */
|
* cause the link to be freed as well. */
|
||||||
freeClusterNode(link->node);
|
clusterDelNode(link->node);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2913,7 +2920,7 @@ void clusterCron(void) {
|
|||||||
/* A Node in HANDSHAKE state has a limited lifespan equal to the
|
/* A Node in HANDSHAKE state has a limited lifespan equal to the
|
||||||
* configured node timeout. */
|
* configured node timeout. */
|
||||||
if (nodeInHandshake(node) && now - node->ctime > handshake_timeout) {
|
if (nodeInHandshake(node) && now - node->ctime > handshake_timeout) {
|
||||||
freeClusterNode(node);
|
clusterDelNode(node);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user