From 2fa277cc534097a1e18b34b48520f11c2ff517db Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 5 May 2017 09:18:30 +0900 Subject: [PATCH] repmgr: fix --replication-user option when using conninfo string In "standby clone", if a conninfo string was provided, this was passed as-is to pg_basebackup - rewrite conninfo string to include the value passed with --replication-user, if provided. --- HISTORY | 4 ++++ repmgr.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/HISTORY b/HISTORY index 54144734..cb45fb29 100644 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,7 @@ +3.3.2 2017-05- + repmgr: ensure --replication-user option is honoured when passing database + connection parameters as a conninfo string (Ian) + 3.3.1 2017-03- repmgrd: prevent invalid apply lag value being written to the monitoring table (Ian) diff --git a/repmgr.c b/repmgr.c index 6aa6bc50..b5987683 100644 --- a/repmgr.c +++ b/repmgr.c @@ -158,6 +158,7 @@ static void param_set(t_conninfo_param_list *param_list, const char *param, cons static char *param_get(t_conninfo_param_list *param_list, const char *param); static bool parse_conninfo_string(const char *conninfo_str, t_conninfo_param_list *param_list, char *errmsg, bool ignore_application_name); static void conn_to_param_list(PGconn *conn, t_conninfo_param_list *param_list); +static char *param_list_to_string(t_conninfo_param_list *param_list); static void parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options); static void config_file_list_init(t_configfile_list *list, int max_size); @@ -7033,7 +7034,22 @@ run_basebackup(const char *data_dir, int server_version) */ if (runtime_options.conninfo_provided == true) { - appendPQExpBuffer(¶ms, " -d '%s'", runtime_options.dbname); + t_conninfo_param_list conninfo; + char *conninfo_str; + + initialize_conninfo_params(&conninfo, false); + + /* string will already have been parsed */ + (void) parse_conninfo_string(runtime_options.dbname, &conninfo, NULL, false); + + if (*runtime_options.replication_user) + param_set(&conninfo, "user", runtime_options.replication_user); + + conninfo_str = param_list_to_string(&conninfo); + + appendPQExpBuffer(¶ms, " -d '%s'", conninfo_str); + + pfree(conninfo_str); } /* @@ -8699,6 +8715,41 @@ conn_to_param_list(PGconn *conn, t_conninfo_param_list *param_list) } +static char * +param_list_to_string(t_conninfo_param_list *param_list) +{ + int c; + PQExpBufferData conninfo_buf; + char *conninfo_str; + int len; + + initPQExpBuffer(&conninfo_buf); + + for (c = 0; c < param_list->size && param_list->keywords[c] != NULL; c++) + { + if (param_list->values[c] != NULL && param_list->values[c][0] != '\0') + { + if (c > 0) + appendPQExpBufferChar(&conninfo_buf, ' '); + + appendPQExpBuffer(&conninfo_buf, + "%s=%s", + param_list->keywords[c], + param_list->values[c]); + } + } + + len = strlen(conninfo_buf.data) + 1; + conninfo_str = pg_malloc0(len); + + strncpy(conninfo_str, conninfo_buf.data, len); + + termPQExpBuffer(&conninfo_buf); + + return conninfo_str; +} + + static void parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options) {