aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2020-10-15 11:31:20 +1300
committerThomas Munro <tmunro@postgresql.org>2020-10-15 11:41:58 +1300
commitb94109ce375b137f235149bfba3559c69f4573e7 (patch)
tree3bb52406abf05df6e4efe561082ba2a8a993294b /src
parenta04daa97a4339c38e304cd6164d37da540d665a8 (diff)
downloadpostgresql-b94109ce375b137f235149bfba3559c69f4573e7.tar.gz
postgresql-b94109ce375b137f235149bfba3559c69f4573e7.zip
Make WL_POSTMASTER_DEATH level-triggered on kqueue builds.
If WaitEventSetWait() reports that the postmaster has gone away, later calls to WaitEventSetWait() should continue to report that. Otherwise further waits that occur in the proc_exit() path after we already noticed the postmaster's demise could block forever. Back-patch to 13, where the kqueue support landed. Reported-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/3624029.1602701929%40sss.pgh.pa.us
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/ipc/latch.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 63c6c975360..eacb8c3c9ee 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -1492,7 +1492,10 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
timeout_p = &timeout;
}
- /* Report events discovered by WaitEventAdjustKqueue(). */
+ /*
+ * Report postmaster events discovered by WaitEventAdjustKqueue() or an
+ * earlier call to WaitEventSetWait().
+ */
if (unlikely(set->report_postmaster_not_running))
{
if (set->exit_on_postmaster_death)
@@ -1563,6 +1566,13 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
cur_kqueue_event->filter == EVFILT_PROC &&
(cur_kqueue_event->fflags & NOTE_EXIT) != 0)
{
+ /*
+ * The kernel will tell this kqueue object only once about the exit
+ * of the postmaster, so let's remember that for next time so that
+ * we provide level-triggered semantics.
+ */
+ set->report_postmaster_not_running = true;
+
if (set->exit_on_postmaster_death)
proc_exit(1);
occurred_events->fd = PGINVALID_SOCKET;