Commit 3984dc65 authored by Liu Zhen's avatar Liu Zhen
Browse files

fix clusters mixing accidentally by gossip

`clusterStartHandshake` will start hand handshake
and eventually send CLUSTER MEET message, which is strictly prohibited
in the REDIS CLUSTER SPEC.
Only system administrator can initiate CLUSTER MEET message.
Futher, according to the SPEC, rather than IP/PORT pairs, only nodeid
can be trusted.
parent 94c026cd
...@@ -1463,7 +1463,10 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) { ...@@ -1463,7 +1463,10 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) {
} }
} else { } else {
/* If it's not in NOADDR state and we don't have it, we /* If it's not in NOADDR state and we don't have it, we
* start a handshake process against this IP/PORT pairs. * add it to our trusted dict with exact nodeid and flag.
* Note that we cannot simply start a handshake against
* this IP/PORT pairs, since IP/PORT can be reused already,
* otherwise we risk joining another cluster.
* *
* Note that we require that the sender of this gossip message * Note that we require that the sender of this gossip message
* is a well known node in our cluster, otherwise we risk * is a well known node in our cluster, otherwise we risk
...@@ -1472,7 +1475,12 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) { ...@@ -1472,7 +1475,12 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) {
!(flags & CLUSTER_NODE_NOADDR) && !(flags & CLUSTER_NODE_NOADDR) &&
!clusterBlacklistExists(g->nodename)) !clusterBlacklistExists(g->nodename))
{ {
clusterStartHandshake(g->ip,ntohs(g->port),ntohs(g->cport)); clusterNode *node;
node = createClusterNode(g->nodename, flags);
memcpy(node->ip,g->ip,NET_IP_STR_LEN);
node->port = ntohs(g->port);
node->cport = ntohs(g->cport);
clusterAddNode(node);
} }
} }
......
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