]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Introduce PG_TEST_TIMEOUT_DEFAULT for TAP suite non-elapsing timeouts.
authorNoah Misch <noah@leadboat.com>
Sat, 5 Mar 2022 02:53:13 +0000 (18:53 -0800)
committerNoah Misch <noah@leadboat.com>
Sat, 5 Mar 2022 02:53:17 +0000 (18:53 -0800)
Slow hosts may avoid load-induced, spurious failures by setting
environment variable PG_TEST_TIMEOUT_DEFAULT to some number of seconds
greater than 180.  Developers may see faster failures by setting that
environment variable to some lesser number of seconds.  In tests, write
$PostgreSQL::Test::Utils::timeout_default wherever the convention has
been to write 180.  This change raises the default for some briefer
timeouts.  Back-patch to v10 (all supported versions).

Discussion: https://postgr.es/m/20220218052842.GA3627003@rfd.leadboat.com

14 files changed:
contrib/amcheck/t/002_cic.pl
contrib/amcheck/t/003_cic_2pc.pl
src/bin/pg_ctl/t/004_logrotate.pl
src/bin/pg_dump/t/002_pg_dump.pl
src/bin/psql/t/010_tab_completion.pl
src/bin/scripts/t/080_pg_isready.pl
src/test/perl/PostgresNode.pm
src/test/perl/TestLib.pm
src/test/recovery/t/003_recovery_targets.pl
src/test/recovery/t/006_logical_decoding.pl
src/test/recovery/t/010_logical_decoding_timelines.pl
src/test/recovery/t/013_crash_restart.pl
src/test/recovery/t/017_shm.pl
src/test/recovery/t/019_replslot_limit.pl

index 832ae8f1cbdb2f52b91ee8bfa8a9213d13f661c6..3587807b9577152cd351ae61857e7efd2dc73225 100644 (file)
@@ -18,7 +18,8 @@ my ($node, $result);
 #
 $node = get_new_node('CIC_test');
 $node->init;
-$node->append_conf('postgresql.conf', 'lock_timeout = 180000');
+$node->append_conf('postgresql.conf',
+       'lock_timeout = ' . (1000 * $TestLib::timeout_default));
 $node->start;
 $node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
 $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
index 9b2c92d11a32b0b6b18a4007c8c1530344fec1b1..445aabaa5e9d5ee216deba94cd08d82dc411b66f 100644 (file)
@@ -22,7 +22,8 @@ my ($node, $result);
 $node = get_new_node('CIC_2PC_test');
 $node->init;
 $node->append_conf('postgresql.conf', 'max_prepared_transactions = 10');
-$node->append_conf('postgresql.conf', 'lock_timeout = 180000');
+$node->append_conf('postgresql.conf',
+       'lock_timeout = ' . (1000 * $TestLib::timeout_default));
 $node->start;
 $node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
 $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
@@ -38,7 +39,7 @@ $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
 
 my $main_in    = '';
 my $main_out   = '';
-my $main_timer = IPC::Run::timeout(180);
+my $main_timer = IPC::Run::timeout($TestLib::timeout_default);
 
 my $main_h =
   $node->background_psql('postgres', \$main_in, \$main_out,
@@ -52,7 +53,7 @@ pump $main_h until $main_out =~ /syncpoint1/ || $main_timer->is_expired;
 
 my $cic_in    = '';
 my $cic_out   = '';
-my $cic_timer = IPC::Run::timeout(180);
+my $cic_timer = IPC::Run::timeout($TestLib::timeout_default);
 my $cic_h =
   $node->background_psql('postgres', \$cic_in, \$cic_out,
        $cic_timer, on_error_stop => 1);
@@ -113,9 +114,10 @@ PREPARE TRANSACTION 'persists_forever';
 ));
 $node->restart;
 
-my $reindex_in    = '';
-my $reindex_out   = '';
-my $reindex_timer = IPC::Run::timeout(180);
+my $reindex_in  = '';
+my $reindex_out = '';
+my $reindex_timer =
+  IPC::Run::timeout($TestLib::timeout_default);
 my $reindex_h =
   $node->background_psql('postgres', \$reindex_in, \$reindex_out,
        $reindex_timer, on_error_stop => 1);
index 2f381e556ec7157d7fc3c2ab7522066ff0594beb..d66f464e10d2675a6a66450dc4d623869ecc0059 100644 (file)
@@ -24,7 +24,7 @@ $node->start();
 $node->psql('postgres', 'SELECT 1/0');
 
 # might need to retry if logging collector process is slow...
-my $max_attempts = 180 * 10;
+my $max_attempts = 10 * $TestLib::timeout_default;
 
 my $current_logfiles;
 for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
index 8c86d75f82d34559c2b4c7ce05c58241e31b2296..4beed0caa90ca41b66c6a4d9237e4bb5c1a0af38 100644 (file)
@@ -271,7 +271,8 @@ my %pgdump_runs = (
                        '--no-sync',
                        "--file=$tempdir/only_dump_test_table.sql",
                        '--table=dump_test.test_table',
-                       '--lock-wait-timeout=1000000',
+                       '--lock-wait-timeout='
+                         . (1000 * $TestLib::timeout_default),
                        'postgres',
                ],
        },
index 2761e6117c715b1a3b376821f1603791efeeb717..cd739be260ae6f063fab9d237147ad847ec6b577 100644 (file)
@@ -89,7 +89,7 @@ close $FH;
 my $in  = '';
 my $out = '';
 
-my $timer = timer(5);
+my $timer = timer($TestLib::timeout_default);
 
 my $h = $node->interactive_psql('postgres', \$in, \$out, $timer);
 
@@ -106,7 +106,7 @@ sub check_completion
        # reset output collector
        $out = "";
        # restart per-command timer
-       $timer->start(5);
+       $timer->start($TestLib::timeout_default);
        # send the data to be sent
        $in .= $send;
        # wait ...
@@ -232,7 +232,7 @@ check_completion(
 clear_line();
 
 # send psql an explicit \q to shut it down, else pty won't close properly
-$timer->start(5);
+$timer->start($TestLib::timeout_default);
 $in .= "\\q\n";
 finish $h or die "psql returned $?";
 $timer->reset;
index 6da89e1b04f314a4c636528fd242320f553e032e..fc2f54f061c106076d7312c4cac514764cf0824e 100644 (file)
@@ -15,6 +15,6 @@ my $node = get_new_node('main');
 $node->init;
 $node->start;
 
-# use a long timeout for the benefit of very slow buildfarm machines
-$node->command_ok([qw(pg_isready --timeout=60)],
+$node->command_ok(
+       [ 'pg_isready', "--timeout=$TestLib::timeout_default" ],
        'succeeds with server running');
index 05c7866709de9ae3ebaae1a0d77d85b38350324a..07120e097b2b03ebba6f79941cdd88a12c9edd28 100644 (file)
@@ -31,7 +31,8 @@ PostgresNode - class representing PostgreSQL server instance
   my ($stdout, $stderr, $timed_out);
   my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)',
          stdout => \$stdout, stderr => \$stderr,
-         timeout => 180, timed_out => \$timed_out,
+         timeout => $TestLib::timeout_default,
+         timed_out => \$timed_out,
          extra_params => ['--single-transaction'],
          on_error_die => 1)
   print "Sleep timed out" if $timed_out;
@@ -1446,7 +1447,8 @@ e.g.
        my ($stdout, $stderr, $timed_out);
        my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)',
                stdout => \$stdout, stderr => \$stderr,
-               timeout => 180, timed_out => \$timed_out,
+               timeout => $TestLib::timeout_default,
+               timed_out => \$timed_out,
                extra_params => ['--single-transaction'])
 
 will set $cmdret to undef and $timed_out to a true value.
@@ -1610,7 +1612,8 @@ scalar reference.  This allows the caller to act on other parts of the system
 while idling this backend.
 
 The specified timer object is attached to the harness, as well.  It's caller's
-responsibility to select the timeout length, and to restart the timer after
+responsibility to set the timeout length (usually
+$TestLib::timeout_default), and to restart the timer after
 each command if the timeout is per-command.
 
 psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc>
