summaryrefslogtreecommitdiff
path: root/src/cluster.c
diff options
context:
space:
mode:
authorTian <skylypig@gmail.com>2022-07-21 07:59:27 +0800
committerGitHub <noreply@github.com>2022-07-20 16:59:27 -0700
commitd00b8af89265c501fb4a0cdd546702b90432a896 (patch)
tree78b573293d7e6cb1d3d8131ba58635df2cc84872 /src/cluster.c
parent6d6e932fa6cce5a08aaf68a3d41946a1909a32a0 (diff)
downloadredis-d00b8af89265c501fb4a0cdd546702b90432a896.tar.gz
Don't update node ip when peer fd is closed (#10696)
Diffstat (limited to 'src/cluster.c')
-rw-r--r--src/cluster.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/cluster.c b/src/cluster.c
index d2b85c172..b4630299a 100644
--- a/src/cluster.c
+++ b/src/cluster.c
@@ -1763,12 +1763,18 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) {
/* IP -> string conversion. 'buf' is supposed to at least be 46 bytes.
* If 'announced_ip' length is non-zero, it is used instead of extracting
* the IP from the socket peer address. */
-void nodeIp2String(char *buf, clusterLink *link, char *announced_ip) {
+int nodeIp2String(char *buf, clusterLink *link, char *announced_ip) {
if (announced_ip[0] != '\0') {
memcpy(buf,announced_ip,NET_IP_STR_LEN);
buf[NET_IP_STR_LEN-1] = '\0'; /* We are not sure the input is sane. */
+ return C_OK;
} else {
- connPeerToString(link->conn, buf, NET_IP_STR_LEN, NULL);
+ if (connPeerToString(link->conn, buf, NET_IP_STR_LEN, NULL) == C_ERR) {
+ serverLog(LL_NOTICE, "Error converting peer IP to string: %s",
+ link->conn ? connGetLastError(link->conn) : "no link");
+ return C_ERR;
+ }
+ return C_OK;
}
}
@@ -1800,7 +1806,11 @@ int nodeUpdateAddressIfNeeded(clusterNode *node, clusterLink *link,
* it is safe to call during packet processing. */
if (link == node->link) return 0;
- nodeIp2String(ip,link,hdr->myip);
+ /* If the peer IP is unavailable for some reasons like invalid fd or closed
+ * link, just give up the update this time, and the update will be retried
+ * in the next round of PINGs */
+ if (nodeIp2String(ip,link,hdr->myip) == C_ERR) return 0;
+
if (node->port == port && node->cport == cport && node->pport == pport &&
strcmp(ip,node->ip) == 0) return 0;
@@ -2253,7 +2263,7 @@ int clusterProcessPacket(clusterLink *link) {
clusterNode *node;
node = createClusterNode(NULL,CLUSTER_NODE_HANDSHAKE);
- nodeIp2String(node->ip,link,hdr->myip);
+ serverAssert(nodeIp2String(node->ip,link,hdr->myip) == C_OK);
node->port = ntohs(hdr->port);
node->pport = ntohs(hdr->pport);
node->cport = ntohs(hdr->cport);