mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 00:26:30 +00:00
Have 'standby promote' use 'pg_ctl promote'
This commit is contained in:
49
repmgr.c
49
repmgr.c
@@ -1182,14 +1182,18 @@ do_standby_promote(void)
|
|||||||
int r,
|
int r,
|
||||||
retval;
|
retval;
|
||||||
char data_dir[MAXLEN];
|
char data_dir[MAXLEN];
|
||||||
char recovery_file_path[MAXFILENAME];
|
|
||||||
char recovery_done_path[MAXFILENAME];
|
int i,
|
||||||
|
promote_check_timeout = 60,
|
||||||
|
promote_check_interval = 2;
|
||||||
|
bool promote_sucess = false;
|
||||||
|
|
||||||
/* We need to connect to check configuration */
|
/* We need to connect to check configuration */
|
||||||
log_info(_("%s connecting to standby database\n"), progname);
|
log_info(_("%s connecting to standby database\n"), progname);
|
||||||
conn = establish_db_connection(options.conninfo, true);
|
conn = establish_db_connection(options.conninfo, true);
|
||||||
|
|
||||||
/* Verify that standby is a supported server version */
|
/* Verify that standby is a supported server version */
|
||||||
|
/* XXX verify that primary and standby are compatible versions? */
|
||||||
log_info(_("%s connected to standby, checking its state\n"), progname);
|
log_info(_("%s connected to standby, checking its state\n"), progname);
|
||||||
|
|
||||||
check_server_version(conn, "standby", true, NULL);
|
check_server_version(conn, "standby", true, NULL);
|
||||||
@@ -1235,33 +1239,44 @@ do_standby_promote(void)
|
|||||||
PQclear(res);
|
PQclear(res);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
|
|
||||||
log_info(_("%s: Marking recovery done\n"), progname);
|
|
||||||
maxlen_snprintf(recovery_file_path, "%s/%s", data_dir, RECOVERY_FILE);
|
|
||||||
maxlen_snprintf(recovery_done_path, "%s/%s", data_dir, RECOVERY_DONE_FILE);
|
|
||||||
rename(recovery_file_path, recovery_done_path);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restart and wait for the server to finish starting, so that the check
|
* Promote standby to master.
|
||||||
* below will find an active server rather than one starting up. This may
|
*
|
||||||
* hang for up the default timeout (60 seconds).
|
* `pg_ctl promote` returns immediately and has no -w option, so we
|
||||||
|
* can't be sure when or if the promotion completes.
|
||||||
|
* For now we'll poll the server until the default timeout (60 seconds)
|
||||||
*/
|
*/
|
||||||
log_notice(_("%s: restarting server using %s/pg_ctl\n"), progname,
|
log_notice(_("%s: promoting server using %s/pg_ctl\n"), progname,
|
||||||
options.pg_bindir);
|
options.pg_bindir);
|
||||||
maxlen_snprintf(script, "%s/pg_ctl %s -D %s -w -m fast restart",
|
maxlen_snprintf(script, "%s/pg_ctl -D %s promote",
|
||||||
options.pg_bindir, options.pgctl_options, data_dir);
|
options.pg_bindir, data_dir);
|
||||||
|
|
||||||
r = system(script);
|
r = system(script);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
log_err(_("Can't restart PostgreSQL server\n"));
|
log_err(_("Unable to promote server from standby to primary\n"));
|
||||||
exit(ERR_NO_RESTART);
|
exit(ERR_NO_RESTART);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reconnect to check we got promoted */
|
/* reconnect to check we got promoted */
|
||||||
log_info(_("%s connecting to now restarted database\n"), progname);
|
|
||||||
|
log_info(_("%s reconnecting to promoted server\n"), progname);
|
||||||
conn = establish_db_connection(options.conninfo, true);
|
conn = establish_db_connection(options.conninfo, true);
|
||||||
retval = is_standby(conn);
|
|
||||||
if (retval)
|
for(i = 0; i < promote_check_timeout; i += promote_check_interval)
|
||||||
{
|
{
|
||||||
|
retval = is_standby(conn);
|
||||||
|
if(!retval)
|
||||||
|
{
|
||||||
|
promote_sucess = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(promote_check_interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (promote_sucess == false)
|
||||||
|
{
|
||||||
|
/* XXX exit with error? */
|
||||||
log_err(_(retval == 1 ?
|
log_err(_(retval == 1 ?
|
||||||
"%s: STANDBY PROMOTE failed, this is still a standby node.\n" :
|
"%s: STANDBY PROMOTE failed, this is still a standby node.\n" :
|
||||||
"%s: connection to node lost!\n"), progname);
|
"%s: connection to node lost!\n"), progname);
|
||||||
|
|||||||
Reference in New Issue
Block a user