Simplify fetch-slot-xmins logic in recovery TAP tests.

Merge wait_slot_xmins() into get_slot_xmins().  At this point the only
place that wasn't doing a wait was the initial-state test, and a wait
there seems pretty harmless.

Michael Paquier

Discussion: https://postgr.es/m/CAB7nPqSp_SLQb2uU7am+sn4V3g1UKv8j3yZU385oAG1cG_BN9Q@mail.gmail.com
This commit is contained in:
Tom Lane 2017-08-12 12:08:54 -04:00
parent d6ecad812f
commit 3043c1ddd1
1 changed files with 25 additions and 40 deletions

View File

@ -146,35 +146,32 @@ $node_standby_2->append_conf('postgresql.conf',
"wal_receiver_status_interval = 1");
$node_standby_2->restart;
# Wait for given condition on slot's pg_replication_slots row --- useful for
# ensuring we've reached a quiescent condition for reading slot xmins
sub wait_slot_xmins
# Fetch xmin columns from slot's pg_replication_slots row, after waiting for
# given boolean condition to be true to ensure we've reached a quiescent state
sub get_slot_xmins
{
my ($node, $slot_name, $check_expr) = @_;
my ($node, $slotname, $check_expr) = @_;
$node->poll_query_until('postgres', qq[
SELECT $check_expr
FROM pg_catalog.pg_replication_slots
WHERE slot_name = '$slot_name';
WHERE slot_name = '$slotname';
])
or die "Timed out waiting for slot xmins to advance";
}
# Fetch xmin columns from slot's pg_replication_slots row
sub get_slot_xmins
{
my ($node, $slotname) = @_;
my $slotinfo = $node->slot($slotname);
return ($slotinfo->{'xmin'}, $slotinfo->{'catalog_xmin'});
}
# There's no hot standby feedback and there are no logical slots on either peer
# so xmin and catalog_xmin should be null on both slots.
my ($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1);
my ($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1,
"xmin IS NULL AND catalog_xmin IS NULL");
is($xmin, '', 'xmin of non-cascaded slot null with no hs_feedback');
is($catalog_xmin, '', 'catalog xmin of non-cascaded slot null with no hs_feedback');
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2);
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NULL AND catalog_xmin IS NULL");
is($xmin, '', 'xmin of cascaded slot null with no hs_feedback');
is($catalog_xmin, '', 'catalog xmin of cascaded slot null with no hs_feedback');
@ -212,18 +209,14 @@ $node_standby_2->safe_psql('postgres',
$node_standby_2->reload;
replay_check();
wait_slot_xmins($node_master, $slotname_1,
"xmin IS NOT NULL AND catalog_xmin IS NULL");
($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1);
($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1,
"xmin IS NOT NULL AND catalog_xmin IS NULL");
isnt($xmin, '', 'xmin of non-cascaded slot non-null with hs feedback');
is($catalog_xmin, '',
'catalog xmin of non-cascaded slot still null with hs_feedback');
wait_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NOT NULL AND catalog_xmin IS NULL");
my ($xmin1, $catalog_xmin1) = get_slot_xmins($node_standby_1, $slotname_2);
my ($xmin1, $catalog_xmin1) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NOT NULL AND catalog_xmin IS NULL");
isnt($xmin1, '', 'xmin of cascaded slot non-null with hs feedback');
is($catalog_xmin1, '',
'catalog xmin of cascaded slot still null with hs_feedback');
@ -246,17 +239,15 @@ end$$;
$node_master->safe_psql('postgres', 'VACUUM;');
$node_master->safe_psql('postgres', 'CHECKPOINT;');
wait_slot_xmins($node_master, $slotname_1, "xmin <> '$xmin'");
my ($xmin2, $catalog_xmin2) = get_slot_xmins($node_master, $slotname_1);
my ($xmin2, $catalog_xmin2) = get_slot_xmins($node_master, $slotname_1,
"xmin <> '$xmin'");
note "master slot's new xmin $xmin2, old xmin $xmin";
isnt($xmin2, $xmin, 'xmin of non-cascaded slot with hs feedback has changed');
is($catalog_xmin2, '',
'catalog xmin of non-cascaded slot still null with hs_feedback unchanged');
wait_slot_xmins($node_standby_1, $slotname_2, "xmin <> '$xmin1'");
($xmin2, $catalog_xmin2) = get_slot_xmins($node_standby_1, $slotname_2);
($xmin2, $catalog_xmin2) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin <> '$xmin1'");
note "standby_1 slot's new xmin $xmin2, old xmin $xmin1";
isnt($xmin2, $xmin1, 'xmin of cascaded slot with hs feedback has changed');
is($catalog_xmin2, '',
@ -273,18 +264,14 @@ $node_standby_2->safe_psql('postgres',
$node_standby_2->reload;
replay_check();
wait_slot_xmins($node_master, $slotname_1,
"xmin IS NULL AND catalog_xmin IS NULL");
($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1);
($xmin, $catalog_xmin) = get_slot_xmins($node_master, $slotname_1,
"xmin IS NULL AND catalog_xmin IS NULL");
is($xmin, '', 'xmin of non-cascaded slot null with hs feedback reset');
is($catalog_xmin, '',
'catalog xmin of non-cascaded slot still null with hs_feedback reset');
wait_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NULL AND catalog_xmin IS NULL");
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2);
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NULL AND catalog_xmin IS NULL");
is($xmin, '', 'xmin of cascaded slot null with hs feedback reset');
is($catalog_xmin, '',
'catalog xmin of cascaded slot still null with hs_feedback reset');
@ -301,16 +288,14 @@ $node_standby_2->safe_psql('postgres',
'ALTER SYSTEM SET hot_standby_feedback = off;');
$node_standby_2->stop;
wait_slot_xmins($node_standby_1, $slotname_2, "xmin IS NOT NULL");
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2);
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NOT NULL");
isnt($xmin, '', 'xmin of cascaded slot non-null with postgres shut down');
# Xmin from a previous run should be cleared on startup.
$node_standby_2->start;
wait_slot_xmins($node_standby_1, $slotname_2, "xmin IS NULL");
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2);
($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2,
"xmin IS NULL");
is($xmin, '',
'xmin of cascaded slot reset after startup with hs feedback reset');