Add comment about keeping PD_ALL_VISIBLE and VM in sync
authorMelanie Plageman <[email protected]>
Wed, 10 Dec 2025 16:10:13 +0000 (11:10 -0500)
committerMelanie Plageman <[email protected]>
Wed, 10 Dec 2025 16:10:13 +0000 (11:10 -0500)
The comment above heap_xlog_visible() about the critical integrity
requirement for PD_ALL_VISIBLE and the visibility map should also be in
heap_xlog_prune_freeze() where we set PD_ALL_VISIBLE.

Oversight in add323da40a6bf9e

Author: Melanie Plageman <[email protected]>
Discussion: https://postgr.es/m/flat/CAAKRu_ZMw6Npd_qm2KM%2BFwQ3cMOMx1Dh3VMhp8-V7SOLxdK9-g%40mail.gmail.com

src/backend/access/heap/heapam_xlog.c

index 11cb3f74da5b5d1d33427a223cb378bfe244188b..a09fb4b803ad90c459c233c9ece5e242fa8ddc60 100644 (file)
@@ -157,6 +157,12 @@ heap_xlog_prune_freeze(XLogReaderState *record)
                /* There should be no more data */
                Assert((char *) frz_offsets == dataptr + datalen);
 
+               /*
+                * The critical integrity requirement here is that we must never end
+                * up with the visibility map bit set and the page-level
+                * PD_ALL_VISIBLE bit unset.  If that were to occur, a subsequent page
+                * modification would fail to clear the visibility map bit.
+                */
                if (vmflags & VISIBILITYMAP_VALID_BITS)
                        PageSetAllVisible(page);