Re: Implement waiting for wal lsn replay: reloaded
Xuneng Zhou <xunengzhou@gmail.com>
On Thu, Apr 9, 2026 at 11:21 PM Alexander Korotkov <aekorotkov@gmail.com> wrote: > > On Wed, Apr 8, 2026 at 7:59 AM Xuneng Zhou <xunengzhou@gmail.com> wrote: > > > > Patch 0001 looks OK for me. > > > > Regarding patch 0002. Changes made for GetCurrentLSNForWaitType() > > > > looks reliable for me. PerformWalRecovery() sets replayed positions > > > > before starting recovery, and in turn before standby can accept > > > > connections. So, changes to WalReceiverMain() don't look necessary to > > > > me. > > > > > > Yeah, GetCurrentLSNForWaitType seems to be the right place to place > > > the fix. Please see the attached patch 2. > > > > > > I also noticed another relevent problem: > > > > > > During pure archive recovery (no walreceiver), a backend that issues > > > 'WAIT FOR LSN ... MODE 'standby_write' with a target ahead of the > > > current replay position will sleep forever; the startup process > > > replays past the target but only wakes 'STANDBY_REPLAY' waiters. > > > > > > This also affects mixed scenarios: the walreceiver may lag behind > > > replay (e.g., archive restore has delivered WAL faster than > > > streaming), so a 'standby_write' waiter could be waiting on WAL that > > > replay has already consumed. > > > > > > I will write a patch to address this soon. > > > > > > > Here is the patch. > > I've assembled all the pending patches together. > 0001 adds memory barrier to GetWalRcvWriteRecPtr() as suggested by > Andres off-list. > 0002 is basically [1] by Xuneng, but revised given we have a memory > barrier in 0001, and my proposal to do ResetLatch() unconditionally > similar to our other Latch-based loops. > 0003 and 0004 are [2] by Xuneng. > 0005 is [3] by Xuneng. > > I'm going to add them to Commitfest to run CI over them, and have a > closer look over them tomorrow. > > > Links. > 1. https://www.postgresql.org/message-id/CABPTF7Wjk_FbOghyr09Rzu6T2bh-L_KBMqHK%2BzhRXpssU0STyQ%40mail.gmail.com > 2. https://www.postgresql.org/message-id/CABPTF7X0iV%3DkGC4gjsTj4NvK_NNEJGM3YTc7Obxs5GOiYoMhEw%40mail.gmail.com > 3. https://www.postgresql.org/message-id/CABPTF7UBdEfyxATWntmCfoJrwB6iPrnhkXO7y_Avmqc2bOn27A%40mail.gmail.com I've added the patches to Commitfest. [1] https://commitfest.postgresql.org/patch/6678/ -- Best, Xuneng
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Clean up 019_replslot_limit.pl comments
- 0b866bb90368 19 (unreleased) landed
-
Stabilize 019_replslot_limit.pl: wait on slot restart_lsn
- cdb1d1cf1de6 19 (unreleased) landed
-
Fix memory ordering in WAIT FOR LSN wakeup mechanism
- a80a593ab636 19 (unreleased) landed
-
Improve WAIT FOR LSN test coverage
- cb096e6d6981 19 (unreleased) landed
-
Remove redundant WAIT FOR LSN caller-side pre-checks
- df9f938ca2ec 19 (unreleased) landed
-
Use barrier semantics when reading/writing writtenUpto
- dfb690dd5237 19 (unreleased) landed
-
Use replay position as floor for WAIT FOR LSN standby_(write|flush)
- cba67b5b87f9 19 (unreleased) landed
-
Wake standby_write/standby_flush waiters from the WAL replay loop
- e7cd592174d9 19 (unreleased) landed
-
Minimal fix for WAIT FOR ... MODE 'standby_flush'
- 29e7dbf5e4da 19 (unreleased) landed
-
Avoid syscache lookup while building a WAIT FOR tuple descriptor
- 834038c1f8d5 19 (unreleased) landed
-
Document that WAIT FOR may be interrupted by recovery conflicts
- 10484c2cc75b 19 (unreleased) landed
-
Use WAIT FOR LSN in PostgreSQL::Test::Cluster::wait_for_catchup()
- 7e8aeb9e483d 19 (unreleased) landed
- f30848cb05d4 19 (unreleased) landed
-
Wake LSN waiters before recovery target stop
- 20a8f783e15c 19 (unreleased) landed
-
Remove redundant pg_unreachable() after elog(ERROR) from ExecWaitStmt()
- 30776ca46865 19 (unreleased) landed
-
Revert "Use WAIT FOR LSN in PostgreSQL::Test::Cluster::wait_for_catchup()"
- e54ce0b2da62 19 (unreleased) landed
-
Fix variable usage in wakeupWaiters()
- bf308639bfcf 19 (unreleased) landed
-
Add tab completion for the WAIT FOR LSN MODE option
- 76948337f724 19 (unreleased) landed
-
Add the MODE option to the WAIT FOR LSN command
- 49a181b5d634 19 (unreleased) landed
-
Extend xlogwait infrastructure with write and flush wait types
- 7a39f43d885b 19 (unreleased) landed
-
Unify error messages
- 502e256f2262 19 (unreleased) cited
-
Optimize shared memory usage for WaitLSNProcInfo
- 75e82b2f5a6f 19 (unreleased) landed
-
Fix WaitLSNWakeup() fast-path check for InvalidXLogRecPtr
- ede6acef4967 19 (unreleased) landed
-
Fix incorrect function name in comments
- 23792d738158 19 (unreleased) landed
-
Add infrastructure for efficient LSN waiting
- 3b4e53a075ea 19 (unreleased) landed
-
Add pairingheap_initialize() for shared memory usage
- 8af3ae0d4b36 19 (unreleased) landed
-
Implement WAIT FOR command
- 447aae13b030 19 (unreleased) landed