From: Alexander Lakhin <exclusion@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #16154: pg_ctl restart with a logfile fails sometimes (on Windows)
Date: Fri, 6 Dec 2019 18:40:12 +0300
Message-ID: <e8866e38-175b-b22a-1831-45cfda6494b7@gmail.com> (raw)
In-Reply-To: <6120.1575645256@sss.pgh.pa.us>
References: <16154-1ccf0b537b24d5e0@postgresql.org>
<e5179494-715e-f8a3-266b-0cf52adac8f4@gmail.com>
<6120.1575645256@sss.pgh.pa.us>
06.12.2019 18:14, Tom Lane wrote:
> Alexander Lakhin <exclusion@gmail.com> writes:
>> If this file is still opened by the previous server shell (it can happen
>> when the previous server instance has unlinked it's pid file, but it's
>> CMD shell is still running), the next CMD start fails with the
>> aforementioned error message.
> Interesting. I wonder whether this explains all of the remaining
> buildfarm failures of this sort that we've been seeing even after
> 0ba06e0bf.
>
>> To fix this issue I propose the attached patch
>> (fix_logfile_sharing_violation ).
> This seems like a pretty ugly hack ... please at least make it
> #ifdef WIN32, so that the rest of us don't have to deal with it.
> Also, if I read it correctly, it causes a pre-existing logfile
> to get truncated, which has never happened before. Mode "a"
> would be a better choice.
This change should go under the following code:
#else /* WIN32 */
/*
* As with the Unix case, it's easiest to use the shell (CMD.EXE) to
* handle redirection etc. Unfortunately CMD.EXE lacks any
equivalent of
* "exec", so we don't get to find out the postmaster's PID immediately.
*/
PROCESS_INFORMATION pi;
const char *comspec;
/* Find CMD.EXE location using COMSPEC, if it's set */
comspec = getenv("COMSPEC");
if (comspec == NULL)
comspec = "CMD";
So it should affect only Windows.
I've fixed the mode. Thanks for your review!
Best regards,
Alexander
Attachments:
[text/x-patch] fix_logfile_sharing_violation.patch (921B, ../e8866e38-175b-b22a-1831-45cfda6494b7@gmail.com/2-fix_logfile_sharing_violation.patch)
download | inline diff:diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.cindex 65f9fb4c0a..9bc44b2de4 100644--- a/src/bin/pg_ctl/pg_ctl.c+++ b/src/bin/pg_ctl/pg_ctl.c@@ -519,8 +519,21 @@ start_postmaster(void)
comspec = "CMD";
if (log_file != NULL)
+ {+ /* Check the log file availability to prevent CMD.EXE failing with+ * ERROR_SHARING_VIOLATION, e.g. when the log file is still opened+ * by the previous server shell.+ */+ FILE *fd = fopen(log_file, "a");+ if (!fd) {+ write_stderr(_("%s: could not access log file \"%s\": %s\n"),+ progname, log_file, strerror(errno));+ exit(1);+ }+ fclose(fd);
snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"",
comspec, exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
+ }
else
snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" 2>&1\"",
comspec, exec_path, pgdata_opt, post_opts, DEVNULL);
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: exclusion@gmail.com, tgl@sss.pgh.pa.us, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #16154: pg_ctl restart with a logfile fails sometimes (on Windows)
In-Reply-To: <e8866e38-175b-b22a-1831-45cfda6494b7@gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox