diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2012-09-05 23:13:14 -0400 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2012-09-05 23:13:14 -0400 |
commit | bdf8f58397dc83618dccd8f85a46a02933a7f86f (patch) | |
tree | 80f1fdcda9743edc5d94d0003de51ad5f085ea0e | |
parent | 4b8dacfcef7ad16939ec8695019747fb45a80847 (diff) | |
download | postgresql-bdf8f58397dc83618dccd8f85a46a02933a7f86f.tar.gz postgresql-bdf8f58397dc83618dccd8f85a46a02933a7f86f.zip |
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,
-rw-r--r-- | contrib/pg_upgrade/exec.c | 23 |
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"); |