diff options
author | Robert Haas | 2023-10-02 15:40:07 +0000 |
---|---|---|
committer | Robert Haas | 2023-10-02 15:40:07 +0000 |
commit | 1ccc1e05ae8feabf444259234d34e1e32231604d (patch) | |
tree | 057ec0d5c4755cc7f03c9a536fd49a6cbb74e296 /src/include/access/heapam.h | |
parent | e64c733bb1996e52a13f6fc4a1240703f607fa53 (diff) |
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
Diffstat (limited to 'src/include/access/heapam.h')
-rw-r--r-- | src/include/access/heapam.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 2d3f149e4f0..62fac1d5d29 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -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 * |