Thread

  1. [PATCH v9 17/21] Move 'frozen' array to PruneState.

    Heikki Linnakangas <heikki.linnakangas@iki.fi> — 2024-03-27T21:37:35Z

    It can be internal to heap_page_prune_and_freeze(), like the other
    arrays. The freeze subroutines don't need it.
    ---
     src/backend/access/heap/pruneheap.c | 22 ++++++++++++----------
     src/include/access/heapam.h         |  8 +-------
     2 files changed, 13 insertions(+), 17 deletions(-)
    
    diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
    index 6f039002684..fd8dc0bc85b 100644
    --- a/src/backend/access/heap/pruneheap.c
    +++ b/src/backend/access/heap/pruneheap.c
    @@ -43,10 +43,12 @@ typedef struct
     	int			nredirected;	/* numbers of entries in arrays below */
     	int			ndead;
     	int			nunused;
    +	int			nfrozen;
     	/* arrays that accumulate indexes of items to be changed */
     	OffsetNumber redirected[MaxHeapTuplesPerPage * 2];
     	OffsetNumber nowdead[MaxHeapTuplesPerPage];
     	OffsetNumber nowunused[MaxHeapTuplesPerPage];
    +	HeapTupleFreeze frozen[MaxHeapTuplesPerPage];
     
     	/*
     	 * marked[i] is true if item i is entered in one of the above arrays.
    @@ -320,7 +322,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     	prstate.vistest = vistest;
     	prstate.actions = actions;
     	prstate.latest_xid_removed = InvalidTransactionId;
    -	prstate.nredirected = prstate.ndead = prstate.nunused = 0;
    +	prstate.nredirected = prstate.ndead = prstate.nunused = prstate.nfrozen = 0;
     	memset(prstate.marked, 0, sizeof(prstate.marked));
     	memset(prstate.counted, 0, sizeof(prstate.counted));
     
    @@ -363,7 +365,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     		presult->set_all_frozen = true;
     	else
     		presult->set_all_frozen = false;
    -	presult->nfrozen = 0;
     
     	/*
     	 * Deliberately delay unsetting all_visible until later during pruning.
    @@ -512,7 +513,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     
     		if (prstate.pagefrz.freeze_required)
     			do_freeze = true;
    -		else if (whole_page_freezable && presult->nfrozen > 0)
    +		else if (whole_page_freezable && prstate.nfrozen > 0)
     		{
     			/*
     			 * Freezing would make the page all-frozen. In this case, we will
    @@ -535,8 +536,8 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     	 * want to avoid doing the pre-freeze checks in a critical section.
     	 */
     	if (do_freeze)
    -		heap_pre_freeze_checks(buffer, prstate.pagefrz.frozen, presult->nfrozen);
    -	else if (!presult->set_all_frozen || presult->nfrozen > 0)
    +		heap_pre_freeze_checks(buffer, prstate.frozen, prstate.nfrozen);
    +	else if (!presult->set_all_frozen || prstate.nfrozen > 0)
     	{
     		/*
     		 * If we will neither freeze tuples on the page nor set the page all
    @@ -544,7 +545,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     		 * will be no newly frozen tuples.
     		 */
     		presult->set_all_frozen = false;
    -		presult->nfrozen = 0;	/* avoid miscounts in instrumenation */
    +		prstate.nfrozen = 0;	/* avoid miscounts in instrumenation */
     	}
     
     	/* Any error while applying the changes is critical */
    @@ -602,7 +603,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     				frz_conflict_horizon = prstate.pagefrz.cutoffs->OldestXmin;
     				TransactionIdRetreat(frz_conflict_horizon);
     			}
    -			heap_freeze_prepared_tuples(buffer, prstate.pagefrz.frozen, presult->nfrozen);
    +			heap_freeze_prepared_tuples(buffer, prstate.frozen, prstate.nfrozen);
     		}
     
     		MarkBufferDirty(buffer);
    @@ -632,7 +633,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     			log_heap_prune_and_freeze(relation, buffer,
     									  conflict_xid,
     									  true, reason,
    -									  prstate.pagefrz.frozen, presult->nfrozen,
    +									  prstate.frozen, prstate.nfrozen,
     									  prstate.redirected, prstate.nredirected,
     									  prstate.nowdead, prstate.ndead,
     									  prstate.nowunused, prstate.nunused);
    @@ -649,6 +650,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
     	 */
     	if (!presult->set_all_frozen)
     		presult->vm_conflict_horizon = prstate.visibility_cutoff_xid;
    +	presult->nfrozen = prstate.nfrozen;
     
     	/*
     	 * If we will freeze tuples on the page or, even if we don't freeze tuples
    @@ -1298,11 +1300,11 @@ heap_prune_record_live_or_recently_dead(Page page, PruneState *prstate, OffsetNu
     	{
     		/* Tuple with storage -- consider need to freeze */
     		if ((heap_prepare_freeze_tuple(htup, &prstate->pagefrz,
    -									   &prstate->pagefrz.frozen[presult->nfrozen],
    +									   &prstate->frozen[presult->nfrozen],
     									   &totally_frozen)))
     		{
     			/* Save prepared freeze plan for later */
    -			prstate->pagefrz.frozen[presult->nfrozen++].offset = offnum;
    +			prstate->frozen[presult->nfrozen++].offset = offnum;
     		}
     
     		/*
    diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
    index a0420bea2eb..ef61e0277ee 100644
    --- a/src/include/access/heapam.h
    +++ b/src/include/access/heapam.h
    @@ -191,11 +191,6 @@ typedef struct HeapPageFreeze
     	MultiXactId NoFreezePageRelminMxid;
     
     	struct VacuumCutoffs *cutoffs;
    -
    -	/*
    -	 * One entry for every tuple that we may freeze.
    -	 */
    -	HeapTupleFreeze frozen[MaxHeapTuplesPerPage];
     } HeapPageFreeze;
     
     /*
    @@ -227,14 +222,13 @@ typedef struct PruneFreezeResult
     {
     	int			ndeleted;		/* Number of tuples deleted from the page */
     	int			nnewlpdead;		/* Number of newly LP_DEAD items */
    +	int			nfrozen;		/* Number of tuples we froze */
     
     	/*
     	 * The rest of the fields in PruneFreezeResult are only guaranteed to be
     	 * initialized if heap_page_prune_and_freeze() is passed
     	 * PRUNE_DO_TRY_FREEZE.
     	 */
    -	/* Number of tuples we froze */
    -	int			nfrozen;
     	/* Whether or not the page should be set all-frozen in the VM */
     	bool		set_all_frozen;
     
    -- 
    2.40.1
    
    
    --caj67xgx3lukmr5f
    Content-Type: text/x-diff; charset=us-ascii
    Content-Disposition: attachment; filename="v9-0018-Cosmetic-fixes.patch"