Honor PGCTLTIMEOUT environment variable for pg_regress' startup wait.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 21 Apr 2016 03:48:13 +0000 (23:48 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 21 Apr 2016 03:48:13 +0000 (23:48 -0400)
In commit 2ffa86962077c588 we made pg_ctl recognize an environment variable
PGCTLTIMEOUT to set the default timeout for starting and stopping the
postmaster.  However, pg_regress uses pg_ctl only for the "stop" end of
that; it has bespoke code for starting the postmaster, and that code has
historically had a hard-wired 60-second timeout.  Further buildfarm
experience says it'd be a good idea if that timeout were also controlled
by PGCTLTIMEOUT, so let's make it so.  Like the previous patch, back-patch
to all active branches.

Discussion: <13969.1461191936@sss.pgh.pa.us>

src/test/regress/pg_regress.c

index dd65ab5a949a77487367fe4fac75979c7362c23f..311ebb5da2a94c239528d227bded80bf67b8d678 100644 (file)
@@ -2185,6 +2185,8 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
    if (temp_instance)
    {
        FILE       *pg_conf;
+       const char *env_wait;
+       int         wait_seconds;
 
        /*
         * Prepare the temp instance
@@ -2334,11 +2336,23 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
        }
 
        /*
-        * Wait till postmaster is able to accept connections (normally only a
-        * second or so, but Cygwin is reportedly *much* slower).  Don't wait
-        * forever, however.
+        * Wait till postmaster is able to accept connections; normally this
+        * is only a second or so, but Cygwin is reportedly *much* slower, and
+        * test builds using Valgrind or similar tools might be too.  Hence,
+        * allow the default timeout of 60 seconds to be overridden from the
+        * PGCTLTIMEOUT environment variable.
         */
-       for (i = 0; i < 60; i++)
+       env_wait = getenv("PGCTLTIMEOUT");
+       if (env_wait != NULL)
+       {
+           wait_seconds = atoi(env_wait);
+           if (wait_seconds <= 0)
+               wait_seconds = 60;
+       }
+       else
+           wait_seconds = 60;
+
+       for (i = 0; i < wait_seconds; i++)
        {
            /* Done if psql succeeds */
            if (system(buf2) == 0)
@@ -2359,9 +2373,10 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 
            pg_usleep(1000000L);
        }
-       if (i >= 60)
+       if (i >= wait_seconds)
        {
-           fprintf(stderr, _("\n%s: postmaster did not respond within 60 seconds\nExamine %s/log/postmaster.log for the reason\n"), progname, outputdir);
+           fprintf(stderr, _("\n%s: postmaster did not respond within %d seconds\nExamine %s/log/postmaster.log for the reason\n"),
+                   progname, wait_seconds, outputdir);
 
            /*
             * If we get here, the postmaster is probably wedged somewhere in