From d00b8af89265c501fb4a0cdd546702b90432a896 Mon Sep 17 00:00:00 2001 From: Tian Date: Thu, 21 Jul 2022 07:59:27 +0800 Subject: Don't update node ip when peer fd is closed (#10696) --- src/cluster.c | 18 ++++++++++++++---- src/connection.c | 6 +++++- 2 files changed, 19 insertions(+), 5 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); diff --git a/src/connection.c b/src/connection.c index 11fc4ba28..f61ed2404 100644 --- a/src/connection.c +++ b/src/connection.c @@ -389,7 +389,11 @@ int connGetSocketError(connection *conn) { } int connPeerToString(connection *conn, char *ip, size_t ip_len, int *port) { - return anetFdToString(conn ? conn->fd : -1, ip, ip_len, port, FD_TO_PEER_NAME); + if (anetFdToString(conn ? conn->fd : -1, ip, ip_len, port, FD_TO_PEER_NAME) == -1) { + if (conn) conn->last_errno = errno; + return C_ERR; + } + return C_OK; } int connSockName(connection *conn, char *ip, size_t ip_len, int *port) { -- cgit v1.2.1