Re: Unportable implementation of background worker start
Tom Lane <tgl@sss.pgh.pa.us>
I wrote: > =?utf-8?Q?R=C3=A9mi_Zara?= <remi_zara@mac.com> writes: >> coypu was not stuck (no buildfarm related process running), but failed to clean-up shared memory and semaphores. >> I’ve done the clean-up. > Huh, that's even more interesting. I installed NetBSD 5.1.5 on an old Mac G4; I believe this is a reasonable approximation to coypu's environment. With the pselect patch installed, I can replicate the behavior we saw in the buildfarm of connections immediately failing with "the database system is starting up". Investigation shows that pselect reports ready sockets correctly (which is what allows connections to get in at all), and it does stop waiting either for a signal or for a timeout. What it forgets to do is to actually service the signal. The observed behavior is caused by the fact that reaper() is never called so the postmaster never realizes that the startup process has finished. I experimented with putting PG_SETMASK(&UnBlockSig); PG_SETMASK(&BlockSig); immediately after the pselect() call, and found that indeed that lets signals get serviced, and things work pretty much normally. However, closer inspection finds that pselect only stops waiting when a signal arrives *while it's waiting*, not if there was a signal already pending. So this is actually even more broken than the so called "non atomic" behavior we had expected to see --- at least with that, the pending signal would have gotten serviced promptly, even if ServerLoop itself didn't iterate. This is all giving me less than warm fuzzy feelings about the state of pselect support out in the real world. So at this point we seem to have three plausible alternatives: 1. Let HEAD stand as it is. We have a problem with slow response to bgworker start requests that arrive while ServerLoop is active, but that's a pretty tight window usually (although I believe I've seen it hit at least once in testing). 2. Reinstall the pselect patch, blacklisting NetBSD and HPUX and whatever else we find to be flaky. Then only the blacklisted platforms have the problem. 3. Go ahead with converting the postmaster to use WaitEventSet, a la the draft patch I posted earlier. I'd be happy to do this if we were at the start of a devel cycle, but right now seems a bit late --- not to mention that we really need to fix 9.6 as well. We could substantially ameliorate the slow-response problem by allowing maybe_start_bgworker to launch multiple workers per call, which is something I think we should do regardless. (I have a patch written to allow it to launch up to N workers per call, but have held off committing that till after the dust settles in ServerLoop.) I'm leaning to doing #1 plus the maybe_start_bgworker change. There's certainly room for difference of opinion here, though. Thoughts? regards, tom lane
Commits
-
Cope with glibc too old to have epoll_create1().
- 53b157846024 9.6.3 landed
- 82ebbeb0abfe 10.0 landed
-
Make latch.c more paranoid about child-process cases.
- fa31b6f4e969 10.0 landed
- 866452cd8b52 9.6.3 landed
-
Allow multiple bgworkers to be launched per postmaster iteration.
- aa1351f1eec4 10.0 landed
- e880df25ec35 9.6.3 landed
-
Revert "Use pselect(2) not select(2), if available, to wait in postmaster's loop."
- e615605239f6 9.6.3 landed
- 64925603c972 10.0 landed
-
Use pselect(2) not select(2), if available, to wait in postmaster's loop.
- b9515b628797 9.6.3 landed
- 81069a9efc5a 10.0 landed
-
Run the postmaster's signal handlers without SA_RESTART.
- 8939020853e6 10.0 landed
- dfa4baf91cee 9.6.3 landed
-
Fix postmaster's handling of fork failure for a bgworker process.
- dba1f310a564 9.5.7 landed
- 63f64d2824b2 9.6.3 landed
- 4fe04244b584 10.0 landed
- 436b560b86ca 9.4.12 landed
-
Partially revert commit 536d47bd9d5fce8d91929bee3128fa1d08dbcc57.
- 5041cdf2b792 10.0 landed
-
Avoid depending on non-POSIX behavior of fcntl(2).
- 3e51725b3854 10.0 landed
- f07f6b62c9a7 9.6.3 landed
- ce521e50eb56 9.4.12 landed
- ad8fb69cccf4 9.2.21 landed
- 9f8be7542156 9.5.7 landed
- 899960b9fec2 9.3.17 landed
-
Remove long-obsolete catering for platforms without F_SETFD/FD_CLOEXEC.
- 536d47bd9d5f 10.0 landed