Thread

  1. [PATCH v1 08/12] prune_xid-hist: collect data from heap_{delete,update,insert}

    Renan Alves Fonseca <renanfonseca@gmail.com> — 2025-05-20T11:43:23Z

    ---
     src/backend/access/heap/heapam.c | 22 ++++++++++++++++++----
     src/include/storage/bufpage.h    | 12 ++++++++++++
     2 files changed, 30 insertions(+), 4 deletions(-)
    
    diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
    index c1a4de14a59..08a3ecfcdbb 100644
    --- a/src/backend/access/heap/heapam.c
    +++ b/src/backend/access/heap/heapam.c
    @@ -2748,6 +2748,8 @@ heap_delete(Relation relation, ItemPointer tid,
     {
     	TM_Result	result;
     	TransactionId xid = GetCurrentTransactionId();
    +	TransactionId old_prune_xid;
    +	bool		prune_xid_changed = false;
     	ItemId		lp;
     	HeapTupleData tp;
     	Page		page;
    @@ -3015,7 +3017,7 @@ l1:
     	 * the subsequent page pruning will be a no-op and the hint will be
     	 * cleared.
     	 */
    -	PageSetPrunable(page, xid);
    +	PageSetPrunableReporting(page, xid, old_prune_xid, prune_xid_changed);
     
     	if (PageIsAllVisible(page))
     	{
    @@ -3148,6 +3150,9 @@ l1:
     
     	pgstat_count_heap_delete(relation);
     
    +	if (prune_xid_changed)
    +		pgstat_update_relation_prune_xid_histogram(relation, old_prune_xid, xid);
    +
     	if (old_key_tuple != NULL && old_key_copied)
     		heap_freetuple(old_key_tuple);
     
    @@ -3216,6 +3221,8 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
     {
     	TM_Result	result;
     	TransactionId xid = GetCurrentTransactionId();
    +	TransactionId old_prune_xid;
    +	bool		prune_xid_changed = false;
     	Bitmapset  *hot_attrs;
     	Bitmapset  *sum_attrs;
     	Bitmapset  *key_attrs;
    @@ -4029,7 +4036,7 @@ l2:
     	 * not to optimize for aborts.  Note that heap_xlog_update must be kept in
     	 * sync if this decision changes.
     	 */
    -	PageSetPrunable(page, xid);
    +	PageSetPrunableReporting(page, xid, old_prune_xid, prune_xid_changed);
     
     	if (use_hot_update)
     	{
    @@ -4144,6 +4151,9 @@ l2:
     
     	pgstat_count_heap_update(relation, use_hot_update, newbuf != buffer);
     
    +	if (prune_xid_changed)
    +		pgstat_update_relation_prune_xid_histogram(relation, old_prune_xid, xid);
    +
     	/*
     	 * If heaptup is a private copy, release it.  Don't forget to copy t_self
     	 * back to the caller's image, too.
    @@ -6139,6 +6149,9 @@ void
     heap_abort_speculative(Relation relation, ItemPointer tid)
     {
     	TransactionId xid = GetCurrentTransactionId();
    +	TransactionId prune_xid;
    +	TransactionId old_prune_xid;
    +	bool		prune_xid_changed = false;
     	ItemId		lp;
     	HeapTupleData tp;
     	Page		page;
    @@ -6198,13 +6211,12 @@ heap_abort_speculative(Relation relation, ItemPointer tid)
     	Assert(TransactionIdIsValid(TransactionXmin));
     	{
     		TransactionId relfrozenxid = relation->rd_rel->relfrozenxid;
    -		TransactionId prune_xid;
     
     		if (TransactionIdPrecedes(TransactionXmin, relfrozenxid))
     			prune_xid = relfrozenxid;
     		else
     			prune_xid = TransactionXmin;
    -		PageSetPrunable(page, prune_xid);
    +		PageSetPrunableReporting(page, prune_xid, old_prune_xid, prune_xid_changed);
     	}
     
     	/* store transaction information of xact deleting the tuple */
    @@ -6271,6 +6283,8 @@ heap_abort_speculative(Relation relation, ItemPointer tid)
     
     	/* count deletion, as we counted the insertion too */
     	pgstat_count_heap_delete(relation);
    +	if (prune_xid_changed)
    +		pgstat_update_relation_prune_xid_histogram(relation, old_prune_xid, prune_xid);
     }
     
     /*
    diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
    index aeb67c498c5..8a0774dc271 100644
    --- a/src/include/storage/bufpage.h
    +++ b/src/include/storage/bufpage.h
    @@ -452,6 +452,18 @@ do { \
     		TransactionIdPrecedes(xid, ((PageHeader) (page))->pd_prune_xid)) \
     		((PageHeader) (page))->pd_prune_xid = (xid); \
     } while (0)
    +#define PageSetPrunableReporting(page, xid, old_xid, changed)	\
    +do { \
    +	Assert(TransactionIdIsNormal(xid)); \
    +	if (!TransactionIdIsValid(((PageHeader) (page))->pd_prune_xid) || \
    +		TransactionIdPrecedes(xid, ((PageHeader) (page))->pd_prune_xid)) \
    +	    { \
    +            old_xid = ((PageHeader) (page))->pd_prune_xid; \
    +            ((PageHeader) (page))->pd_prune_xid = (xid); \
    +		    changed = true; \
    +        } \
    +} while (0)
    +
     #define PageClearPrunable(page) \
     	(((PageHeader) (page))->pd_prune_xid = InvalidTransactionId)
     
    -- 
    2.47.0
    
    
    --=-=-=
    Content-Type: text/x-patch
    Content-Disposition: attachment;
     filename=v1-0009-prune_xid-hist-collect-data-from-opportunistic-pr.patch