Skip to content

Commit 0da33c7

Browse files
committed
In pg_ctl, work around ERROR_SHARING_VIOLATION on the postmaster log file.
On Windows, we use CMD.EXE to redirect the postmaster's stdout/stderr into a log file. CMD.EXE will open that file with non-sharing-friendly parameters, and the file will remain open for a short time after the postmaster has removed postmaster.pid. This can result in an ERROR_SHARING_VIOLATION failure if we attempt to start a new postmaster immediately with the same log file (e.g. during "pg_ctl restart"). This seems to explain intermittent buildfarm failures we've been seeing on Windows machines. To fix, just open and close the log file using our own pgwin32_open(), which will wait if necessary to avoid the failure. (Perhaps someday we should stop using CMD.EXE, but that would be a far more complex patch, and it doesn't seem worth the trouble ... yet.) Back-patch to v12. This only solves the problem when frontend fopen() is redirected to pgwin32_fopen(), which has only been true since commit 0ba06e0. Hence, no point in back-patching further, unless we care to back-patch that change too. Diagnosis and patch by Alexander Lakhin (bug #16154). Discussion: https://postgr.es/m/16154-1ccf0b537b24d5e0@postgresql.org
1 parent 5a20b02 commit 0da33c7

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/bin/pg_ctl/pg_ctl.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,29 @@ start_postmaster(void)
519519
comspec = "CMD";
520520

521521
if (log_file != NULL)
522+
{
523+
/*
524+
* First, touch the log file. The main value of this is that if the
525+
* file is still locked by a previous postmaster run, we'll wait until
526+
* it comes free, instead of failing with ERROR_SHARING_VIOLATION.
527+
* (It'd be better to open the file in a sharing-friendly mode, but we
528+
* can't use CMD.EXE to do that, so work around it. Note that the
529+
* previous postmaster will still have the file open for a short time
530+
* after removing postmaster.pid.)
531+
*/
532+
FILE *fd = fopen(log_file, "a");
533+
534+
if (fd == NULL)
535+
{
536+
write_stderr(_("%s: could not create log file \"%s\": %s\n"),
537+
progname, log_file, strerror(errno));
538+
exit(1);
539+
}
540+
fclose(fd);
541+
522542
snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"",
523543
comspec, exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
544+
}
524545
else
525546
snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" 2>&1\"",
526547
comspec, exec_path, pgdata_opt, post_opts, DEVNULL);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy