From 7f9d4187e7bab10329cc00aff34cfba08248d4be Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Wed, 18 Dec 2024 18:19:28 -0500 Subject: Add common interface for TBMIterators Add and use TBMPrivateIterator, which replaces the current TBMIterator for serial use cases, and repurpose TBMIterator to be a unified interface for both the serial ("private") and parallel ("shared") TID Bitmap iterator interfaces. This encapsulation simplifies call sites for callers supporting both parallel and serial TID Bitmap access. TBMIterator is not yet used in this commit. Author: Melanie Plageman Reviewed-by: Tomas Vondra, Heikki Linnakangas Discussion: https://postgr.es/m/063e4eb4-32d9-439e-a0b1-75565a9835a8%40iki.fi --- src/backend/executor/nodeBitmapHeapscan.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/backend/executor/nodeBitmapHeapscan.c') diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 689bde16dd2..d9e7a516a07 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -95,7 +95,7 @@ BitmapHeapNext(BitmapHeapScanState *node) */ if (!node->initialized) { - TBMIterator *tbmiterator = NULL; + TBMPrivateIterator *tbmiterator = NULL; TBMSharedIterator *shared_tbmiterator = NULL; if (!pstate) @@ -106,12 +106,12 @@ BitmapHeapNext(BitmapHeapScanState *node) elog(ERROR, "unrecognized result from subplan"); node->tbm = tbm; - tbmiterator = tbm_begin_iterate(tbm); + tbmiterator = tbm_begin_private_iterate(tbm); #ifdef USE_PREFETCH if (node->prefetch_maximum > 0) { - node->prefetch_iterator = tbm_begin_iterate(tbm); + node->prefetch_iterator = tbm_begin_private_iterate(tbm); node->prefetch_pages = 0; node->prefetch_target = -1; } @@ -332,7 +332,7 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node) if (pstate == NULL) { - TBMIterator *prefetch_iterator = node->prefetch_iterator; + TBMPrivateIterator *prefetch_iterator = node->prefetch_iterator; if (node->prefetch_pages > 0) { @@ -341,7 +341,7 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node) } else if (prefetch_iterator) { - tbmpre = tbm_iterate(prefetch_iterator); + tbmpre = tbm_private_iterate(prefetch_iterator); node->prefetch_blockno = tbmpre ? tbmpre->blockno : InvalidBlockNumber; } @@ -446,19 +446,20 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan) if (pstate == NULL) { - TBMIterator *prefetch_iterator = node->prefetch_iterator; + TBMPrivateIterator *prefetch_iterator = node->prefetch_iterator; if (prefetch_iterator) { while (node->prefetch_pages < node->prefetch_target) { - TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); + TBMIterateResult *tbmpre; bool skip_fetch; + tbmpre = tbm_private_iterate(prefetch_iterator); if (tbmpre == NULL) { /* No more pages to prefetch */ - tbm_end_iterate(prefetch_iterator); + tbm_end_private_iterate(prefetch_iterator); node->prefetch_iterator = NULL; break; } @@ -594,7 +595,7 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) if (scan->st.bitmap.rs_iterator) { - tbm_end_iterate(scan->st.bitmap.rs_iterator); + tbm_end_private_iterate(scan->st.bitmap.rs_iterator); scan->st.bitmap.rs_iterator = NULL; } @@ -604,7 +605,7 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) /* release bitmaps and buffers if any */ if (node->prefetch_iterator) - tbm_end_iterate(node->prefetch_iterator); + tbm_end_private_iterate(node->prefetch_iterator); if (node->shared_prefetch_iterator) tbm_end_shared_iterate(node->shared_prefetch_iterator); if (node->tbm) @@ -685,7 +686,7 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node) if (scanDesc->st.bitmap.rs_iterator) { - tbm_end_iterate(scanDesc->st.bitmap.rs_iterator); + tbm_end_private_iterate(scanDesc->st.bitmap.rs_iterator); scanDesc->st.bitmap.rs_iterator = NULL; } @@ -699,7 +700,7 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node) * release bitmaps and buffers if any */ if (node->prefetch_iterator) - tbm_end_iterate(node->prefetch_iterator); + tbm_end_private_iterate(node->prefetch_iterator); if (node->tbm) tbm_free(node->tbm); if (node->shared_prefetch_iterator) -- cgit v1.2.3