From 8a3d02ccb9165d53e50c391dd4d71cc108c9ef15 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Sat, 27 Sep 2025 11:55:21 -0400 Subject: [PATCH v32 07/16] Eliminate XLOG_HEAP2_VISIBLE from empty-page vacuum As part of removing XLOG_HEAP2_VISIBLE records, phase I of VACUUM now marks empty pages all-visible in a XLOG_HEAP2_PRUNE_VACUUM_SCAN record. Author: Melanie Plageman Reviewed-by: Robert Haas Reviewed-by: Andres Freund Reviewed-by: Chao Li --- src/backend/access/heap/vacuumlazy.c | 35 +++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index b7d834969d6..afa2c3af833 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -1896,9 +1896,12 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, */ if (!PageIsAllVisible(page)) { + /* Lock vmbuffer before entering critical section */ + LockBuffer(vmbuffer, BUFFER_LOCK_EXCLUSIVE); + START_CRIT_SECTION(); - /* mark buffer dirty before writing a WAL record */ + /* Mark buffer dirty before writing any WAL records */ MarkBufferDirty(buf); /* @@ -1915,13 +1918,33 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, log_newpage_buffer(buf, true); PageSetAllVisible(page); - visibilitymap_set(vacrel->rel, blkno, buf, - InvalidXLogRecPtr, - vmbuffer, InvalidTransactionId, - VISIBILITYMAP_ALL_VISIBLE | - VISIBILITYMAP_ALL_FROZEN); + visibilitymap_set_vmbits(blkno, + vmbuffer, + VISIBILITYMAP_ALL_VISIBLE | + VISIBILITYMAP_ALL_FROZEN, + vacrel->rel->rd_locator); + + /* + * Emit WAL for setting PD_ALL_VISIBLE on the heap page and + * setting the VM. + */ + if (RelationNeedsWAL(vacrel->rel)) + log_heap_prune_and_freeze(vacrel->rel, buf, + vmbuffer, + VISIBILITYMAP_ALL_VISIBLE | + VISIBILITYMAP_ALL_FROZEN, + InvalidTransactionId, /* conflict xid */ + false, /* cleanup lock */ + PRUNE_VACUUM_SCAN, /* reason */ + NULL, 0, + NULL, 0, + NULL, 0, + NULL, 0); + END_CRIT_SECTION(); + LockBuffer(vmbuffer, BUFFER_LOCK_UNLOCK); + /* Count the newly all-frozen pages for logging */ vacrel->vm_new_visible_pages++; vacrel->vm_new_visible_frozen_pages++; -- 2.43.0