Re: gistGetFakeLSN() can return incorrect LSNs
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Andrey Borodin <x4mmm@yandex-team.ru>
Cc: pgsql-hackers@postgresql.org, Noah Misch <noah@leadboat.com>, Tomas Vondra <tv@fuzzy.cz>, Peter Geoghegan <pg@bowt.ie>
Date: 2026-03-05T19:27:04Z
Lists: pgsql-hackers
Hi, On 2026-03-05 23:26:30 +0500, Andrey Borodin wrote: > Interesting bug. Your analysis seems correct to me. > > > On 5 Mar 2026, at 22:10, Andres Freund <andres@anarazel.de> wrote: > > > > To be safe, this code would need to use a version of GetXLogInsertRecPtr() > > that does use XLogBytePosToEndRecPtr() instead of XLogBytePosToRecPtr(). > > Can't we just take Insert->CurrBytePos without XLogBytePosToEndRecPtr()? > Is there a point in alignment before the page header? No, that'd be a completely bogus LSN, as CurrBytePos does not include any space for page headers, to make the the very contended spinlock'ed section in ReserveXLogInsertLocation() cheaper: /* * The duration the spinlock needs to be held is minimized by minimizing * the calculations that have to be done while holding the lock. The * current tip of reserved WAL is kept in CurrBytePos, as a byte position * that only counts "usable" bytes in WAL, that is, it excludes all WAL * page headers. The mapping between "usable" byte positions and physical * positions (XLogRecPtrs) can be done outside the locked region, and * because the usable byte position doesn't include any headers, reserving * X bytes from WAL is almost as simple as "CurrBytePos += X". */ SpinLockAcquire(&Insert->insertpos_lck); And we rely on the page LSNs to be correct for the content of newly created permanent relations with wal_level=minimal, so you can't just return arbitrary other values. Greetings, Andres Freund
Commits
-
Use GetXLogInsertEndRecPtr in gistGetFakeLSN
- c0ffc725f8b3 14.23 landed
- ce06b5740ef9 15.18 landed
- 4f4025eac0b9 16.14 landed
- 6ef36bb35884 17.10 landed
- 5b3f63a1bf59 18.4 landed
- b1f14c967202 19 (unreleased) landed
-
Skip WAL for new relfilenodes, under wal_level=minimal.
- c6b92041d385 13.0 cited