From ec1a4657b2fe500dce037ebae927060ff6cabc83 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Sun, 18 Oct 2026 00:31:53 -0400 Subject: [PATCH v1] Clear isAdvancing when a notify read is aborted asyncQueueReadAllNotifications() sets our isAdvancing flag and clears it when done. If the read errors out in between, for example on a cancel while waiting for a safe snapshot, the flag stays set and SignalBackends() never advances or wakes us again, so the queue tail stops moving. Clear it in AtAbort_Notify(). --- src/backend/commands/async.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index e266fe64cc8..a053451a861 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -2419,6 +2419,18 @@ SignalBackends(void) void AtAbort_Notify(void) { + /* + * If a notify read failed, clear our isAdvancing flag, else + * SignalBackends() would never advance or wake us again. Only we set it, + * so it is safe to check without the lock. + */ + if (amRegisteredListener && QUEUE_BACKEND_IS_ADVANCING(MyProcNumber)) + { + LWLockAcquire(NotifyQueueLock, LW_SHARED); + QUEUE_BACKEND_IS_ADVANCING(MyProcNumber) = false; + LWLockRelease(NotifyQueueLock); + } + /* Revert staged listen/unlisten changes */ ApplyPendingListenActions(false); -- 2.37.1 (Apple Git-137.1)