summaryrefslogtreecommitdiff
path: root/contrib/pg_upgrade/exec.c
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-09-05 23:13:14 -0400
committerAndrew Dunstan <andrew@dunslane.net>2012-09-05 23:13:14 -0400
commitbdf8f58397dc83618dccd8f85a46a02933a7f86f (patch)
tree80f1fdcda9743edc5d94d0003de51ad5f085ea0e /contrib/pg_upgrade/exec.c
parent4b8dacfcef7ad16939ec8695019747fb45a80847 (diff)
In pg_upgrade, try a few times to open a log file.
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,
Diffstat (limited to 'contrib/pg_upgrade/exec.c')
-rw-r--r--contrib/pg_upgrade/exec.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c
index 99f500645ef..644ea0eb277 100644
--- a/contrib/pg_upgrade/exec.c
+++ b/contrib/pg_upgrade/exec.c
@@ -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");