]> granicus.if.org Git - postgresql/commitdiff
In pg_upgrade, try a few times to open a log file.
authorAndrew Dunstan <andrew@dunslane.net>
Thu, 6 Sep 2012 03:14:49 +0000 (23:14 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Thu, 6 Sep 2012 03:14:49 +0000 (23:14 -0400)
If we call pg_ctl stop, the server might continue and thus
hold a log file for a short time after it has deleted its pid file,
(which is when pg_ctl will exit), and so a subsequent attempt to
open the log file might fail.

We therefore try to open it a few times, sleeping one second between
tries, to give the server time to exit.

This corrects an error that was observed on the buildfarm.

Backpatched to 9.2,

contrib/pg_upgrade/exec.c

index 99f500645ef69d55b72dd6457244319ef4ec45e3..644ea0eb27755cd2ad8b896e0f6e2c07a3065e33 100644 (file)
@@ -63,7 +63,28 @@ exec_prog(const char *log_file, const char *opt_log_file,
        if (written >= MAXCMDLEN)
                pg_log(PG_FATAL, "command too long\n");
 
-       if ((log = fopen_priv(log_file, "a")) == NULL)
+       log = fopen_priv(log_file, "a");
+
+#ifdef WIN32
+       {
+               /* 
+                * "pg_ctl -w stop" might have reported that the server has
+                * stopped because the postmaster.pid file has been removed,
+                * but "pg_ctl -w start" might still be in the process of
+                * closing and might still be holding its stdout and -l log
+                * file descriptors open.  Therefore, try to open the log 
+                * file a few more times.
+                */
+               int iter;
+               for (iter = 0; iter < 4 && log == NULL; iter++)
+               {
+                       sleep(1);
+                       log = fopen_priv(log_file, "a");
+               }
+       }
+#endif
+
+       if (log == NULL)
                pg_log(PG_FATAL, "cannot write to log file %s\n", log_file);
 #ifdef WIN32
        fprintf(log, "\n\n");