From 44a0be6f76f6dc9587fb5fa18ec0be3c27712f94 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Thu, 7 Nov 2024 14:09:47 -0500 Subject: [PATCH v1] Fix confusion with nbtree parallel scan currPos state. --- src/backend/access/nbtree/nbtsearch.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 1608dd49d..70996a7fd 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -2224,6 +2224,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, { Relation rel = scan->indexRelation; BTScanOpaque so = (BTScanOpaque) scan->opaque; + bool seized = true; Assert(so->currPos.currPage == lastcurrblkno || scan->parallel_scan != NULL); Assert(!BTScanPosIsPinned(so->currPos)); @@ -2254,6 +2255,15 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, Assert(!so->needPrimScan); + /* parallel scan must never use so->currPos blkno */ + if (!seized && scan->parallel_scan != NULL && + !_bt_parallel_seize(scan, &blkno, &lastcurrblkno, false)) + { + BTScanPosInvalidate(so->currPos); + return false; + } + seized = false; + if (ScanDirectionIsForward(dir)) { /* read blkno, but check for interrupts first */ @@ -2308,14 +2318,6 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, /* no matching tuples on this page */ _bt_relbuf(rel, so->currPos.buf); - - /* parallel scan seizes another page (won't use so->currPos blkno) */ - if (scan->parallel_scan != NULL && - !_bt_parallel_seize(scan, &blkno, &lastcurrblkno, false)) - { - BTScanPosInvalidate(so->currPos); - return false; - } } /* -- 2.45.2