From bc93d2996cfe4d3dc96db44ed91ad3128db07bf2 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 10 Dec 2019 15:48:49 +0900 Subject: [PATCH] standby follow: don't attempt to delete slot if current upstream is primary An attempt will be made to delete an existing replication slot on the old upstream node (this is important during e.g. a switchover operation or when attaching a cascaded standby to a new upstream). However if the standby is currently attached to the follow target node anyway, the replication slot should never be deleted. --- repmgr-action-standby.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c index 094afd64..0c6b9578 100644 --- a/repmgr-action-standby.c +++ b/repmgr-action-standby.c @@ -2901,8 +2901,8 @@ do_standby_follow_internal(PGconn *primary_conn, PGconn *follow_target_conn, t_n free_conninfo_params(&local_node_conninfo); /* - * store the original upstream node id so we can delete the - * replication slot, if exists + * Store the original upstream node id so we can delete the + * replication slot, if it exists. */ if (local_node_record.upstream_node_id != UNKNOWN_NODE_ID) { @@ -2914,9 +2914,17 @@ do_standby_follow_internal(PGconn *primary_conn, PGconn *follow_target_conn, t_n } - if (config_file_options.use_replication_slots && runtime_options.host_param_provided == false && original_upstream_node_id != UNKNOWN_NODE_ID) + if (config_file_options.use_replication_slots && runtime_options.host_param_provided == false) { - remove_old_replication_slot = true; + /* + * Only attempt to delete the old replication slot if the old upstream + * node is known and is different to the follow target node. + */ + if (original_upstream_node_id != UNKNOWN_NODE_ID + && original_upstream_node_id != follow_target_node_record->node_id) + { + remove_old_replication_slot = true; + } } } @@ -3063,8 +3071,6 @@ do_standby_follow_internal(PGconn *primary_conn, PGconn *follow_target_conn, t_n * Note that if this function is called by do_standby_switchover(), the * "repmgr node rejoin" command executed on the demotion candidate may already * have removed the slot, so there may be nothing to do. - * - * XXX check if former upstream is current primary? */ if (remove_old_replication_slot == true)