mirror of
https://github.com/postgres/postgres.git
synced 2025-06-23 14:01:44 +03:00
pg_ctl: Add wait option to promote action
When waiting is selected for the promote action, look into pg_control until the state changes, then use the PQping-based waiting until the server is reachable. Reviewed-by: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
@ -1228,7 +1228,34 @@ do_promote(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print_msg(_("server promoting\n"));
|
||||
if (do_wait)
|
||||
{
|
||||
DBState state = DB_STARTUP;
|
||||
|
||||
print_msg(_("waiting for server to promote..."));
|
||||
while (wait_seconds > 0)
|
||||
{
|
||||
state = get_control_dbstate();
|
||||
if (state == DB_IN_PRODUCTION)
|
||||
break;
|
||||
|
||||
print_msg(".");
|
||||
pg_usleep(1000000); /* 1 sec */
|
||||
wait_seconds--;
|
||||
}
|
||||
if (state == DB_IN_PRODUCTION)
|
||||
{
|
||||
print_msg(_(" done\n"));
|
||||
print_msg(_("server promoted\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
print_msg(_(" stopped waiting\n"));
|
||||
print_msg(_("server is still promoting\n"));
|
||||
}
|
||||
}
|
||||
else
|
||||
print_msg(_("server promoting\n"));
|
||||
}
|
||||
|
||||
|
||||
@ -2405,18 +2432,10 @@ main(int argc, char **argv)
|
||||
|
||||
if (!wait_set)
|
||||
{
|
||||
switch (ctl_command)
|
||||
{
|
||||
case RESTART_COMMAND:
|
||||
case START_COMMAND:
|
||||
do_wait = false;
|
||||
break;
|
||||
case STOP_COMMAND:
|
||||
do_wait = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (ctl_command == STOP_COMMAND)
|
||||
do_wait = true;
|
||||
else
|
||||
do_wait = false;
|
||||
}
|
||||
|
||||
if (ctl_command == RELOAD_COMMAND)
|
||||
|
@ -3,7 +3,7 @@ use warnings;
|
||||
|
||||
use PostgresNode;
|
||||
use TestLib;
|
||||
use Test::More tests => 9;
|
||||
use Test::More tests => 12;
|
||||
|
||||
my $tempdir = TestLib::tempdir;
|
||||
|
||||
@ -37,3 +37,19 @@ command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, 'promote' ],
|
||||
|
||||
ok($node_standby->poll_query_until('postgres', 'SELECT NOT pg_is_in_recovery()'),
|
||||
'promoted standby is not in recovery');
|
||||
|
||||
# same again with wait option
|
||||
$node_standby = get_new_node('standby2');
|
||||
$node_standby->init_from_backup($node_primary, 'my_backup', has_streaming => 1);
|
||||
$node_standby->start;
|
||||
|
||||
is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
|
||||
't', 'standby is in recovery');
|
||||
|
||||
command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, '-w', 'promote' ],
|
||||
'pg_ctl -w promote of standby runs');
|
||||
|
||||
# no wait here
|
||||
|
||||
is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
|
||||
'f', 'promoted standby is not in recovery');
|
||||
|
Reference in New Issue
Block a user