TAP tests: check for postmaster.pid anyway when "pg_ctl start" fails.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 19 Jan 2022 21:29:09 +0000 (16:29 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 19 Jan 2022 21:29:09 +0000 (16:29 -0500)
"pg_ctl start" might start a new postmaster and then return failure
anyway, for example if PGCTLTIMEOUT is exceeded.  If there is a
postmaster there, it's still incumbent on us to shut it down at
script end, so check for the PID file even though we are about
to fail.

This has been broken all along, so back-patch to all supported branches.

Discussion: https://postgr.es/m/647439.1642622744@sss.pgh.pa.us

src/test/perl/PostgreSQL/Test/Cluster.pm

index 7af0f8db139cbf160c23086e71d73705baf5a1bb..b7d4c2455392e2c53759f0e96a72b1e9d77ebb11 100644 (file)
@@ -845,6 +845,11 @@ sub start
    {
        print "# pg_ctl start failed; logfile:\n";
        print PostgreSQL::Test::Utils::slurp_file($self->logfile);
+
+       # pg_ctl could have timed out, so check to see if there's a pid file;
+       # otherwise our END block will fail to shut down the new postmaster.
+       $self->_update_pid(-1);
+
        BAIL_OUT("pg_ctl start failed") unless $params{fail_ok};
        return 0;
    }
@@ -1123,7 +1128,10 @@ archive_command = '$copy_command'
    return;
 }
 
-# Internal method
+# Internal method to update $self->{_pid}
+# $is_running = 1: pid file should be there
+# $is_running = 0: pid file should NOT be there
+# $is_running = -1: we aren't sure
 sub _update_pid
 {
    my ($self, $is_running) = @_;
@@ -1138,7 +1146,7 @@ sub _update_pid
        close $pidfile;
 
        # If we found a pidfile when there shouldn't be one, complain.
-       BAIL_OUT("postmaster.pid unexpectedly present") unless $is_running;
+       BAIL_OUT("postmaster.pid unexpectedly present") if $is_running == 0;
        return;
    }
 
@@ -1146,7 +1154,7 @@ sub _update_pid
    print "# No postmaster PID for node \"$name\"\n";
 
    # Complain if we expected to find a pidfile.
-   BAIL_OUT("postmaster.pid unexpectedly not present") if $is_running;
+   BAIL_OUT("postmaster.pid unexpectedly not present") if $is_running == 1;
    return;
 }