diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl index 840af66f75..23a19c67bf 100644 --- a/src/test/recovery/t/001_stream_rep.pl +++ b/src/test/recovery/t/001_stream_rep.pl @@ -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');