Improve recently-added test reliability
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Sat, 6 Aug 2022 13:52:10 +0000 (15:52 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Sat, 6 Aug 2022 13:52:10 +0000 (15:52 +0200)
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

index 4d2832e51bb59b4a23a40f2c34bc7bd8802bff9a..140d94db312f35dc735e75f3a29f1f8e15153416 100644 (file)
@@ -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
 {
@@ -34,14 +35,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,7 +62,7 @@ sub test_tablespace
    ];
 
    $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
@@ -113,7 +113,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(
@@ -127,7 +127,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
@@ -135,31 +135,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/;
 }