From 34b92db816f87fb06d8eff3c07e60c81b322e44d Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 31 Mar 2025 19:54:39 +0300 Subject: [PATCH v6 05/12] Make RestoreSnapshot register the snapshot with current resowner This simplifies the next commit --- src/backend/access/index/indexam.c | 1 - src/backend/access/table/tableam.c | 1 - src/backend/access/transam/parallel.c | 4 ++++ src/backend/utils/time/snapmgr.c | 8 +++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index 769170a37d5..8f0ae02221c 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -592,7 +592,6 @@ index_beginscan_parallel(Relation heaprel, Relation indexrel, Assert(RelFileLocatorEquals(indexrel->rd_locator, pscan->ps_indexlocator)); snapshot = (Snapshot) RestoreSnapshot(pscan->ps_snapshot_data); - snapshot = RegisterSnapshot(snapshot); scan = index_beginscan_internal(indexrel, nkeys, norderbys, snapshot, pscan, true); diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 4eb81e40d99..fc823cf84e5 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -175,7 +175,6 @@ table_beginscan_parallel(Relation relation, ParallelTableScanDesc pscan) { /* Snapshot was serialized -- restore it */ snapshot = (Snapshot) RestoreSnapshot((char *) pscan + pscan->phs_snapshot_off); - snapshot = RegisterSnapshot(snapshot); flags |= SO_TEMP_SNAPSHOT; } else diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 8046e14abf7..e13ea57efff 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -1499,6 +1499,10 @@ ParallelWorkerMain(Datum main_arg) fps->parallel_leader_pgproc); PushActiveSnapshot(asnapshot); + UnregisterSnapshot(asnapshot); + if (tsnapshot != asnapshot) + UnregisterSnapshot(tsnapshot); + /* * We've changed which tuples we can see, and must therefore invalidate * system caches. diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index ea1e7d17b04..ef579128d3f 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -1823,7 +1823,7 @@ SerializeSnapshot(MVCCSnapshot snapshot, char *start_address) * Restore a serialized snapshot from the specified address. * * The copy is palloc'd in TopTransactionContext and has initial refcounts set - * to 0. The returned snapshot has the copied flag set. + * to 0. The returned snapshot is registered with the current resource owner. */ MVCCSnapshot RestoreSnapshot(char *start_address) @@ -1880,6 +1880,12 @@ RestoreSnapshot(char *start_address) snapshot->copied = true; snapshot->valid = true; + /* and tell resowner.c about it, just like RegisterSnapshot() */ + ResourceOwnerEnlarge(CurrentResourceOwner); + snapshot->regd_count++; + ResourceOwnerRememberSnapshot(CurrentResourceOwner, (Snapshot) snapshot); + pairingheap_add(&RegisteredSnapshots, &snapshot->ph_node); + return snapshot; } -- 2.39.5