Re: BUG #16154: pg_ctl restart with a logfile fails sometimes (on Windows)
Alexander Law <exclusion@gmail.com>
From: Alexander Law <exclusion@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Amit Kapila <amit.kapila16@gmail.com>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2019-12-07T21:00:00Z
Lists: pgsql-bugs
07.12.2019 22:26 Tom Lane <tgl@sss.pgh.pa.us>: > Alexander Law <exclusion@gmail.com> writes: > > > > The possible solution is to rid of CMD and to call CreateProcess with > > postgres.exe as an executable, but then we have to handle it's stdout, > > stderr pipes like this: > > > https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output > > I'm afraid this would complicate things (and break an alignment with the > > Unix solution), but if the uglyness of the proposed fix overweights > > complexity concerns, I can try to develop an alternative patch. > > If it takes that much code to handle redirection on Windows, then > I agree we don't really want to do it :-(. > > Your solution is a little bit messy but it seems expedient. I feel > that it doesn't really fix the problem, if we define the problem as > "somebody opened the postmaster logfile with non-sharing-friendly > parameters". I see two problems here: 1) "pg_ctl restart ... -l logfile" can fail due to timing issues 2) when it (or "pg_ctl start ... -l logfile") fails, it prints the non-informative message: The process cannot access the file because it is being used by another process. It doesn't tell the user what file is inaccessible. I think that this issue remains unresolved for so long partly due to this unclearance. The proposed patch fixes both, unless I miss something. This patch works around that for the specific case of > a series of pg_ctl start commands with identical -l arguments, but > the file's still not really sharable. Yes, even if someone would manage to lock the logfile by a separate program or by starting another postgres cluster with the same logfile, he will get a more meaningful message (after a timeout). > Still, maybe that's good > enough. For our own purposes in buildfarm testing, the main residual > problem is that we can't safely inspect the postmaster logfile > immediately after pg_ctl stop; but there's a separate proposal to > fix that by hacking slurp_file. > As to slurp_file, maybe it's read-only nature should help to avoid the issues with the logfile opening. I can test it next week. > > It seems like it'd be cleaner to fix both of these things at once > by opening the logfile ourselves (rather than letting CMD.EXE do it) > and using sharing-friendly parameters at that point. But maybe it's > just not worth the trouble compared to the individual hacks. If we couldn't find more advantages of rewriting create process (with logfile), I would restrict changes to one hack (or two, if really needed). Best regards, Alexander
Commits
-
In pg_ctl, work around ERROR_SHARING_VIOLATION on the postmaster log file.
- be9d4b928060 12.2 landed
- 0da33c762b85 13.0 landed