@@ -1699,9 +1702,10 @@ The process's stdin is sourced from the $stdin scalar reference,
 and its stdout and stderr go to the $stdout scalar reference.
 ptys are used so that psql thinks it's being called interactively.
 
-The specified timer object is attached to the harness, as well.
-It's caller's responsibility to select the timeout length, and to
-restart the timer after each command if the timeout is per-command.
+The specified timer object is attached to the harness, as well.  It's caller's
+responsibility to set the timeout length (usually
+$TestLib::timeout_default), and to restart the timer after
+each command if the timeout is per-command.
 
 psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc>
 disabled.  That may be overridden by passing extra psql parameters.
@@ -1849,7 +1853,7 @@ sub pgbench
 Run B<$query> repeatedly, until it returns the B<$expected> result
 ('t', or SQL boolean true, by default).
 Continues polling if B<psql> returns an error result.
-Times out after 180 seconds.
+Times out after $TestLib::timeout_default seconds.
 Returns 1 if successful, 0 if timed out.
 
 =cut
@@ -1862,7 +1866,7 @@ sub poll_query_until
 
        my $cmd = [ 'psql', '-XAt', '-d', $self->connstr($dbname) ];
        my ($stdout, $stderr);
-       my $max_attempts = 180 * 10;
+       my $max_attempts = 10 * $TestLib::timeout_default;
        my $attempts     = 0;
 
        while ($attempts < $max_attempts)
@@ -1884,8 +1888,8 @@ sub poll_query_until
                $attempts++;
        }
 
-       # The query result didn't change in 180 seconds. Give up. Print the
-       # output from the last attempt, hopefully that's useful for debugging.
+       # Give up. Print the output from the last attempt, hopefully that's useful
+       # for debugging.
        diag qq(poll_query_until timed out executing this query:
 $query
 expecting this output:
index 57301514577de6c1d609e6028ae39fb3db1c6a84..8d65fdc36a4fb765e61d1623694fafc81de12598 100644 (file)
@@ -86,7 +86,8 @@ our @EXPORT = qw(
   $use_unix_sockets
 );
 
-our ($windows_os, $use_unix_sockets, $tmp_check, $log_path, $test_logfile);
+our ($windows_os, $use_unix_sockets, $timeout_default,
+        $tmp_check, $log_path, $test_logfile);
 
 BEGIN
 {
@@ -144,6 +145,10 @@ BEGIN
        # supported, but it can be overridden if desired.
        $use_unix_sockets =
          (!$windows_os || defined $ENV{PG_TEST_USE_UNIX_SOCKETS});
+
+       $timeout_default = $ENV{PG_TEST_TIMEOUT_DEFAULT};
+       $timeout_default = 180
+         if not defined $timeout_default or $timeout_default eq '';
 }
 
 =pod
index b1a413035c31d340e78a02d8ef93061c5555f527..ea8e81eefc80a2c2a79abcea6e1387de4753ace8 100644 (file)
@@ -169,8 +169,8 @@ run_log(
                $node_standby->logfile, 'start'
        ]);
 
