Thread
-
[PATCH v9 3/3] fix the incorrect call to scan_set_tidrange()
Cary Huang <cary.huang@highgo.ca> — 2025-08-13T21:26:56Z
--- src/backend/access/heap/heapam.c | 5 ---- src/backend/access/table/tableam.c | 7 ++++- src/backend/executor/nodeTidrangescan.c | 37 +++++++++++++++++++++---- src/include/access/tableam.h | 4 ++- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index d0e650de57..46f5df2ec4 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -492,11 +492,6 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk scan->rs_numblocks = numBlks; /* set the limits in the ParallelBlockTableScanDesc, when present */ - - /* - * XXX no lock is being taken here. What guarantees are there that there - * isn't some worker using the old limits when the new limits are imposed? - */ if (scan->rs_base.rs_parallel != NULL) { ParallelBlockTableScanDesc bpscan; diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 8036654c77..01ca264ba4 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -189,7 +189,8 @@ table_beginscan_parallel(Relation relation, ParallelTableScanDesc pscan) } TableScanDesc -table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan) +table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan, + ItemPointerData * mintid, ItemPointerData * maxtid) { Snapshot snapshot; uint32 flags = SO_TYPE_TIDRANGESCAN | SO_ALLOW_PAGEMODE; @@ -216,6 +217,10 @@ table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan sscan = relation->rd_tableam->scan_begin(relation, snapshot, 0, NULL, pscan, flags); + /* Set the TID range if needed */ + if (mintid && maxtid) + relation->rd_tableam->scan_set_tidrange(sscan, mintid, maxtid); + return sscan; } diff --git a/src/backend/executor/nodeTidrangescan.c b/src/backend/executor/nodeTidrangescan.c index afa47b01de..eef44e9d78 100644 --- a/src/backend/executor/nodeTidrangescan.c +++ b/src/backend/executor/nodeTidrangescan.c @@ -250,9 +250,13 @@ TidRangeNext(TidRangeScanState *node) } else { - /* rescan with the updated TID range */ - table_rescan_tidrange(scandesc, &node->trss_mintid, - &node->trss_maxtid); + /* rescan with the updated TID range only in non-parallel mode */ + if (scandesc->rs_parallel == NULL) + { + /* rescan with the updated TID range */ + table_rescan_tidrange(scandesc, &node->trss_mintid, + &node->trss_maxtid); + } } node->trss_inScan = true; @@ -446,8 +450,19 @@ ExecTidRangeScanInitializeDSM(TidRangeScanState *node, ParallelContext *pcxt) pscan, estate->es_snapshot); shm_toc_insert(pcxt->toc, node->ss.ps.plan->plan_node_id, pscan); - node->ss.ss_currentScanDesc = - table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan); + + /* + * Initialize parallel scan descriptor with given TID range if it can be + * evaluated successfully. + */ + if (TidRangeEval(node)) + node->ss.ss_currentScanDesc = + table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan, + &node->trss_mintid, &node->trss_maxtid); + else + node->ss.ss_currentScanDesc = + table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan, + NULL, NULL); } /* ---------------------------------------------------------------- @@ -465,6 +480,11 @@ ExecTidRangeScanReInitializeDSM(TidRangeScanState *node, pscan = node->ss.ss_currentScanDesc->rs_parallel; table_parallelscan_reinitialize(node->ss.ss_currentRelation, pscan); + /* Set the new TID range if it can be evaluated successfully */ + if (TidRangeEval(node)) + node->ss.ss_currentRelation->rd_tableam->scan_set_tidrange( + node->ss.ss_currentScanDesc, &node->trss_mintid, + &node->trss_maxtid); } /* ---------------------------------------------------------------- @@ -480,6 +500,11 @@ ExecTidRangeScanInitializeWorker(TidRangeScanState *node, ParallelTableScanDesc pscan; pscan = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false); + + /* + * As a worker, there is no need to set TID range as it has already been set + * by the leader and available in shared memory. + */ node->ss.ss_currentScanDesc = - table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan); + table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan, NULL, NULL); } diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 0f46a47c2e..99596d6258 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -1133,7 +1133,9 @@ extern TableScanDesc table_beginscan_parallel(Relation relation, * Caller must hold a suitable lock on the relation. */ extern TableScanDesc table_beginscan_parallel_tidrange(Relation relation, - ParallelTableScanDesc pscan); + ParallelTableScanDesc pscan, + ItemPointerData * mintid, + ItemPointerData * maxtid); /* * Restart a parallel scan. Call this in the leader process. Caller is -- 2.17.1 ------=_Part_1501398_1464885575.1755122586177 Content-Type: application/octet-stream; name=v9-0001-v7-parallel-TID-range-scan-patch.patch Content-Transfer-Encoding: 7bit X-ZM_AttachId: 139744153861870000 Content-Disposition: attachment; filename=v9-0001-v7-parallel-TID-range-scan-patch.patch