From 9e36031d684efaede04ebbfebed59a594808d2a4 Mon Sep 17 00:00:00 2001 From: Rahul Yadav Date: Thu, 1 Oct 2026 15:07:40 +0000 Subject: [PATCH v3 2/3] Initialize zeroed VM pages in VM clear redo RBM_ZERO_ON_ERROR recreates a truncated VM page as all zeros. With wal_consistency_checking, verifyBackupPageConsistency() then masks it with heap_mask(), and mask_unused_space() rejects a page with pd_lower 0. heap_xlog_prune_freeze() and heap_xlog_multi_insert() already initialize a VM page that was read as zeros. Do the same at the three VM clear sites. Discussion: https://postgr.es/m/P2s-NV0--F-9@rhyadav.dev --- Notes: Rahul posted this as a diff on top of v2, without a commit message. The message above is put together from his mail. src/backend/access/heap/heapam_xlog.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/access/heap/heapam_xlog.c b/src/backend/access/heap/heapam_xlog.c index b82f388b4be..6ffd2fa6180 100644 --- a/src/backend/access/heap/heapam_xlog.c +++ b/src/backend/access/heap/heapam_xlog.c @@ -57,6 +57,10 @@ heap_xlog_vm_clear(XLogReaderState *record, RBM_ZERO_ON_ERROR, false, &vmbuffer) == BLK_NEEDS_REDO) { + /* initialize the page if it was read as zeros */ + if (PageIsNew(BufferGetPage(vmbuffer))) + PageInit(BufferGetPage(vmbuffer), BLCKSZ, 0); + if (visibilitymap_clear(target_locator, heap_blkno, vmbuffer, flags)) PageSetLSN(BufferGetPage(vmbuffer), lsn); } @@ -817,6 +821,10 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) RBM_ZERO_ON_ERROR, false, &vmbuffer_new) == BLK_NEEDS_REDO) { + /* initialize the page if it was read as zeros */ + if (PageIsNew(BufferGetPage(vmbuffer_new))) + PageInit(BufferGetPage(vmbuffer_new), BLCKSZ, 0); + /* * If both the old and new heap pages were all-visible and their * VM bits are on the same VM page, that single VM page is @@ -856,6 +864,10 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) RBM_ZERO_ON_ERROR, false, &vmbuffer_old) == BLK_NEEDS_REDO) { + /* initialize the page if it was read as zeros */ + if (PageIsNew(BufferGetPage(vmbuffer_old))) + PageInit(BufferGetPage(vmbuffer_old), BLCKSZ, 0); + if (visibilitymap_clear(rlocator, oldblk, vmbuffer_old, VISIBILITYMAP_VALID_BITS)) PageSetLSN(BufferGetPage(vmbuffer_old), lsn); -- 2.37.1 (Apple Git-137.1)