aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-09-20 16:37:55 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2024-09-20 16:37:55 -0400
commit54562c9cfa2281b6303cdea1aff9596c4a5de4b2 (patch)
tree2586f1fb924f5c473421501e4e188b307581e2b2 /src/backend
parentafb03e2ebf595c057db0372f543f9f796effaadf (diff)
downloadpostgresql-54562c9cfa2281b6303cdea1aff9596c4a5de4b2.tar.gz
postgresql-54562c9cfa2281b6303cdea1aff9596c4a5de4b2.zip
Improve Asserts checking relation matching in parallel scans.
table_beginscan_parallel and index_beginscan_parallel contain Asserts checking that the relation a worker will use in a parallel scan is the same one the leader intended. However, they were checking for relation OID match, which was not strong enough to detect the mismatch problem fixed in 126ec0bc7. What would be strong enough is to compare relfilenodes instead. Arguably, that's a saner definition anyway, since a scan surely operates on a physical relation not a logical one. Hence, store and compare RelFileLocators not relation OIDs. Also ensure that index_beginscan_parallel checks the index identity not just the table identity. Discussion: https://postgr.es/m/2127254.1726789524@sss.pgh.pa.us
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/index/indexam.c8
-rw-r--r--src/backend/access/table/tableam.c4
2 files changed, 7 insertions, 5 deletions
diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index dcd04b813d8..1859be614c0 100644
--- a/src/backend/access/index/indexam.c
+++ b/src/backend/access/index/indexam.c
@@ -500,8 +500,8 @@ index_parallelscan_initialize(Relation heapRelation, Relation indexRelation,
EstimateSnapshotSpace(snapshot));
offset = MAXALIGN(offset);
- target->ps_relid = RelationGetRelid(heapRelation);
- target->ps_indexid = RelationGetRelid(indexRelation);
+ target->ps_locator = heapRelation->rd_locator;
+ target->ps_indexlocator = indexRelation->rd_locator;
target->ps_offset = offset;
SerializeSnapshot(snapshot, target->ps_snapshot_data);
@@ -544,7 +544,9 @@ index_beginscan_parallel(Relation heaprel, Relation indexrel, int nkeys,
Snapshot snapshot;
IndexScanDesc scan;
- Assert(RelationGetRelid(heaprel) == pscan->ps_relid);
+ Assert(RelFileLocatorEquals(heaprel->rd_locator, pscan->ps_locator));
+ Assert(RelFileLocatorEquals(indexrel->rd_locator, pscan->ps_indexlocator));
+
snapshot = RestoreSnapshot(pscan->ps_snapshot_data);
RegisterSnapshot(snapshot);
scan = index_beginscan_internal(indexrel, nkeys, norderbys, snapshot,
diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c
index e57a0b7ea31..bd8715b6797 100644
--- a/src/backend/access/table/tableam.c
+++ b/src/backend/access/table/tableam.c
@@ -168,7 +168,7 @@ table_beginscan_parallel(Relation relation, ParallelTableScanDesc pscan)
uint32 flags = SO_TYPE_SEQSCAN |
SO_ALLOW_STRAT | SO_ALLOW_SYNC | SO_ALLOW_PAGEMODE;
- Assert(RelationGetRelid(relation) == pscan->phs_relid);
+ Assert(RelFileLocatorEquals(relation->rd_locator, pscan->phs_locator));
if (!pscan->phs_snapshot_any)
{
@@ -389,7 +389,7 @@ table_block_parallelscan_initialize(Relation rel, ParallelTableScanDesc pscan)
{
ParallelBlockTableScanDesc bpscan = (ParallelBlockTableScanDesc) pscan;
- bpscan->base.phs_relid = RelationGetRelid(rel);
+ bpscan->base.phs_locator = rel->rd_locator;
bpscan->phs_nblocks = RelationGetNumberOfBlocks(rel);
/* compare phs_syncscan initialization to similar logic in initscan */
bpscan->base.phs_syncscan = synchronize_seqscans &&