mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 16:46:28 +00:00
Support separately-compiled pg_rewind for "repmgr standby switchover" in 9.3/9.4
This commit is contained in:
77
repmgr.c
77
repmgr.c
@@ -132,6 +132,7 @@ t_runtime_options runtime_options = T_RUNTIME_OPTIONS_INITIALIZER;
|
|||||||
t_configuration_options options = T_CONFIGURATION_OPTIONS_INITIALIZER;
|
t_configuration_options options = T_CONFIGURATION_OPTIONS_INITIALIZER;
|
||||||
|
|
||||||
bool wal_keep_segments_used = false;
|
bool wal_keep_segments_used = false;
|
||||||
|
bool pg_rewind_supplied = false;
|
||||||
|
|
||||||
static char *server_mode = NULL;
|
static char *server_mode = NULL;
|
||||||
static char *server_cmd = NULL;
|
static char *server_cmd = NULL;
|
||||||
@@ -178,6 +179,7 @@ main(int argc, char **argv)
|
|||||||
{"recovery-min-apply-delay", required_argument, NULL, 3},
|
{"recovery-min-apply-delay", required_argument, NULL, 3},
|
||||||
{"ignore-external-config-files", no_argument, NULL, 4},
|
{"ignore-external-config-files", no_argument, NULL, 4},
|
||||||
{"config-archive-dir", required_argument, NULL, 5},
|
{"config-archive-dir", required_argument, NULL, 5},
|
||||||
|
{"pg_rewind", optional_argument, NULL, 6},
|
||||||
{"help", no_argument, NULL, '?'},
|
{"help", no_argument, NULL, '?'},
|
||||||
{"version", no_argument, NULL, 'V'},
|
{"version", no_argument, NULL, 'V'},
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
@@ -354,6 +356,13 @@ main(int argc, char **argv)
|
|||||||
case 5:
|
case 5:
|
||||||
strncpy(runtime_options.config_archive_dir, optarg, MAXLEN);
|
strncpy(runtime_options.config_archive_dir, optarg, MAXLEN);
|
||||||
break;
|
break;
|
||||||
|
case 6:
|
||||||
|
if (optarg != NULL)
|
||||||
|
{
|
||||||
|
strncpy(runtime_options.pg_rewind, optarg, MAXFILENAME);
|
||||||
|
}
|
||||||
|
pg_rewind_supplied = true;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@@ -2408,6 +2417,7 @@ do_standby_switchover(void)
|
|||||||
int remote_node_id;
|
int remote_node_id;
|
||||||
char remote_node_replication_state[MAXLEN] = "";
|
char remote_node_replication_state[MAXLEN] = "";
|
||||||
char remote_archive_config_dir[MAXLEN];
|
char remote_archive_config_dir[MAXLEN];
|
||||||
|
char remote_pg_rewind[MAXLEN];
|
||||||
int i,
|
int i,
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
@@ -2419,6 +2429,14 @@ do_standby_switchover(void)
|
|||||||
t_node_info remote_node_record;
|
t_node_info remote_node_record;
|
||||||
bool connection_success;
|
bool connection_success;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SANITY CHECKS
|
||||||
|
*
|
||||||
|
* We'll be doing a bunch of operations on the remote server (primary
|
||||||
|
* to be demoted) - careful checks needed before proceding.
|
||||||
|
*/
|
||||||
|
|
||||||
log_notice(_("switching current node %i to master server and demoting current master to standby...\n"), options.node);
|
log_notice(_("switching current node %i to master server and demoting current master to standby...\n"), options.node);
|
||||||
|
|
||||||
local_conn = establish_db_connection(options.conninfo, true);
|
local_conn = establish_db_connection(options.conninfo, true);
|
||||||
@@ -2435,6 +2453,15 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
server_version_num = check_server_version(local_conn, "master", true, NULL);
|
server_version_num = check_server_version(local_conn, "master", true, NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a friendly notice if --pg_rewind supplied for 9.5 and later - we'll
|
||||||
|
* be ignoring it anyway
|
||||||
|
*/
|
||||||
|
if (pg_rewind_supplied == true && server_version_num >= 90500)
|
||||||
|
{
|
||||||
|
log_notice(_("--pg_rewind not required for PostgreSQL 9.5 and later\n"));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: check that standby's upstream node is the primary
|
* TODO: check that standby's upstream node is the primary
|
||||||
* (it's probably not feasible to switch over to a cascaded standby)
|
* (it's probably not feasible to switch over to a cascaded standby)
|
||||||
@@ -2621,10 +2648,43 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
if (server_version_num >= 90500)
|
if (server_version_num >= 90500)
|
||||||
{
|
{
|
||||||
|
/* 9.5 and later have pg_rewind built-in - always use that */
|
||||||
use_pg_rewind = true;
|
use_pg_rewind = true;
|
||||||
|
maxlen_snprintf(remote_pg_rewind,
|
||||||
|
"%s/pg_rewind",
|
||||||
|
pg_bindir);
|
||||||
}
|
}
|
||||||
// elseif (server_version_num < 90500) && --pg_rewind supplied
|
else
|
||||||
// - check found
|
{
|
||||||
|
/* 9.3/9.4 - user can use separately-compiled pg_rewind */
|
||||||
|
if (pg_rewind_supplied == true)
|
||||||
|
{
|
||||||
|
use_pg_rewind = true;
|
||||||
|
|
||||||
|
/* User has specified pg_rewind path */
|
||||||
|
if (strlen(runtime_options.pg_rewind))
|
||||||
|
{
|
||||||
|
maxlen_snprintf(remote_pg_rewind,
|
||||||
|
"%s",
|
||||||
|
runtime_options.pg_rewind);
|
||||||
|
}
|
||||||
|
/* No path supplied - assume in normal bindir */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxlen_snprintf(remote_pg_rewind,
|
||||||
|
"%s/pg_rewind",
|
||||||
|
pg_bindir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: check file actually exists on remote */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SANITY CHECKS completed
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When using pg_rewind (the preferable option), we need to
|
* When using pg_rewind (the preferable option), we need to
|
||||||
@@ -4058,7 +4118,7 @@ check_parameters_for_action(const int action)
|
|||||||
}
|
}
|
||||||
if (runtime_options.fast_checkpoint && runtime_options.rsync_only)
|
if (runtime_options.fast_checkpoint && runtime_options.rsync_only)
|
||||||
{
|
{
|
||||||
error_list_append(&cli_warnings, _("-c/--fast-checkpoint has no effect when using -r/--rsync-only "));
|
error_list_append(&cli_warnings, _("-c/--fast-checkpoint has no effect when using -r/--rsync-only"));
|
||||||
}
|
}
|
||||||
config_file_required = false;
|
config_file_required = false;
|
||||||
break;
|
break;
|
||||||
@@ -4120,7 +4180,16 @@ check_parameters_for_action(const int action)
|
|||||||
|
|
||||||
if (wal_keep_segments_used)
|
if (wal_keep_segments_used)
|
||||||
{
|
{
|
||||||
error_list_append(&cli_warnings, _("-w/--wal-keep-segments can only be used when executing STANDBY CLONE %i"));
|
error_list_append(&cli_warnings, _("-w/--wal-keep-segments can only be used when executing STANDBY CLONE"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Warn about parameters which apply to STANDBY SWITCHOVER only */
|
||||||
|
if (action != STANDBY_SWITCHOVER)
|
||||||
|
{
|
||||||
|
if (pg_rewind_supplied == true)
|
||||||
|
{
|
||||||
|
error_list_append(&cli_warnings, _("--pg_rewind can only be used when executing STANDBY SWITCHOVER"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
3
repmgr.h
3
repmgr.h
@@ -83,6 +83,7 @@ typedef struct
|
|||||||
|
|
||||||
/* parameter used by STANDBY SWITCHOVER */
|
/* parameter used by STANDBY SWITCHOVER */
|
||||||
char remote_config_file[MAXLEN];
|
char remote_config_file[MAXLEN];
|
||||||
|
char pg_rewind[MAXFILENAME];
|
||||||
/* 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];
|
||||||
/* parameter used by CLUSTER CLEANUP */
|
/* parameter used by CLUSTER CLEANUP */
|
||||||
@@ -96,7 +97,7 @@ typedef struct
|
|||||||
char localport[MAXLEN];
|
char localport[MAXLEN];
|
||||||
} t_runtime_options;
|
} t_runtime_options;
|
||||||
|
|
||||||
#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, false, false, false, false, false, "smart", "", "", "", "", 0, "", "", "" }
|
#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, false, false, false, false, false, "smart", "", "", "", "", "", 0, "", "", "" }
|
||||||
|
|
||||||
extern char repmgr_schema[MAXLEN];
|
extern char repmgr_schema[MAXLEN];
|
||||||
extern bool config_file_found;
|
extern bool config_file_found;
|
||||||
|
|||||||
Reference in New Issue
Block a user