Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue
Matheus Alcantara <matheusssilv97@gmail.com>
From: "Matheus Alcantara" <matheusssilv97@gmail.com>
To: "Arseniy Mukhin" <arseniy.mukhin.dev@gmail.com>, "Yura Sokolov"
<y.sokolov@postgrespro.ru>
Cc: "Masahiko Sawada" <sawada.mshk@gmail.com>, "Daniil Davydov" <3danissimo@gmail.com>, Álvaro Herrera <alvherre@kurilemu.de>, "Alexandra Wang" <alexandra.wang.oss@gmail.com>, "PostgreSQL Hackers" <pgsql-hackers@postgresql.org>
Date: 2025-09-03T21:14:40Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Clear 'xid' in dummy async notify entries written to fill up pages
- 84f1bf4afa5e 14.21 landed
- 21a9014cf00a 15.16 landed
- 0e8eaa2181d4 16.12 landed
- d80d5f099502 17.8 landed
- 82fa6b78dba1 18.2 landed
- 0bdc777e8007 19 (unreleased) landed
-
Fix remaining race condition with CLOG truncation and LISTEN/NOTIFY
- c2e58c0711fe 14.21 landed
- 0c862646cf2a 15.16 landed
- 44e8c60be66c 16.12 landed
- c2682810ab7d 17.8 landed
- 7b069a1876e4 18.2 landed
- 797e9ea6e54b 19 (unreleased) landed
-
Fix bug where we truncated CLOG that was still needed by LISTEN/NOTIFY
- eba917d360e7 14.21 landed
- 1a469d7b5b7d 15.16 landed
- 053e1868b7ee 16.12 landed
- d02c03ddc5e3 17.8 landed
- 321ec54625fd 18.2 landed
- 8eeb4a0f7c06 19 (unreleased) landed
-
Escalate ERRORs during async notify processing to FATAL
- 7cb05dd2d198 14.21 landed
- b1da37de21d4 15.16 landed
- c1a5bde003b8 16.12 landed
- b821c92920f0 17.8 landed
- aab4a84bb070 18.2 landed
- 1b4699090eaf 19 (unreleased) landed
-
Limit the size of TID lists during parallel GIN build
- c98dffcb7c70 19 (unreleased) cited
On Wed Sep 3, 2025 at 4:28 PM -03, Arseniy Mukhin wrote: >> Since we still need to scan those pages, couldn't we mark finished >> transactions as committed/aborted? >> This way we may to not hold datfrozenxid for a long time and will allow >> both safe clog truncation and safe async queue notification. >> More over, most notifications could be marked as completed in >> AtCommit_Notify already. So there is a need to recheck a few notifications >> that were written but not marked in AtCommit_Notify. >> >> Since AsyncQueueEntry field is used only to check visibility, looks like it >> is safe to set it to FrozenTransactionId. > > I like the idea to make queue records more self-sufficient, so we > don't need to check a transaction's status to determine if a > notification should be sent. What if we somehow mark every record of > an aborted transaction, so listeners can skip it without checking > transaction status? Also if the record is not marked as "aborted" we > also can send it without checking transaction status. IIUC > AtAbort_Notify is called before any listener can read records of the > aborted transaction (is it correct?), so we can do such "marking" in > AtAbort_Notify. And the listen/notify subsystem already has a similar > "marking" mechanism. At the end of every queue page we have a "dummy" > record which is skipped by every listener. Listeners skip it because > record's 'dboid' equals InvalidOid (listeners ignore any record where > the 'dboid' is different from their own). In the same way aborted > transactions can set 'dboid' to InvalidOid for their records in > AtAbort_Notify. > > Some benefits of this approach: > 1) Only aborted transactions would need to perform extra work. > 2) Listeners don't need to check notify transaction status, but ofc > they still need to wait if the notify transaction is 'in progress'. > 3) Vacuum don't need to be listen/notify aware. > 4) We don't need to do an extra scan of the whole queue. > > What do you think? > IIUC we don't store notifications of aborted transactions on the queue. On PreCommit_Notify we add the notifications on the queue and on Commit_Notify() we signal the backends. Or I'm missing something here? -- Matheus Alcantara