mirror of
https://github.com/postgres/postgres.git
synced 2025-08-19 23:22:23 +03:00
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
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user