From a87f670388f2c3683c4eecdb95ed81a0874335c3 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Sat, 6 Jan 2024 16:22:17 -0500 Subject: [PATCH v7 05/16] Add reference to VacuumCutoffs in HeapPageFreeze Future commits will move opportunistic freezing into the main path of pruning in heap_page_prune(). Because on-access pruning will not do opportunistic freezing, it is cleaner to keep the visibility information required for calling heap_prepare_freeze_tuple() inside of the HeapPageFreeze structure itself by saving a reference to VacuumCutoffs. --- src/backend/access/heap/heapam.c | 16 ++++++++-------- src/backend/access/heap/vacuumlazy.c | 3 ++- src/include/access/heapam.h | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index cc67dd813d2..e38c710c192 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6020,9 +6020,9 @@ heap_inplace_update(Relation relation, HeapTuple tuple) */ static TransactionId FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, - const struct VacuumCutoffs *cutoffs, uint16 *flags, - HeapPageFreeze *pagefrz) + uint16 *flags, HeapPageFreeze *pagefrz) { + const struct VacuumCutoffs *cutoffs = pagefrz->cutoffs; TransactionId newxmax; MultiXactMember *members; int nmembers; @@ -6370,10 +6370,10 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, */ bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, - const struct VacuumCutoffs *cutoffs, HeapPageFreeze *pagefrz, HeapTupleFreeze *frz, bool *totally_frozen) { + const struct VacuumCutoffs *cutoffs = pagefrz->cutoffs; bool xmin_already_frozen = false, xmax_already_frozen = false; bool freeze_xmin = false, @@ -6445,8 +6445,7 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, * perform no-op xmax processing. The only constraint is that the * FreezeLimit/MultiXactCutoff postcondition must never be violated. */ - newxmax = FreezeMultiXactId(xid, tuple->t_infomask, cutoffs, - &flags, pagefrz); + newxmax = FreezeMultiXactId(xid, tuple->t_infomask, &flags, pagefrz); if (flags & FRM_NOOP) { @@ -6624,7 +6623,7 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, * Does this tuple force caller to freeze the entire page? */ pagefrz->freeze_required = - heap_tuple_should_freeze(tuple, cutoffs, + heap_tuple_should_freeze(tuple, pagefrz->cutoffs, &pagefrz->NoFreezePageRelfrozenXid, &pagefrz->NoFreezePageRelminMxid); } @@ -6785,8 +6784,9 @@ heap_freeze_tuple(HeapTupleHeader tuple, pagefrz.NoFreezePageRelfrozenXid = FreezeLimit; pagefrz.NoFreezePageRelminMxid = MultiXactCutoff; - do_freeze = heap_prepare_freeze_tuple(tuple, &cutoffs, - &pagefrz, &frz, &totally_frozen); + pagefrz.cutoffs = &cutoffs; + + do_freeze = heap_prepare_freeze_tuple(tuple, &pagefrz, &frz, &totally_frozen); /* * Note that because this is not a WAL-logged operation, we don't need to diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 17fb0b4f7b7..1b060124a3f 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -1442,6 +1442,7 @@ lazy_scan_prune(LVRelState *vacrel, pagefrz.FreezePageRelminMxid = vacrel->NewRelminMxid; pagefrz.NoFreezePageRelfrozenXid = vacrel->NewRelfrozenXid; pagefrz.NoFreezePageRelminMxid = vacrel->NewRelminMxid; + pagefrz.cutoffs = &vacrel->cutoffs; tuples_frozen = 0; lpdead_items = 0; live_tuples = 0; @@ -1587,7 +1588,7 @@ lazy_scan_prune(LVRelState *vacrel, hastup = true; /* page makes rel truncation unsafe */ /* Tuple with storage -- consider need to freeze */ - if (heap_prepare_freeze_tuple(htup, &vacrel->cutoffs, &pagefrz, + if (heap_prepare_freeze_tuple(htup, &pagefrz, &frozen[tuples_frozen], &totally_frozen)) { /* Save prepared freeze plan for later */ diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 8d0dd40ba6d..3f510e8e197 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -189,6 +189,7 @@ typedef struct HeapPageFreeze TransactionId NoFreezePageRelfrozenXid; MultiXactId NoFreezePageRelminMxid; + struct VacuumCutoffs *cutoffs; } HeapPageFreeze; /* @@ -321,7 +322,6 @@ extern TM_Result heap_lock_tuple(Relation relation, HeapTuple tuple, extern void heap_inplace_update(Relation relation, HeapTuple tuple); extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, - const struct VacuumCutoffs *cutoffs, HeapPageFreeze *pagefrz, HeapTupleFreeze *frz, bool *totally_frozen); extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer, -- 2.40.1