@@ -95,8 +95,7 @@ BitmapHeapNext(BitmapHeapScanState *node)
95
95
*/
96
96
if (!node -> initialized )
97
97
{
98
- TBMPrivateIterator * tbmiterator = NULL ;
99
- TBMSharedIterator * shared_tbmiterator = NULL ;
98
+ TBMIterator tbmiterator ;
100
99
101
100
if (!pstate )
102
101
{
@@ -106,70 +105,62 @@ BitmapHeapNext(BitmapHeapScanState *node)
106
105
elog (ERROR , "unrecognized result from subplan" );
107
106
108
107
node -> tbm = tbm ;
109
- tbmiterator = tbm_begin_private_iterate (tbm );
110
108
111
109
#ifdef USE_PREFETCH
112
110
if (node -> prefetch_maximum > 0 )
113
- {
114
- node -> prefetch_iterator = tbm_begin_private_iterate ( tbm );
115
- node -> prefetch_pages = 0 ;
116
- node -> prefetch_target = -1 ;
117
- }
111
+ node -> prefetch_iterator =
112
+ tbm_begin_iterate ( node -> tbm , dsa ,
113
+ pstate ?
114
+ pstate -> prefetch_iterator :
115
+ InvalidDsaPointer );
118
116
#endif /* USE_PREFETCH */
119
117
}
120
- else
118
+ else if ( BitmapShouldInitializeSharedState ( pstate ))
121
119
{
122
120
/*
123
121
* The leader will immediately come out of the function, but
124
122
* others will be blocked until leader populates the TBM and wakes
125
123
* them up.
126
124
*/
127
- if (BitmapShouldInitializeSharedState (pstate ))
128
- {
129
- tbm = (TIDBitmap * ) MultiExecProcNode (outerPlanState (node ));
130
- if (!tbm || !IsA (tbm , TIDBitmap ))
131
- elog (ERROR , "unrecognized result from subplan" );
132
-
133
- node -> tbm = tbm ;
134
-
135
- /*
136
- * Prepare to iterate over the TBM. This will return the
137
- * dsa_pointer of the iterator state which will be used by
138
- * multiple processes to iterate jointly.
139
- */
140
- pstate -> tbmiterator = tbm_prepare_shared_iterate (tbm );
141
- #ifdef USE_PREFETCH
142
- if (node -> prefetch_maximum > 0 )
143
- {
144
- pstate -> prefetch_iterator =
145
- tbm_prepare_shared_iterate (tbm );
146
-
147
- /*
148
- * We don't need the mutex here as we haven't yet woke up
149
- * others.
150
- */
151
- pstate -> prefetch_pages = 0 ;
152
- pstate -> prefetch_target = -1 ;
153
- }
154
- #endif
125
+ tbm = (TIDBitmap * ) MultiExecProcNode (outerPlanState (node ));
126
+ if (!tbm || !IsA (tbm , TIDBitmap ))
127
+ elog (ERROR , "unrecognized result from subplan" );
155
128
156
- /* We have initialized the shared state so wake up others. */
157
- BitmapDoneInitializingSharedState (pstate );
158
- }
129
+ node -> tbm = tbm ;
159
130
160
- /* Allocate a private iterator and attach the shared state to it */
161
- shared_tbmiterator =
162
- tbm_attach_shared_iterate (dsa , pstate -> tbmiterator );
131
+ /*
132
+ * Prepare to iterate over the TBM. This will return the
133
+ * dsa_pointer of the iterator state which will be used by
134
+ * multiple processes to iterate jointly.
135
+ */
136
+ pstate -> tbmiterator = tbm_prepare_shared_iterate (tbm );
163
137
164
138
#ifdef USE_PREFETCH
165
139
if (node -> prefetch_maximum > 0 )
166
140
{
167
- node -> shared_prefetch_iterator =
168
- tbm_attach_shared_iterate ( dsa , pstate -> prefetch_iterator );
141
+ pstate -> prefetch_iterator =
142
+ tbm_prepare_shared_iterate ( tbm );
169
143
}
170
144
#endif /* USE_PREFETCH */
145
+
146
+ /* We have initialized the shared state so wake up others. */
147
+ BitmapDoneInitializingSharedState (pstate );
171
148
}
172
149
150
+ tbmiterator = tbm_begin_iterate (tbm , dsa ,
151
+ pstate ?
152
+ pstate -> tbmiterator :
153
+ InvalidDsaPointer );
154
+
155
+ #ifdef USE_PREFETCH
156
+ if (node -> prefetch_maximum > 0 )
157
+ node -> prefetch_iterator =
158
+ tbm_begin_iterate (tbm , dsa ,
159
+ pstate ?
160
+ pstate -> prefetch_iterator :
161
+ InvalidDsaPointer );
162
+ #endif /* USE_PREFETCH */
163
+
173
164
/*
174
165
* If this is the first scan of the underlying table, create the table
175
166
* scan descriptor and begin the scan.
@@ -198,8 +189,7 @@ BitmapHeapNext(BitmapHeapScanState *node)
198
189
node -> ss .ss_currentScanDesc = scan ;
199
190
}
200
191
201
- scan -> st .bitmap .rs_iterator = tbmiterator ;
202
- scan -> st .bitmap .rs_shared_iterator = shared_tbmiterator ;
192
+ scan -> st .rs_tbmiterator = tbmiterator ;
203
193
node -> initialized = true;
204
194
205
195
goto new_page ;
@@ -285,7 +275,7 @@ BitmapHeapNext(BitmapHeapScanState *node)
285
275
* ahead of the current block.
286
276
*/
287
277
if (node -> pstate == NULL &&
288
- node -> prefetch_iterator &&
278
+ ! tbm_exhausted ( & node -> prefetch_iterator ) &&
289
279
node -> prefetch_blockno < node -> blockno )
290
280
elog (ERROR ,
291
281
"prefetch and main iterators are out of sync. pfblockno: %d. blockno: %d" ,
@@ -332,16 +322,16 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node)
332
322
333
323
if (pstate == NULL )
334
324
{
335
- TBMPrivateIterator * prefetch_iterator = node -> prefetch_iterator ;
325
+ TBMIterator * prefetch_iterator = & node -> prefetch_iterator ;
336
326
337
327
if (node -> prefetch_pages > 0 )
338
328
{
339
329
/* The main iterator has closed the distance by one page */
340
330
node -> prefetch_pages -- ;
341
331
}
342
- else if (prefetch_iterator )
332
+ else if (! tbm_exhausted ( prefetch_iterator ) )
343
333
{
344
- tbmpre = tbm_private_iterate (prefetch_iterator );
334
+ tbmpre = tbm_iterate (prefetch_iterator );
345
335
node -> prefetch_blockno = tbmpre ? tbmpre -> blockno :
346
336
InvalidBlockNumber ;
347
337
}
@@ -359,7 +349,7 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node)
359
349
*/
360
350
if (node -> prefetch_maximum > 0 )
361
351
{
362
- TBMSharedIterator * prefetch_iterator = node -> shared_prefetch_iterator ;
352
+ TBMIterator * prefetch_iterator = & node -> prefetch_iterator ;
363
353
364
354
SpinLockAcquire (& pstate -> mutex );
365
355
if (pstate -> prefetch_pages > 0 )
@@ -380,9 +370,9 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node)
380
370
* we don't validate the blockno here as we do in non-parallel
381
371
* case.
382
372
*/
383
- if (prefetch_iterator )
373
+ if (! tbm_exhausted ( prefetch_iterator ) )
384
374
{
385
- tbmpre = tbm_shared_iterate (prefetch_iterator );
375
+ tbmpre = tbm_iterate (prefetch_iterator );
386
376
node -> prefetch_blockno = tbmpre ? tbmpre -> blockno :
387
377
InvalidBlockNumber ;
388
378
}
@@ -446,21 +436,19 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan)
446
436
447
437
if (pstate == NULL )
448
438
{
449
- TBMPrivateIterator * prefetch_iterator = node -> prefetch_iterator ;
439
+ TBMIterator * prefetch_iterator = & node -> prefetch_iterator ;
450
440
451
- if (prefetch_iterator )
441
+ if (! tbm_exhausted ( prefetch_iterator ) )
452
442
{
453
443
while (node -> prefetch_pages < node -> prefetch_target )
454
444
{
455
- TBMIterateResult * tbmpre ;
445
+ TBMIterateResult * tbmpre = tbm_iterate ( prefetch_iterator ) ;
456
446
bool skip_fetch ;
457
447
458
- tbmpre = tbm_private_iterate (prefetch_iterator );
459
448
if (tbmpre == NULL )
460
449
{
461
450
/* No more pages to prefetch */
462
- tbm_end_private_iterate (prefetch_iterator );
463
- node -> prefetch_iterator = NULL ;
451
+ tbm_end_iterate (prefetch_iterator );
464
452
break ;
465
453
}
466
454
node -> prefetch_pages ++ ;
@@ -488,9 +476,9 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan)
488
476
489
477
if (pstate -> prefetch_pages < pstate -> prefetch_target )
490
478
{
491
- TBMSharedIterator * prefetch_iterator = node -> shared_prefetch_iterator ;
479
+ TBMIterator * prefetch_iterator = & node -> prefetch_iterator ;
492
480
493
- if (prefetch_iterator )
481
+ if (! tbm_exhausted ( prefetch_iterator ) )
494
482
{
495
483
while (1 )
496
484
{
@@ -513,12 +501,11 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan)
513
501
if (!do_prefetch )
514
502
return ;
515
503
516
- tbmpre = tbm_shared_iterate (prefetch_iterator );
504
+ tbmpre = tbm_iterate (prefetch_iterator );
517
505
if (tbmpre == NULL )
518
506
{
519
507
/* No more pages to prefetch */
520
- tbm_end_shared_iterate (prefetch_iterator );
521
- node -> shared_prefetch_iterator = NULL ;
508
+ tbm_end_iterate (prefetch_iterator );
522
509
break ;
523
510
}
524
511
@@ -587,39 +574,30 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node)
587
574
/*
588
575
* End iteration on iterators saved in scan descriptor.
589
576
*/
590
- if (scan -> st .bitmap .rs_shared_iterator )
591
- {
592
- tbm_end_shared_iterate (scan -> st .bitmap .rs_shared_iterator );
593
- scan -> st .bitmap .rs_shared_iterator = NULL ;
594
- }
595
-
596
- if (scan -> st .bitmap .rs_iterator )
597
- {
598
- tbm_end_private_iterate (scan -> st .bitmap .rs_iterator );
599
- scan -> st .bitmap .rs_iterator = NULL ;
600
- }
577
+ tbm_end_iterate (& scan -> st .rs_tbmiterator );
601
578
602
579
/* rescan to release any page pin */
603
580
table_rescan (node -> ss .ss_currentScanDesc , NULL );
604
581
}
605
582
583
+ /* If we did not already clean up the prefetch iterator, do so now. */
584
+ if (!tbm_exhausted (& node -> prefetch_iterator ))
585
+ tbm_end_iterate (& node -> prefetch_iterator );
586
+
606
587
/* release bitmaps and buffers if any */
607
- if (node -> prefetch_iterator )
608
- tbm_end_private_iterate (node -> prefetch_iterator );
609
- if (node -> shared_prefetch_iterator )
610
- tbm_end_shared_iterate (node -> shared_prefetch_iterator );
611
588
if (node -> tbm )
612
589
tbm_free (node -> tbm );
613
590
if (node -> pvmbuffer != InvalidBuffer )
614
591
ReleaseBuffer (node -> pvmbuffer );
615
592
node -> tbm = NULL ;
616
- node -> prefetch_iterator = NULL ;
617
593
node -> initialized = false;
618
- node -> shared_prefetch_iterator = NULL ;
619
594
node -> pvmbuffer = InvalidBuffer ;
620
595
node -> recheck = true;
596
+ /* Only used for serial BHS */
621
597
node -> blockno = InvalidBlockNumber ;
622
598
node -> prefetch_blockno = InvalidBlockNumber ;
599
+ node -> prefetch_pages = 0 ;
600
+ node -> prefetch_target = -1 ;
623
601
624
602
ExecScanReScan (& node -> ss );
625
603
@@ -678,33 +656,23 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
678
656
/*
679
657
* End iteration on iterators saved in scan descriptor.
680
658
*/
681
- if (scanDesc -> st .bitmap .rs_shared_iterator )
682
- {
683
- tbm_end_shared_iterate (scanDesc -> st .bitmap .rs_shared_iterator );
684
- scanDesc -> st .bitmap .rs_shared_iterator = NULL ;
685
- }
686
-
687
- if (scanDesc -> st .bitmap .rs_iterator )
688
- {
689
- tbm_end_private_iterate (scanDesc -> st .bitmap .rs_iterator );
690
- scanDesc -> st .bitmap .rs_iterator = NULL ;
691
- }
659
+ tbm_end_iterate (& scanDesc -> st .rs_tbmiterator );
692
660
693
661
/*
694
662
* close table scan
695
663
*/
696
664
table_endscan (scanDesc );
697
665
}
698
666
667
+ /* If we did not already clean up the prefetch iterator, do so now. */
668
+ if (!tbm_exhausted (& node -> prefetch_iterator ))
669
+ tbm_end_iterate (& node -> prefetch_iterator );
670
+
699
671
/*
700
672
* release bitmaps and buffers if any
701
673
*/
702
- if (node -> prefetch_iterator )
703
- tbm_end_private_iterate (node -> prefetch_iterator );
704
674
if (node -> tbm )
705
675
tbm_free (node -> tbm );
706
- if (node -> shared_prefetch_iterator )
707
- tbm_end_shared_iterate (node -> shared_prefetch_iterator );
708
676
if (node -> pvmbuffer != InvalidBuffer )
709
677
ReleaseBuffer (node -> pvmbuffer );
710
678
}
@@ -744,11 +712,9 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
744
712
/* Zero the statistics counters */
745
713
memset (& scanstate -> stats , 0 , sizeof (BitmapHeapScanInstrumentation ));
746
714
747
- scanstate -> prefetch_iterator = NULL ;
748
715
scanstate -> prefetch_pages = 0 ;
749
- scanstate -> prefetch_target = 0 ;
716
+ scanstate -> prefetch_target = -1 ;
750
717
scanstate -> initialized = false;
751
- scanstate -> shared_prefetch_iterator = NULL ;
752
718
scanstate -> pstate = NULL ;
753
719
scanstate -> recheck = true;
754
720
scanstate -> blockno = InvalidBlockNumber ;
@@ -907,7 +873,7 @@ ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node,
907
873
/* Initialize the mutex */
908
874
SpinLockInit (& pstate -> mutex );
909
875
pstate -> prefetch_pages = 0 ;
910
- pstate -> prefetch_target = 0 ;
876
+ pstate -> prefetch_target = -1 ;
911
877
pstate -> state = BM_INITIAL ;
912
878
913
879
ConditionVariableInit (& pstate -> cv );
@@ -944,6 +910,8 @@ ExecBitmapHeapReInitializeDSM(BitmapHeapScanState *node,
944
910
return ;
945
911
946
912
pstate -> state = BM_INITIAL ;
913
+ pstate -> prefetch_pages = 0 ;
914
+ pstate -> prefetch_target = -1 ;
947
915
948
916
if (DsaPointerIsValid (pstate -> tbmiterator ))
949
917
tbm_free_shared_area (dsa , pstate -> tbmiterator );
0 commit comments