From 74ce20dc392912c2f066c8c32819ae206acfde7c Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Tue, 29 Jul 2025 14:35:13 -0400 Subject: [PATCH v15 21/23] Unset all-visible sooner if not freezing In prune/freeze code, we delay unsetting all-visible/all-frozen in the presence of dead items to allow opportunistically freezing tuples if the whole page would be frozen except for those dead items -- which are removed later in vacuum's third phase. Future commits will allow on-access pruning to set the VM, which means all-visible will be initialized to true instead of false and we will do extra bookkeeping in heap_prune_unchanged_lp_normal() to keep track of whether or not the page is all-visible. Because on-access pruning will not freeze tuples, it makes sense to unset all-visible as soon as we encounter an LP_DEAD item and avoid continued bookkeeping since we know the page is not all-visible and we won't be able to remove those dead items. --- src/backend/access/heap/pruneheap.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 631394889d7..e64addfdf5d 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -1523,8 +1523,11 @@ heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum, /* * Deliberately delay unsetting all_visible until later during pruning. - * Removable dead tuples shouldn't preclude freezing the page. + * Removable dead tuples shouldn't preclude freezing the page. If we won't + * attempt freezing, just unset all-visible now, though. */ + if (!prstate->attempt_freeze) + prstate->all_visible = prstate->all_frozen = false; /* Record the dead offset for vacuum */ prstate->deadoffsets[prstate->lpdead_items++] = offnum; @@ -1777,8 +1780,11 @@ heap_prune_record_unchanged_lp_dead(Page page, PruneState *prstate, OffsetNumber * Similarly, don't unset all_visible until later, at the end of * heap_page_prune_and_freeze(). This will allow us to attempt to freeze * the page after pruning. As long as we unset it before updating the - * visibility map, this will be correct. + * visibility map, this will be correct. If we won't attempt freezing, + * though, just unset all-visible now. */ + if (!prstate->attempt_freeze) + prstate->all_visible = prstate->all_frozen = false; /* Record the dead offset for vacuum */ prstate->deadoffsets[prstate->lpdead_items++] = offnum; -- 2.43.0