mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Remove retry loop in heap_page_prune().
The retry loop is needed because heap_page_prune() calls HeapTupleSatisfiesVacuum() and then lazy_scan_prune() does the same thing again, and they might get different answers due to concurrent clog updates. But this patch makes heap_page_prune() return the HeapTupleSatisfiesVacuum() results that it computed back to the caller, which allows lazy_scan_prune() to avoid needing to recompute those values in the first place. That's nice both because it eliminates the need for a retry loop and also because it's cheaper. Melanie Plageman, reviewed by David Geier, Andres Freund, and me. Discussion: https://postgr.es/m/CAAKRu_br124qsGJieuYA0nGjywEukhK1dKBfRdby_4yY3E9SXA%40mail.gmail.com
This commit is contained in:
@ -198,8 +198,33 @@ typedef struct PruneResult
|
||||
{
|
||||
int ndeleted; /* Number of tuples deleted from the page */
|
||||
int nnewlpdead; /* Number of newly LP_DEAD items */
|
||||
|
||||
/*
|
||||
* Tuple visibility is only computed once for each tuple, for correctness
|
||||
* and efficiency reasons; see comment in heap_page_prune() for details.
|
||||
* This is of type int8[], instead of HTSV_Result[], so we can use -1 to
|
||||
* indicate no visibility has been computed, e.g. for LP_DEAD items.
|
||||
*
|
||||
* This needs to be MaxHeapTuplesPerPage + 1 long as FirstOffsetNumber is
|
||||
* 1. Otherwise every access would need to subtract 1.
|
||||
*/
|
||||
int8 htsv[MaxHeapTuplesPerPage + 1];
|
||||
} PruneResult;
|
||||
|
||||
/*
|
||||
* Pruning calculates tuple visibility once and saves the results in an array
|
||||
* of int8. See PruneResult.htsv for details. This helper function is meant to
|
||||
* guard against examining visibility status array members which have not yet
|
||||
* been computed.
|
||||
*/
|
||||
static inline HTSV_Result
|
||||
htsv_get_valid_status(int status)
|
||||
{
|
||||
Assert(status >= HEAPTUPLE_DEAD &&
|
||||
status <= HEAPTUPLE_DELETE_IN_PROGRESS);
|
||||
return (HTSV_Result) status;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* function prototypes for heap access method
|
||||
*
|
||||
|
Reference in New Issue
Block a user