diff --git a/src/cluster.c b/src/cluster.c index cebe4b9c8..207828450 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -2219,6 +2219,23 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) { node->tls_port = msg_tls_port; node->cport = ntohs(g->cport); node->flags &= ~CLUSTER_NODE_NOADDR; + + serverLog(LL_NOTICE,"Address updated for node %.40s (%s), now %s:%d", + node->name, node->human_nodename, node->ip, getNodeDefaultClientPort(node)); + + /* Check if this is our primary and we have to change the + * replication target as well. + * + * This is needed in case the check in nodeUpdateAddressIfNeeded + * failed due to a race condition. For example, if the replica just + * received a packet from another node that contains new address + * about the primary, we will update primary node address in here, + * when the replica receive the packet from the primary, the check + * in nodeUpdateAddressIfNeeded will fail since the address has been + * updated correctly, and we will not have the opportunity to call + * replicationSetPrimary and update the primary host. */ + if (nodeIsSlave(myself) && myself->slaveof == node) + replicationSetMaster(node->ip, getNodeDefaultReplicationPort(node)); } } else { /* If it's not in NOADDR state and we don't have it, we