diff options
author | Michael Paquier <michael@paquier.xyz> | 2025-07-25 16:17:13 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2025-07-25 16:17:13 +0900 |
commit | 641f20d4c433b66df2928408fb2b44bd165c2329 (patch) | |
tree | 24acadbf47adc75f9db082a80de3e49f48488ee2 /src/backend | |
parent | ac000fca743eff923d1feb4bc722d905901ae540 (diff) | |
download | postgresql-641f20d4c433b66df2928408fb2b44bd165c2329.tar.gz postgresql-641f20d4c433b66df2928408fb2b44bd165c2329.zip |
Fix assertion failure with latch wait in single-user mode
LatchWaitSetPostmasterDeathPos, the latch event position for the
postmaster death event, is initialized under IsUnderPostmaster.
WaitLatch() considered it as a valid wait target in single-user mode
(!IsUnderPostmaster), which was incorrect.
One code path found to fail with an assertion failure is a database drop
in single-user mode while waiting in WaitForProcSignalBarrier() after
the drop.
Oversight in commit 84e5b2f07a5e.
Author: Patrick Stählin <me@packi.ch>
Co-authored-by: Ronan Dunklau <ronan.dunklau@aiven.io>
Discussion: https://postgr.es/m/18996-3a2744c8140488de@postgresql.org
Backpatch-through: 18
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/storage/ipc/latch.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index c6aefd2f688..beadeb5e46a 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -187,9 +187,11 @@ WaitLatch(Latch *latch, int wakeEvents, long timeout, if (!(wakeEvents & WL_LATCH_SET)) latch = NULL; ModifyWaitEvent(LatchWaitSet, LatchWaitSetLatchPos, WL_LATCH_SET, latch); - ModifyWaitEvent(LatchWaitSet, LatchWaitSetPostmasterDeathPos, - (wakeEvents & (WL_EXIT_ON_PM_DEATH | WL_POSTMASTER_DEATH)), - NULL); + + if (IsUnderPostmaster) + ModifyWaitEvent(LatchWaitSet, LatchWaitSetPostmasterDeathPos, + (wakeEvents & (WL_EXIT_ON_PM_DEATH | WL_POSTMASTER_DEATH)), + NULL); if (WaitEventSetWait(LatchWaitSet, (wakeEvents & WL_TIMEOUT) ? timeout : -1, |