Re: BUG #15804: Assertion failure when using logging_collector with EXEC_BACKEND
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Michael Paquier <michael@paquier.xyz>
Cc: Yuli Khodorkovskiy <yuli.khodorkovskiy@crunchydata.com>,
pgsql-bugs@lists.postgresql.org,
Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Date: 2019-05-18T17:07:15Z
Lists: pgsql-bugs
[ some notes for whoever tries to fix this in the future ] Michael Paquier <michael@paquier.xyz> writes: > Trying to avoid calling pgwin32_ReserveSharedMemoryRegion() for > processes which are never going to connect to shared memory is > actually an interesting option, because this way there is no need to > relax the assertions it includes, Yeah, I'd come to the same conclusion while thinking about this, but I don't think you're going about it in quite the right way. In the first place, it's a mistake to try to drive the what-to-do-about- shared-memory decision strictly off the type of the subprocess. In the case of the syslogger, in particular, we have not only the initial launch to think about but also a possible relaunch if the first syslogger child crashes. In that scenario there *would* be shared memory to detach from. So the sketch that's emerging in my mind is 1. The postmaster should have its own state variable, say "static bool shared_memory_exists", which it sets at the appropriate time. (We could rely on testing UsedShmemSegAddr for that, but I don't think that'd be good design; UsedShmemSegAddr is really private state of the particular shmem implementation.) Since internal_forkexec is inside postmaster.c and runs in the postmaster process, it could just test that state variable directly to see if it needs to call pgwin32_ReserveSharedMemoryRegion. 2. I think we'd be well advised to get rid of the process-type-specific tests in SubPostmasterMain, too. The idea in my mind is to have the postmaster pass down an additional switch explicitly saying what to do about shared memory, so that what SubPostmasterMain does is roughly if (strcmp(argv[2], "--reattach") == 0) PGSharedMemoryReAttach(); else if (strcmp(argv[2], "--noreattach") == 0) PGSharedMemoryNoReAttach(); else /* do nothing, shared memory does not exist yet */ ; Then the problem for the syslogger is solved by passing --noreattach or not depending on whether shared_memory_exists is true yet. I've not worked that out in any detail; getting the switches included properly might be too much of a pain for this to be an improvement. But for sure I don't want there to be multiple copies of that list of which subprocess types use shared memory. A variant idea is to include shared_memory_exists in what's passed down by the BackendParameters mechanism, and then subprocesses can adjust their behavior for themselves. In any case, the thrust of all of this is that we shouldn't touch any of the assertions in the shmem support files; rather, the way to fix it is to improve the logic in postmaster.c so that we don't call those functions at all in child processes that are launched before shmem exists. regards, tom lane
Commits
-
Rearrange postmaster's startup sequence for better syslogger results.
- 9a86f03b4e8c 13.0 landed
-
Improve logrotate test so that it meaningfully exercises syslogger.
- 9d5c22d28f8c 12.0 landed
-
Revert "postmaster: Start syslogger earlier".
- 833451552925 12.0 landed
-
postmaster: Start syslogger earlier
- 57431a911d3a 12.0 cited