Weaker shmem interlock w/o postmaster.pid
Noah Misch <noah@leadboat.com>
If a starting postmaster's CreateLockFile() finds an existing postmaster.pid, it subjects the shared memory segment named therein to the careful scrutiny of PGSharedMemoryIsInUse(). If that segment matches the current data directory and has any attached processes, we bail with the "pre-existing shared memory block ... is still in use" error. When the postmaster.pid file is missing, there's inherently less we can do to reliably detect this situation; in particular, an old postmaster could have chosen an unusual key due to the usual 1+(port*1000) key being in use. That being said, PGSharedMemoryCreate() typically will stumble upon the old segment, and it (its sysv variant, anyway) applies checks much weaker than those of PGSharedMemoryIsInUse(). If the segment has a PGShmemHeader and the postmaster PID named in that header is not alive, PGSharedMemoryCreate() will delete the segment and proceed. Shouldn't it instead check the same things as PGSharedMemoryIsInUse()? The concrete situation in which I encountered this involved PostgreSQL 9.2 and an immediate shutdown with a backend that had blocked SIGQUIT. The backend survived the immediate shutdown as one would expect. The postmaster nonetheless removed postmaster.pid before exiting, and I could immediately restart PostgreSQL despite the survival of the SIGQUIT-blocked backend. If I instead SIGKILL the postmaster, postmaster.pid remains, and I must kill stray backends before restarting. The postmaster should not remove postmaster.pid unless it has verified that its children have exited. Concretely, that means not removing postmaster.pid on immediate shutdown in 9.3 and earlier. That's consistent with the rough nature of an immediate shutdown, anyway. I'm thinking to preserve postmaster.pid at immediate shutdown in all released versions, but I'm less sure about back-patching a change to make PGSharedMemoryCreate() pickier. On the one hand, allowing startup to proceed with backends still active in the same data directory is a corruption hazard. On the other hand, it could break weird shutdown/restart patterns that permit trivial lifespan overlap between backends of different postmasters. Opinions? Thanks, nm -- Noah Misch EnterpriseDB http://www.enterprisedb.com
Commits
-
Probe only 127.0.0.1 when looking for ports on Unix.
- 1ed42e50e963 9.6.14 landed
- 8c7a8e19bb17 10.9 landed
- 1f3bcb497200 11.4 landed
- 8efe710d9c84 12.0 landed
-
Don't write to stdin of a test process that could have already exited.
- e12a4726127b 12.0 cited
-
Test both 0.0.0.0 and 127.0.0.x addresses to find a usable port.
- 9f65081cf74b 9.6.13 landed
- 4543ef36f0ef 10.8 landed
- 0bdf6d635e42 11.3 landed
- 4ab02e815627 12.0 landed
-
MSYS: Translate REGRESS_SHLIB to a Windows file name.
- 31e2caaceea9 11.3 landed
- 9daefff12260 12.0 landed
-
MSYS: Skip src/test/recovery/t/017_shm.pl.
- 6b7906e1d9e7 9.6.13 landed
- 2bc0474792e3 10.8 landed
-
When Perl "kill(9, ...)" fails, try "pg_ctl kill".
- de262941fc9c 11.3 landed
- 61c0962d90d5 10.8 landed
- 55926b0a0917 9.6.13 landed
- 947a35014fdc 12.0 landed
-
Consistently test for in-use shared memory.
- 3ef5e16c6181 9.4.22 landed
- c565de643167 9.5.17 landed
- 808e1e75fb37 9.6.13 landed
- 7ef2b313e649 11.3 landed
- 6d81e3c6526b 10.8 landed
- c098509927f9 12.0 landed
- e7f89a5dec0f 9.5.17 landed
- b2307f8e3184 11.3 landed
- 891e9e0aee53 9.6.13 landed
- 7c414cdc39a3 10.8 landed
- 3a70b66e6257 9.4.22 landed
- 2f932f71d9f2 12.0 landed
-
Revert "Consistently test for in-use shared memory."
- ae98c24fda4b 9.6.13 landed
- 9ec582b64d69 9.5.17 landed
- 7d18a55c90eb 10.8 landed
- 392ea22e9b32 11.3 landed
- 0777696fe346 9.4.22 landed
- 82150a05be0d 12.0 landed
-
Silence -Wimplicit-fallthrough in sysv_shmem.c.
- 0aa0ccfdd653 9.6.13 cited
-
Make src/test/recovery/t/017_shm.pl safe for concurrent execution.
- 0e0d449fb02a 9.6.13 landed
- 3186d5fac55b 10.8 landed
- 1106438c37db 11.3 landed
- 16ee6eaf80a4 12.0 landed
-
Update HINT for pre-existing shared memory block.
- f3461cb8f5b5 9.4.22 landed
- 52e7e4d1dfe6 9.5.17 landed
- e49dc9ab14b2 9.6.13 landed
- ab7590e9197c 11.3 landed
- 327399412d03 10.8 landed
- 5a907404b527 12.0 landed
-
Add WL_EXIT_ON_PM_DEATH pseudo-event.
- cfdf4dc4fc96 12.0 cited
-
The default values for shared_buffers and max_connections are now 1000
- de98a7e23a19 7.4.1 cited
-
XLOG (and related) changes:
- 4d14fe0048cf 7.1.1 cited
-
Significant cleanups in SysV IPC handling (shared mem and semaphores).
- c715fdea2678 7.1.1 cited