Skip to content

Commit

Permalink
Fix missing replication link re-connection when primary's IP/port is …
Browse files Browse the repository at this point in the history
…updated in `clusterProcessGossipSection` (#965)

`clusterProcessGossipSection` currently doesn't trigger a check and call `replicationSetPrimary` when `myself`'s primary node’s IP/port is updated. This fix ensures that after every node address update, `replicationSetPrimary` is called if the updated node is `myself`'s primary. This prevents missed updates and ensures that replicas reconnect properly to maintain their replication link with the primary.

Signed-off-by: Ping Xie <pingxie@google.com>
  • Loading branch information
enjoy-binbin authored and PingXie committed Sep 15, 2024
1 parent 1478c0d commit ee1dcc0
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/cluster_legacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -2275,6 +2275,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 (nodeIsReplica(myself) && myself->replicaof == node)
replicationSetPrimary(node->ip, getNodeDefaultReplicationPort(node), 0);
}
} else if (!node) {
/* If it's not in NOADDR state and we don't have it, we
Expand Down

0 comments on commit ee1dcc0

Please sign in to comment.