From 6390bc740f902557cad40106708a5d40c6e3389e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 6 Aug 2022 15:52:10 +0200 Subject: [PATCH] Improve recently-added test reliability Commit 59be1c942a47 already tried to make src/test/recovery/t/033_replay_tsp_drops more reliable, but it wasn't enough. Try to improve on that by making this use of a replication slot to be more like others. Also, don't drop the slot. Make a few other stylistic changes while at it. It's still quite slow, which is another thing that we need to fix in this script. Backpatch to all supported branches. Discussion: https://postgr.es/m/349302.1659191875@sss.pgh.pa.us --- src/test/recovery/t/033_replay_tsp_drops.pl | 37 +++++++-------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/test/recovery/t/033_replay_tsp_drops.pl b/src/test/recovery/t/033_replay_tsp_drops.pl index 5c29cf55e7..57fee21276 100644 --- a/src/test/recovery/t/033_replay_tsp_drops.pl +++ b/src/test/recovery/t/033_replay_tsp_drops.pl @@ -9,6 +9,7 @@ use warnings; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; +use Time::HiRes qw(usleep); sub test_tablespace { @@ -36,14 +37,13 @@ sub test_tablespace has_streaming => 1); $node_standby->append_conf('postgresql.conf', "allow_in_place_tablespaces = on"); + $node_standby->append_conf('postgresql.conf', + "primary_slot_name = slot"); $node_standby->start; - # Make sure connection is made - $node_primary->poll_query_until('postgres', - 'SELECT count(*) = 1 FROM pg_stat_replication'); - $node_primary->safe_psql('postgres', "SELECT pg_drop_replication_slot('slot')"); - - $node_standby->safe_psql('postgres', 'CHECKPOINT'); + # Make sure the connection is made + $node_primary->wait_for_catchup($node_standby, 'write', + $node_primary->lsn('write')); # Do immediate shutdown just after a sequence of CREATE DATABASE / DROP # DATABASE / DROP TABLESPACE. This causes CREATE DATABASE WAL records @@ -62,10 +62,10 @@ sub test_tablespace DROP TABLESPACE source_ts; DROP DATABASE template_db; ]; - $query =~ s//$strategy/g; + $node_primary->safe_psql('postgres', $query); - $node_primary->wait_for_catchup($node_standby, 'replay', + $node_primary->wait_for_catchup($node_standby, 'write', $node_primary->lsn('write')); # show "create missing directory" log message @@ -119,7 +119,7 @@ my $tspoid = $node_standby->safe_psql('postgres', my $tspdir = $node_standby->data_dir . "/pg_tblspc/$tspoid"; File::Path::rmtree($tspdir); -my $logstart = get_log_size($node_standby); +my $logstart = -s $node_standby->logfile; # Create a database in the tablespace and a table in default tablespace $node_primary->safe_psql( @@ -133,7 +133,7 @@ $node_primary->safe_psql( # Standby should fail and should not silently skip replaying the wal # In this test, PANIC turns into WARNING by allow_in_place_tablespaces. # Check the log messages instead of confirming standby failure. -my $max_attempts = $PostgreSQL::Test::Utils::timeout_default; +my $max_attempts = $PostgreSQL::Test::Utils::timeout_default * 10; while ($max_attempts-- >= 0) { last @@ -141,31 +141,18 @@ while ($max_attempts-- >= 0) find_in_log( $node_standby, qr!WARNING: ( [A-Z0-9]+:)? creating missing directory: pg_tblspc/!, $logstart)); - sleep 1; + usleep(100_000); } ok($max_attempts > 0, "invalid directory creation is detected"); done_testing(); - -# return the size of logfile of $node in bytes -sub get_log_size -{ - my ($node) = @_; - - return (stat $node->logfile)[7]; -} - # find $pat in logfile of $node after $off-th byte sub find_in_log { my ($node, $pat, $off) = @_; - $off = 0 unless defined $off; - my $log = PostgreSQL::Test::Utils::slurp_file($node->logfile); - return 0 if (length($log) <= $off); - - $log = substr($log, $off); + my $log = PostgreSQL::Test::Utils::slurp_file($node->logfile, $off); return $log =~ m/$pat/; }