From d2a5cc23cc679dcc0d1294cf1832c58d624b45c6 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 2 Mar 2018 16:17:14 +0900 Subject: [PATCH] "standby clone": improve replication user selection Use the upstream node's replication user when checking the replication connection. --- repmgr-action-standby.c | 30 +++++++++++++++++++++--------- repmgr-client.c | 2 +- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c index 654c546e..ee355fee 100644 --- a/repmgr-action-standby.c +++ b/repmgr-action-standby.c @@ -129,7 +129,7 @@ do_standby_clone(void) int r = 0; /* dummy node record */ - t_node_info node_record = T_NODE_INFO_INITIALIZER; + t_node_info local_node_record = T_NODE_INFO_INITIALIZER; /* * --recovery-conf-only provided - we'll handle that separately @@ -186,8 +186,8 @@ do_standby_clone(void) check_barman_config(); } - init_node_record(&node_record); - node_record.type = STANDBY; + init_node_record(&local_node_record); + local_node_record.type = STANDBY; /* * Initialise list of conninfo parameters which will later be used to @@ -530,7 +530,7 @@ do_standby_clone(void) if (mode != barman) { - initialise_direct_clone(&node_record); + initialise_direct_clone(&local_node_record); } switch (mode) @@ -557,10 +557,10 @@ do_standby_clone(void) switch (mode) { case pg_basebackup: - r = run_basebackup(&node_record); + r = run_basebackup(&local_node_record); break; case barman: - r = run_file_backup(&node_record); + r = run_file_backup(&local_node_record); break; default: /* should never reach here */ @@ -574,7 +574,7 @@ do_standby_clone(void) /* If a replication slot was previously created, drop it */ if (config_file_options.use_replication_slots == true) { - drop_replication_slot(source_conn, node_record.slot_name); + drop_replication_slot(source_conn, local_node_record.slot_name); } log_error(_("unable to take a base backup of the primary server")); @@ -601,7 +601,7 @@ do_standby_clone(void) /* Write the recovery.conf file */ - if (create_recovery_file(&node_record, &recovery_conninfo, local_data_directory, true) == false) + if (create_recovery_file(&local_node_record, &recovery_conninfo, local_data_directory, true) == false) { /* create_recovery_file() will log an error */ log_notice(_("unable to create recovery.conf; see preceding error messages")); @@ -4292,6 +4292,10 @@ check_upstream_config(PGconn *conn, int server_version_num, t_node_info *node_in { param_set(&repl_conninfo, "user", runtime_options.replication_user); } + else if (upstream_repluser[0] != '\0') + { + param_set(&repl_conninfo, "user", upstream_repluser); + } else if (node_info->repluser[0] != '\0') { param_set(&repl_conninfo, "user", node_info->repluser); @@ -4562,10 +4566,14 @@ run_basebackup(t_node_info *node_record) /* string will already have been parsed */ (void) parse_conninfo_string(runtime_options.dbname, &conninfo, NULL, false); - if (*runtime_options.replication_user) + if (runtime_options.replication_user[0] != '\0') { param_set(&conninfo, "user", runtime_options.replication_user); } + else if (upstream_repluser[0] != '\0') + { + param_set(&conninfo, "user", upstream_repluser); + } else { param_set(&conninfo, "user", node_record->repluser); @@ -4598,6 +4606,10 @@ run_basebackup(t_node_info *node_record) { appendPQExpBuffer(¶ms, " -U %s", runtime_options.replication_user); } + else if (strlen(upstream_repluser)) + { + appendPQExpBuffer(¶ms, " -U %s", upstream_repluser); + } else if (strlen(node_record->repluser)) { appendPQExpBuffer(¶ms, " -U %s", node_record->repluser); diff --git a/repmgr-client.c b/repmgr-client.c index cf40b1d1..8fdf0273 100644 --- a/repmgr-client.c +++ b/repmgr-client.c @@ -2721,7 +2721,7 @@ init_node_record(t_node_info *node_record) if (config_file_options.replication_user[0] != '\0') { - /* replication user explicitly provided */ + /* replication user explicitly provided in configuration file */ strncpy(node_record->repluser, config_file_options.replication_user, NAMEDATALEN); } else