Skip to content

Commit 428a99b

Browse files
nbtree: Simplify _bt_first parallel scan handling.
This new structure relieves _bt_first from having separate calls to _bt_start_array_keys for the serial case and parallel case. This saves code, and seems clearer. Follow-up to work from commits 4e6e375 and b5ee4e5. Author: Peter Geoghegan <pg@bowt.ie> Reviewed-By: Matthias van de Meent <boekewurm+postgres@gmail.com> Discussion: https://postgr.es/m/CAH2-Wz=XjUZjBjHJdhTvuH5MwoJObWGoM2RG2LyFg5WUdWyk=A@mail.gmail.com
1 parent 2f8b400 commit 428a99b

File tree

1 file changed

+34
-46
lines changed

1 file changed

+34
-46
lines changed

src/backend/access/nbtree/nbtsearch.c

Lines changed: 34 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,8 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
890890
ScanKeyData notnullkeys[INDEX_MAX_KEYS];
891891
int keysz = 0;
892892
StrategyNumber strat_total;
893+
BlockNumber blkno = InvalidBlockNumber,
894+
lastcurrblkno;
893895

894896
Assert(!BTScanPosIsValid(so->currPos));
895897

@@ -905,64 +907,42 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
905907
*/
906908
if (!so->qual_ok)
907909
{
910+
Assert(!so->needPrimScan);
908911
_bt_parallel_done(scan);
909912
return false;
910913
}
911914

912915
/*
913-
* For parallel scans, get the starting page from shared state. If the
914-
* scan has not started, proceed to find out first leaf page in the usual
915-
* way while keeping other participating processes waiting. If the scan
916-
* has already begun, use the page number from the shared structure.
917-
*
918-
* When a parallel scan has another primitive index scan scheduled, a
919-
* parallel worker will seize the scan for that purpose now. This is
920-
* similar to the case where the top-level scan hasn't started.
916+
* If this is a parallel scan, we must seize the scan. _bt_readfirstpage
917+
* will likely release the parallel scan later on.
921918
*/
922-
if (scan->parallel_scan != NULL)
923-
{
924-
BlockNumber blkno,
925-
lastcurrblkno;
919+
if (scan->parallel_scan != NULL &&
920+
!_bt_parallel_seize(scan, &blkno, &lastcurrblkno, true))
921+
return false;
926922

927-
if (!_bt_parallel_seize(scan, &blkno, &lastcurrblkno, true))
928-
return false;
923+
/*
924+
* Initialize the scan's arrays (if any) for the current scan direction
925+
* (except when they were already set to later values as part of
926+
* scheduling the primitive index scan that is now underway)
927+
*/
928+
if (so->numArrayKeys && !so->needPrimScan)
929+
_bt_start_array_keys(scan, dir);
929930

931+
if (blkno != InvalidBlockNumber)
932+
{
930933
/*
931-
* Successfully seized the scan, which _bt_readfirstpage or possibly
932-
* _bt_readnextpage will release (unless the scan ends right away, in
933-
* which case we'll call _bt_parallel_done directly).
934-
*
935-
* Initialize arrays (when _bt_parallel_seize didn't already set up
936-
* the next primitive index scan).
934+
* We anticipated calling _bt_search, but another worker bet us to it.
935+
* _bt_readnextpage releases the scan for us (not _bt_readfirstpage).
937936
*/
938-
if (so->numArrayKeys && !so->needPrimScan)
939-
_bt_start_array_keys(scan, dir);
940-
937+
Assert(scan->parallel_scan != NULL);
938+
Assert(!so->needPrimScan);
941939
Assert(blkno != P_NONE);
942-
if (blkno != InvalidBlockNumber)
943-
{
944-
Assert(!so->needPrimScan);
945940

946-
/*
947-
* We anticipated starting another primitive scan, but some other
948-
* worker bet us to it
949-
*/
950-
if (!_bt_readnextpage(scan, blkno, lastcurrblkno, dir, true))
951-
return false;
941+
if (!_bt_readnextpage(scan, blkno, lastcurrblkno, dir, true))
942+
return false;
952943

953-
_bt_returnitem(scan, so);
954-
return true;
955-
}
956-
}
957-
else if (so->numArrayKeys && !so->needPrimScan)
958-
{
959-
/*
960-
* First _bt_first call (for current btrescan) without parallelism.
961-
*
962-
* Initialize arrays, and the corresponding scan keys that were just
963-
* output by _bt_preprocess_keys.
964-
*/
965-
_bt_start_array_keys(scan, dir);
944+
_bt_returnitem(scan, so);
945+
return true;
966946
}
967947

968948
/*
@@ -1090,7 +1070,12 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
10901070
break;
10911071
startKeys[keysz++] = chosen;
10921072

1093-
/* Quit if we have stored a > or < key */
1073+
/*
1074+
* We can only consider adding more boundary keys when the one
1075+
* that we just chose to add uses either the = or >= strategy
1076+
* (during backwards scans we can only do so when the key that
1077+
* we just added to startKeys[] uses the = or <= strategy)
1078+
*/
10941079
strat_total = chosen->sk_strategy;
10951080
if (strat_total == BTGreaterStrategyNumber ||
10961081
strat_total == BTLessStrategyNumber)
@@ -1190,6 +1175,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
11901175
Assert(subkey->sk_flags & SK_ROW_MEMBER);
11911176
if (subkey->sk_flags & SK_ISNULL)
11921177
{
1178+
Assert(!so->needPrimScan);
11931179
_bt_parallel_done(scan);
11941180
return false;
11951181
}
@@ -1408,6 +1394,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
14081394

14091395
if (!BufferIsValid(so->currPos.buf))
14101396
{
1397+
Assert(!so->needPrimScan);
14111398
_bt_parallel_done(scan);
14121399
return false;
14131400
}
@@ -2553,6 +2540,7 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir)
25532540
OffsetNumber start;
25542541

25552542
Assert(!BTScanPosIsValid(so->currPos));
2543+
Assert(!so->needPrimScan);
25562544

25572545
/*
25582546
* Scan down to the leftmost or rightmost leaf page. This is a simplified

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy