mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 16:46:28 +00:00
repmgr: add option -B/--remote-pg_bindir for standby switchover
This enables the switchover operation to function if the remote server (current primary) has a different binary directory to the current server, and addresses the issue reported in GitHub #172.
This commit is contained in:
64
repmgr.c
64
repmgr.c
@@ -99,6 +99,7 @@ static bool check_upstream_config(PGconn *conn, int server_version_num, bool exi
|
|||||||
static bool update_node_record_set_master(PGconn *conn, int this_node_id);
|
static bool update_node_record_set_master(PGconn *conn, int this_node_id);
|
||||||
|
|
||||||
static char *make_pg_path(char *file);
|
static char *make_pg_path(char *file);
|
||||||
|
static char *make_path(char *path, char *file);
|
||||||
|
|
||||||
static void do_master_register(void);
|
static void do_master_register(void);
|
||||||
static void do_standby_register(void);
|
static void do_standby_register(void);
|
||||||
@@ -180,6 +181,7 @@ main(int argc, char **argv)
|
|||||||
{"terse", required_argument, NULL, 't'},
|
{"terse", required_argument, NULL, 't'},
|
||||||
{"mode", required_argument, NULL, 'm'},
|
{"mode", required_argument, NULL, 'm'},
|
||||||
{"remote-config-file", required_argument, NULL, 'C'},
|
{"remote-config-file", required_argument, NULL, 'C'},
|
||||||
|
{"remote-pg_bindir", required_argument, NULL, 'B'},
|
||||||
/* deprecated from 3.2; replaced with -P/--pwprompt */
|
/* deprecated from 3.2; replaced with -P/--pwprompt */
|
||||||
{"initdb-no-pwprompt", no_argument, NULL, 1},
|
{"initdb-no-pwprompt", no_argument, NULL, 1},
|
||||||
{"check-upstream-config", no_argument, NULL, 2},
|
{"check-upstream-config", no_argument, NULL, 2},
|
||||||
@@ -382,10 +384,13 @@ main(int argc, char **argv)
|
|||||||
termPQExpBuffer(&invalid_mode);
|
termPQExpBuffer(&invalid_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
strncpy(runtime_options.remote_config_file, optarg, MAXLEN);
|
strncpy(runtime_options.remote_config_file, optarg, MAXLEN);
|
||||||
break;
|
break;
|
||||||
|
case 'B':
|
||||||
|
strncpy(runtime_options.remote_pg_bindir, optarg, MAXLEN);
|
||||||
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
runtime_options.initdb_no_pwprompt = true;
|
runtime_options.initdb_no_pwprompt = true;
|
||||||
break;
|
break;
|
||||||
@@ -2734,7 +2739,7 @@ do_standby_follow(void)
|
|||||||
*
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* - make connection test timeouts/intervals configurable (see below)
|
* - make connection test timeouts/intervals configurable (see below)
|
||||||
* - add command line option --remote_pg_bindir or similar to
|
* - add command line option --remote-pg_bindir or similar to
|
||||||
* optionally handle cases where the remote pg_bindir is different
|
* optionally handle cases where the remote pg_bindir is different
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -2751,7 +2756,8 @@ do_standby_switchover(void)
|
|||||||
char remote_host[MAXLEN];
|
char remote_host[MAXLEN];
|
||||||
char remote_data_directory[MAXLEN];
|
char remote_data_directory[MAXLEN];
|
||||||
int remote_node_id;
|
int remote_node_id;
|
||||||
char remote_node_replication_state[MAXLEN] = "";
|
char remote_node_replication_state[MAXLEN] = "";
|
||||||
|
char remote_pg_bindir[MAXLEN] = "";
|
||||||
char remote_archive_config_dir[MAXLEN];
|
char remote_archive_config_dir[MAXLEN];
|
||||||
char remote_pg_rewind[MAXLEN];
|
char remote_pg_rewind[MAXLEN];
|
||||||
int i,
|
int i,
|
||||||
@@ -2766,6 +2772,20 @@ do_standby_switchover(void)
|
|||||||
bool connection_success;
|
bool connection_success;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If --remote_pg_bindir supplied, use that to build the path on the
|
||||||
|
* remote host; if not default to whatever value is set in pg_bindir
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (strlen(runtime_options.remote_pg_bindir))
|
||||||
|
{
|
||||||
|
strncpy(remote_pg_bindir, runtime_options.remote_pg_bindir, MAXLEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strncpy(remote_pg_bindir, pg_bindir, MAXLEN);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SANITY CHECKS
|
* SANITY CHECKS
|
||||||
*
|
*
|
||||||
@@ -2895,7 +2915,7 @@ do_standby_switchover(void)
|
|||||||
use_pg_rewind = true;
|
use_pg_rewind = true;
|
||||||
maxlen_snprintf(remote_pg_rewind,
|
maxlen_snprintf(remote_pg_rewind,
|
||||||
"%s",
|
"%s",
|
||||||
make_pg_path("pg_rewind"));
|
make_path(remote_pg_bindir, "pg_rewind"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2916,7 +2936,7 @@ do_standby_switchover(void)
|
|||||||
{
|
{
|
||||||
maxlen_snprintf(remote_pg_rewind,
|
maxlen_snprintf(remote_pg_rewind,
|
||||||
"%s",
|
"%s",
|
||||||
make_pg_path("pg_rewind"));
|
make_path(remote_pg_bindir, "pg_rewind"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -3112,7 +3132,7 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
maxlen_snprintf(command,
|
maxlen_snprintf(command,
|
||||||
"%s standby archive-config -f %s --config-archive-dir=%s",
|
"%s standby archive-config -f %s --config-archive-dir=%s",
|
||||||
make_pg_path("repmgr"),
|
make_path(remote_pg_bindir, "repmgr"),
|
||||||
runtime_options.remote_config_file,
|
runtime_options.remote_config_file,
|
||||||
remote_archive_config_dir);
|
remote_archive_config_dir);
|
||||||
|
|
||||||
@@ -3151,7 +3171,7 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
maxlen_snprintf(command,
|
maxlen_snprintf(command,
|
||||||
"%s -D %s -m %s -W stop >/dev/null 2>&1 && echo 1 || echo 0",
|
"%s -D %s -m %s -W stop >/dev/null 2>&1 && echo 1 || echo 0",
|
||||||
make_pg_path("pg_ctl"),
|
make_path(remote_pg_bindir, "pg_ctl"),
|
||||||
remote_data_directory,
|
remote_data_directory,
|
||||||
runtime_options.pg_ctl_mode);
|
runtime_options.pg_ctl_mode);
|
||||||
|
|
||||||
@@ -3247,7 +3267,7 @@ do_standby_switchover(void)
|
|||||||
/* Restore any previously archived config files */
|
/* Restore any previously archived config files */
|
||||||
maxlen_snprintf(command,
|
maxlen_snprintf(command,
|
||||||
"%s standby restore-config -D %s --config-archive-dir=%s",
|
"%s standby restore-config -D %s --config-archive-dir=%s",
|
||||||
make_pg_path("repmgr"),
|
make_path(remote_pg_bindir, "repmgr"),
|
||||||
remote_data_directory,
|
remote_data_directory,
|
||||||
remote_archive_config_dir);
|
remote_archive_config_dir);
|
||||||
|
|
||||||
@@ -3305,7 +3325,7 @@ do_standby_switchover(void)
|
|||||||
format_db_cli_params(options.conninfo, repmgr_db_cli_params);
|
format_db_cli_params(options.conninfo, repmgr_db_cli_params);
|
||||||
maxlen_snprintf(command,
|
maxlen_snprintf(command,
|
||||||
"%s -D %s -f %s %s --rsync-only --force --ignore-external-config-files standby clone",
|
"%s -D %s -f %s %s --rsync-only --force --ignore-external-config-files standby clone",
|
||||||
make_pg_path("repmgr"),
|
make_path(remote_pg_bindir, "repmgr"),
|
||||||
remote_data_directory,
|
remote_data_directory,
|
||||||
runtime_options.remote_config_file,
|
runtime_options.remote_config_file,
|
||||||
repmgr_db_cli_params
|
repmgr_db_cli_params
|
||||||
@@ -3331,7 +3351,7 @@ do_standby_switchover(void)
|
|||||||
format_db_cli_params(options.conninfo, repmgr_db_cli_params);
|
format_db_cli_params(options.conninfo, repmgr_db_cli_params);
|
||||||
maxlen_snprintf(command,
|
maxlen_snprintf(command,
|
||||||
"%s -D %s -f %s %s standby follow",
|
"%s -D %s -f %s %s standby follow",
|
||||||
make_pg_path("repmgr"),
|
make_path(remote_pg_bindir, "repmgr"),
|
||||||
remote_data_directory,
|
remote_data_directory,
|
||||||
runtime_options.remote_config_file,
|
runtime_options.remote_config_file,
|
||||||
repmgr_db_cli_params
|
repmgr_db_cli_params
|
||||||
@@ -3355,13 +3375,15 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
for(i = 0; i < options.reconnect_attempts; i++)
|
for(i = 0; i < options.reconnect_attempts; i++)
|
||||||
{
|
{
|
||||||
/* Check whether primary is available */
|
/* Check whether new standby available */
|
||||||
|
|
||||||
remote_conn = test_db_connection(remote_conninfo, false); /* don't fail on error */
|
remote_conn = test_db_connection(remote_conninfo, false); /* don't fail on error */
|
||||||
|
|
||||||
if (PQstatus(remote_conn) == CONNECTION_OK)
|
if (PQstatus(remote_conn) == CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_debug("connected to new standby (old master)\n");
|
log_debug("connected to new standby (old master)\n");
|
||||||
|
|
||||||
|
/* make sure it's actually a standby */
|
||||||
if (is_standby(remote_conn) == 0)
|
if (is_standby(remote_conn) == 0)
|
||||||
{
|
{
|
||||||
log_err(_("new standby (old master) is not a standby\n"));
|
log_err(_("new standby (old master) is not a standby\n"));
|
||||||
@@ -4201,6 +4223,8 @@ do_help(void)
|
|||||||
printf(_(" -m, --mode (standby switchover) shutdown mode (smart|fast|immediate)\n"));
|
printf(_(" -m, --mode (standby switchover) shutdown mode (smart|fast|immediate)\n"));
|
||||||
printf(_(" -C, --remote-config-file (standby switchover) path to the configuration file on\n" \
|
printf(_(" -C, --remote-config-file (standby switchover) path to the configuration file on\n" \
|
||||||
" the current master\n"));
|
" the current master\n"));
|
||||||
|
printf(_(" -B, --remote-pg_bindir (standby switchover) path to PostgreSQL binaries on\n" \
|
||||||
|
" the current master\n"));
|
||||||
printf(_(" --pg_rewind[=VALUE] (standby switchover) 9.3/9.4 only - use pg_rewind if available,\n" \
|
printf(_(" --pg_rewind[=VALUE] (standby switchover) 9.3/9.4 only - use pg_rewind if available,\n" \
|
||||||
" optionally providing a path to the binary\n"));
|
" optionally providing a path to the binary\n"));
|
||||||
printf(_(" -k, --keep-history=VALUE (cluster cleanup) retain indicated number of days of history (default: 0)\n"));
|
printf(_(" -k, --keep-history=VALUE (cluster cleanup) retain indicated number of days of history (default: 0)\n"));
|
||||||
@@ -4743,6 +4767,14 @@ check_parameters_for_action(const int action)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (action != STANDBY_SWITCHOVER)
|
||||||
|
{
|
||||||
|
if (strlen(runtime_options.remote_pg_bindir))
|
||||||
|
{
|
||||||
|
error_list_append(&cli_warnings, _("--remote-pg_bindir an only be used when executing STANDBY_SWITCHOVER"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5496,12 +5528,18 @@ do_check_upstream_config(void)
|
|||||||
static char *
|
static char *
|
||||||
make_pg_path(char *file)
|
make_pg_path(char *file)
|
||||||
{
|
{
|
||||||
maxlen_snprintf(path_buf, "%s%s", pg_bindir, file);
|
return make_path(pg_bindir, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
make_path(char *path, char *file)
|
||||||
|
{
|
||||||
|
maxlen_snprintf(path_buf, "%s%s", path, file);
|
||||||
|
|
||||||
return path_buf;
|
return path_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
exit_with_errors(void)
|
exit_with_errors(void)
|
||||||
{
|
{
|
||||||
|
|||||||
5
repmgr.h
5
repmgr.h
@@ -79,8 +79,9 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
char loglevel[MAXLEN];
|
char loglevel[MAXLEN];
|
||||||
|
|
||||||
/* parameter used by STANDBY SWITCHOVER */
|
/* parameters used by STANDBY SWITCHOVER */
|
||||||
char remote_config_file[MAXLEN];
|
char remote_config_file[MAXLEN];
|
||||||
|
char remote_pg_bindir[MAXLEN];
|
||||||
char pg_rewind[MAXPGPATH];
|
char pg_rewind[MAXPGPATH];
|
||||||
/* parameter used by STANDBY {ARCHIVE_CONFIG | RESTORE_CONFIG} */
|
/* parameter used by STANDBY {ARCHIVE_CONFIG | RESTORE_CONFIG} */
|
||||||
char config_archive_dir[MAXLEN];
|
char config_archive_dir[MAXLEN];
|
||||||
@@ -96,7 +97,7 @@ typedef struct
|
|||||||
bool initdb_no_pwprompt;
|
bool initdb_no_pwprompt;
|
||||||
} t_runtime_options;
|
} t_runtime_options;
|
||||||
|
|
||||||
#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, false, false, false, false, false, false, "smart", "", "", "", "", "", 0, "", "", "", false }
|
#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, false, false, false, false, false, false, "smart", "", "", "", "", "", "", 0, "", "", "", false }
|
||||||
|
|
||||||
struct BackupLabel
|
struct BackupLabel
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user