Re: Implement waiting for wal lsn replay: reloaded
Xuneng Zhou <xunengzhou@gmail.com>
Attachments
- v1-0001-Avoid-syscache-lookup-in-WAIT-FOR-LSN-tuple-descr.patch (application/octet-stream) patch v1-0001
Hi Alexander, On Sat, Jan 10, 2026 at 12:47 PM Xuneng Zhou <xunengzhou@gmail.com> wrote: > > On Fri, Jan 9, 2026 at 9:44 PM Xuneng Zhou <xunengzhou@gmail.com> wrote: > > > > Hi, > > > > On Fri, Jan 9, 2026 at 4:42 AM Alexander Korotkov <aekorotkov@gmail.com> wrote: > > > > > > On Thu, Jan 8, 2026 at 6:29 PM Xuneng Zhou <xunengzhou@gmail.com> wrote: > > > > On Thu, Jan 8, 2026 at 10:19 PM Alexander Korotkov <aekorotkov@gmail.com> wrote: > > > > > I see, you were right. This is not related to the MyProc->xmin. > > > > > ResolveRecoveryConflictWithTablespace() calls > > > > > GetConflictingVirtualXIDs(InvalidTransactionId, InvalidOid). That > > > > > would kill WAIT FOR LSN query independently on its xmin. > > > > > > > > I think the concern is valid --- conflicts like > > > > PROCSIG_RECOVERY_CONFLICT_SNAPSHOT could occur and terminate the > > > > backend if the timing is unlucky. It's more difficult to reproduce > > > > though. A check for the log containing "conflict with recovery" would > > > > likely catch these conflicts as well. > > > > > > Yes, I found multiple reasons why xmin gets temporarily set during > > > processing of WAIT FOR LSN query. I'll soon post a draft patch to fix > > > that. > > > > > > > > I guess your > > > > > patch is the only way to go. It's clumsy to wrap WAIT FOR LSN call > > > > > with retry loop, but it would still consume less resources than > > > > > polling. > > > > > > > > > > > > > Assuming recovery conflicts are relatively rare in tap tests, except > > > > for the explicitly designed tests like 031_recovery_conflict and the > > > > narrow timing window that the standby has not caught up while the wait > > > > for gets invoked, a simple fallback seems appropriate to me. > > > > > > Yes, I see. Seems acceptable given this seems the only feasible way to go. > > > > > > > Here is the updated patch with recovery conflicts handled. > > V2 corrected the commit message to state " if the WAIT FOR LSN session > is interrupted by a recovery conflict (e.g., DROP TABLESPACE > triggering conflicts on all backends),". In this case, the statement > is canceled when possible; in some states (idle in transaction or > subtransaction) the session may be terminated. > The attached patch avoids a syscache lookup while constructing the tuple descriptor for WAIT FOR LSN, so that a catalog snapshot is not re-established after the wait finishes. The standard output path (printtup) may still briefly establish a catalog snapshot during result emission, but this seems acceptable: the snapshot window is narrow to emit a single row. A fully catalog-free output path would require either bypassing the DestReceiver lifecycle (breaking layering) or adding a custom receiver (added complexity for marginal benefit). The current approach is simpler and might be sufficient unless output-phase conflicts are observed a lot in practice. Does this make sense to you? -- 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