mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Back-port a few PostgresNode.pm methods.
The 'lsn' and 'wait_for_catchup' methods only exist in v10 and higher, but are needed in order to support a test planned test case for a bug that exists all the way back to v9.6. To minimize cross-branch differences in the test case, back-port these methods. Discussion: http://postgr.es/m/CA+TgmoaG5dmA_8Xc1WvbvftPjtwx5uzkGEHxE7MiJ+im9jynmw@mail.gmail.com
This commit is contained in:
@ -1472,6 +1472,89 @@ sub issues_sql_like
|
|||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
|
=item $node->lsn(mode)
|
||||||
|
|
||||||
|
Look up WAL locations on the server:
|
||||||
|
|
||||||
|
* insert location (master only, error on replica)
|
||||||
|
* write location (master only, error on replica)
|
||||||
|
* flush location (master only, error on replica)
|
||||||
|
* receive location (always undef on master)
|
||||||
|
* replay location (always undef on master)
|
||||||
|
|
||||||
|
mode must be specified.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub lsn
|
||||||
|
{
|
||||||
|
my ($self, $mode) = @_;
|
||||||
|
my %modes = (
|
||||||
|
'insert' => 'pg_current_xlog_insert_location()',
|
||||||
|
'flush' => 'pg_current_xlog_flush_location()',
|
||||||
|
'write' => 'pg_current_xlog_location()',
|
||||||
|
'receive' => 'pg_last_xlog_receive_location()',
|
||||||
|
'replay' => 'pg_last_xlog_replay_location()');
|
||||||
|
|
||||||
|
$mode = '<undef>' if !defined($mode);
|
||||||
|
die "unknown mode for 'lsn': '$mode', valid modes are "
|
||||||
|
. join(', ', keys %modes)
|
||||||
|
if !defined($modes{$mode});
|
||||||
|
|
||||||
|
my $result = $self->safe_psql('postgres', "SELECT $modes{$mode}");
|
||||||
|
chomp($result);
|
||||||
|
if ($result eq '')
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=item $node->wait_for_catchup(standby_name, mode, target_lsn)
|
||||||
|
|
||||||
|
Wait for the node with application_name standby_name (usually from node->name)
|
||||||
|
until its replication position in pg_stat_replication equals or passes the
|
||||||
|
upstream's xlog insert point at the time this function is called. By default
|
||||||
|
the replay_location is waited for, but 'mode' may be specified to wait for any
|
||||||
|
of sent|write|flush|replay.
|
||||||
|
|
||||||
|
If there is no active replication connection from this peer, waits until
|
||||||
|
poll_query_until timeout.
|
||||||
|
|
||||||
|
Requires that the 'postgres' db exists and is accessible.
|
||||||
|
|
||||||
|
target_lsn may be any arbitrary lsn, but is typically $master_node->lsn('insert').
|
||||||
|
|
||||||
|
This is not a test. It die()s on failure.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub wait_for_catchup
|
||||||
|
{
|
||||||
|
my ($self, $standby_name, $mode, $target_lsn) = @_;
|
||||||
|
$mode = defined($mode) ? $mode : 'replay';
|
||||||
|
my %valid_modes = ( 'sent' => 1, 'write' => 1, 'flush' => 1, 'replay' => 1 );
|
||||||
|
die "unknown mode $mode for 'wait_for_catchup', valid modes are " . join(', ', keys(%valid_modes)) unless exists($valid_modes{$mode});
|
||||||
|
# Allow passing of a PostgresNode instance as shorthand
|
||||||
|
if ( blessed( $standby_name ) && $standby_name->isa("PostgresNode") )
|
||||||
|
{
|
||||||
|
$standby_name = $standby_name->name;
|
||||||
|
}
|
||||||
|
die 'target_lsn must be specified' unless defined($target_lsn);
|
||||||
|
print "Waiting for replication conn " . $standby_name . "'s " . $mode . "_location to pass " . $target_lsn . " on " . $self->name . "\n";
|
||||||
|
my $query = qq[SELECT '$target_lsn' <= ${mode}_location FROM pg_catalog.pg_stat_replication WHERE application_name = '$standby_name';];
|
||||||
|
$self->poll_query_until('postgres', $query)
|
||||||
|
or die "timed out waiting for catchup, current position is " . ($self->safe_psql('postgres', $query) || '(unknown)');
|
||||||
|
print "done\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
Reference in New Issue
Block a user