]> granicus.if.org Git - postgresql/commitdiff
Fix bogus loop logic in 013_crash_restart test's pump_until subroutine.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 12 Aug 2018 22:05:49 +0000 (18:05 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 12 Aug 2018 22:05:49 +0000 (18:05 -0400)
The pump_nb() step might've already received the desired data, so we must
check for that at the top of the loop not the bottom.  Otherwise, the
call to pump() will sit with nothing to do until the timeout elapses.
pump_until then falls out with apparent success ... but the timeout has
been used up, causing the next call of pump_until to report a timeout
failure.  I believe this explains the intermittent timeout failures
we've seen in the buildfarm ever since this test went in.  I was able
to reproduce the problem on gaur semi-repeatably, and this appears to
fix it.

In passing, remove a duplicate assignment, fix one stdin-assignment to
look like the rest, and document the test's dependency on test_decoding.

src/test/recovery/README
src/test/recovery/t/013_crash_restart.pl

index a1e1aa1be1c11c75fe91178f4745472df715821f..632e720ebefac0e67795b1082e1fc8806fa487f2 100644 (file)
@@ -9,6 +9,8 @@ Running the tests
 =================
 
 NOTE: You must have given the --enable-tap-tests argument to configure.
+Also, to use "make installcheck", you must have built and installed
+contrib/test_decoding in addition to the core code.
 
 Run
     make check
index 440ac097fcf0b8da736d616cb3b056be6e10ce54..c928e9201ed1e5f1f435abc13895dfaad14cd194 100644 (file)
@@ -157,7 +157,6 @@ ok(pump_until($killme, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m),
        "acquired pid for SIGKILL");
 $pid = $killme_stdout;
 chomp($pid);
-$pid           = $killme_stdout;
 $killme_stdout = '';
 $killme_stderr = '';
 
@@ -176,7 +175,7 @@ $killme_stderr = '';
 # signal that crash-restart has occurred.  The initial wait for the
 # trivial select is to be sure that psql successfully connected to
 # backend.
-$monitor_stdin = q[
+$monitor_stdin .= q[
 SELECT $$psql-connected$$;
 SELECT pg_sleep(3600);
 ];
@@ -252,6 +251,7 @@ sub pump_until
        $proc->pump_nb();
        while (1)
        {
+               last if $$stream =~ /$untl/;
                if ($psql_timeout->is_expired)
                {
                        diag("aborting wait: program timed out");
@@ -269,7 +269,6 @@ sub pump_until
                        return 0;
                }
                $proc->pump();
-               last if $$stream =~ /$untl/;
        }
        return 1;