-# wait up to 180s for postgres to terminate
-foreach my $i (0 .. 1800)
+# wait for postgres to terminate
+foreach my $i (0 .. 10 * $TestLib::timeout_default)
 {
        last if !-f $node_standby->data_dir . '/postmaster.pid';
        usleep(100_000);
index 78229a7b92bcd02abdab5673e43cc7facce0c83f..f523d8f59338f30f5ec230caa9a03e968670cda5 100644 (file)
@@ -95,7 +95,7 @@ $node_master->safe_psql('postgres',
 );
 
 my $stdout_recv = $node_master->pg_recvlogical_upto(
-       'postgres', 'test_slot', $endpos, 180,
+       'postgres', 'test_slot', $endpos, $TestLib::timeout_default,
        'include-xids'     => '0',
        'skip-empty-xacts' => '1');
 chomp($stdout_recv);
@@ -107,7 +107,7 @@ $node_master->poll_query_until('postgres',
 ) or die "slot never became inactive";
 
 $stdout_recv = $node_master->pg_recvlogical_upto(
-       'postgres', 'test_slot', $endpos, 180,
+       'postgres', 'test_slot', $endpos, $TestLib::timeout_default,
        'include-xids'     => '0',
        'skip-empty-xacts' => '1');
 chomp($stdout_recv);
index 100766638befd26091f6f249e20d4387a63b074a..09982b9c756f5534d3a81c145ba682a0b87763ba 100644 (file)
@@ -155,7 +155,7 @@ like(
 ($ret, $stdout, $stderr) = $node_replica->psql(
        'postgres',
        "SELECT data FROM pg_logical_slot_peek_changes('before_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');",
-       timeout => 180);
+       timeout => $TestLib::timeout_default);
 is($ret, 0, 'replay from slot before_basebackup succeeds');
 
 my $final_expected_output_bb = q(BEGIN
@@ -184,7 +184,7 @@ my $endpos = $node_replica->safe_psql('postgres',
 
 $stdout = $node_replica->pg_recvlogical_upto(
        'postgres', 'before_basebackup',
-       $endpos,    180,
+       $endpos,    $TestLib::timeout_default,
        'include-xids'     => '0',
        'skip-empty-xacts' => '1');
 
index 3e3d50b5dd8eafb0f44ab08db03836ea7da43ed6..95445dc097e6424db9dec06d848f5284f6831d5c 100644 (file)
@@ -23,7 +23,7 @@ plan tests => 18;
 # instance being driven by us, add a timeout high enough that it
 # should never trigger even on very slow machines, unless something
 # is really wrong.
-my $psql_timeout = IPC::Run::timer(60);
+my $psql_timeout = IPC::Run::timer($TestLib::timeout_default);
 
 my $node = get_new_node('master');
 $node->init(allows_streaming => 1);
index 8073b60c08a7ec970b0ca6fc88c6d4f9157e063d..85501d17045b3528d8aa297358a9a6c9570f1c04 100644 (file)
@@ -133,7 +133,7 @@ my $slow_client = IPC::Run::start(
        \$stdout,
        '2>',
        \$stderr,
-       IPC::Run::timeout(900));    # five times the poll_query_until timeout
+       IPC::Run::timeout(5 * $TestLib::timeout_default));
 ok( $gnat->poll_query_until(
                'postgres',
                "SELECT 1 FROM pg_stat_activity WHERE query = '$slow_query'", '1'),
@@ -144,10 +144,11 @@ $gnat->kill9;
 unlink($gnat->data_dir . '/postmaster.pid');
 $gnat->rotate_logfile;    # on Windows, can't open old log for writing
 log_ipcs();
-# Reject ordinary startup.  Retry for the same reasons poll_start() does.
+# Reject ordinary startup.  Retry for the same reasons poll_start() does,
+# every 0.1s for at least $TestLib::timeout_default seconds.
 my $pre_existing_msg = qr/pre-existing shared memory block/;
 {
-       my $max_attempts = 180 * 10;    # Retry every 0.1s for at least 180s.
+       my $max_attempts = 10 * $TestLib::timeout_default;
        my $attempts     = 0;
        while ($attempts < $max_attempts)
        {
@@ -194,7 +195,7 @@ sub poll_start
 {
        my ($node) = @_;
 
-       my $max_attempts = 180 * 10;
+       my $max_attempts = 10 * $TestLib::timeout_default;
        my $attempts     = 0;
 
        while ($attempts < $max_attempts)
@@ -210,8 +211,8 @@ sub poll_start
                $attempts++;
        }
 
-       # No success within 180 seconds.  Try one last time without fail_ok, which
-       # will BAIL_OUT unless it succeeds.
+       # Try one last time without fail_ok, which will BAIL_OUT unless it
+       # succeeds.
        $node->start && return 1;
        return 0;
 }
index d33ca1e35ade96b97aabc2eb2c0b9e0e0bab1023..7a8954dad20348df46d0406195e69c885b492d4a 100644 (file)
@@ -293,7 +293,7 @@ my @result =
                 SELECT pg_switch_wal();
                 CHECKPOINT;
                 SELECT 'finished';",
-               timeout => '60'));
+               timeout => $TestLib::timeout_default));
 is($result[1], 'finished', 'check if checkpoint command is not blocked');
 
 #####################################