Re: A few patches to clarify snapshot management
Heikki Linnakangas <hlinnaka@iki.fi>
From: Heikki Linnakangas <hlinnaka@iki.fi>
To: Nathan Bossart <nathandbossart@gmail.com>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2025-03-13T15:27:39Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Use ereport() rather than elog()
- 661f821ef0c3 19 (unreleased) landed
-
Revert GetTransactionSnapshot() to return historic snapshot during LR
- 27f20441c5e7 18.0 landed
- 50f770c3d92c 19 (unreleased) landed
-
Improve snapmgr.c comment
- 043745c3a01f 18.0 landed
-
Assert that a snapshot is active or registered before it's used
- 8076c00592e4 18.0 landed
-
Don't allow GetTransactionSnapshot() in logical decoding
- 1585ff7387db 18.0 landed
-
Remove unnecessary GetTransactionSnapshot() calls
- 952365cded63 18.0 landed
-
snapshot scalability: Don't compute global horizons while building snapshots.
- dc7420c2c927 14.0 cited
Attachments
- v2-0001-Split-SnapshotData-into-separate-structs-for-each.patch (text/x-patch) patch v2-0001
- v2-0002-Simplify-historic-snapshot-refcounting.patch (text/x-patch) patch v2-0002
On 06/01/2025 23:30, Heikki Linnakangas wrote: > On 20/12/2024 19:31, Heikki Linnakangas wrote: >>> /* >>> * Struct representing all kind of possible snapshots. >>> * >>> * There are several different kinds of snapshots: >>> * * Normal MVCC snapshots >>> * * MVCC snapshots taken during recovery (in Hot-Standby mode) >>> * * Historic MVCC snapshots used during logical decoding >>> * * snapshots passed to HeapTupleSatisfiesDirty() >>> * * snapshots passed to HeapTupleSatisfiesNonVacuumable() >>> * * snapshots used for SatisfiesAny, Toast, Self where no members are >>> * accessed. >>> * >>> * TODO: It's probably a good idea to split this struct using a NodeTag >>> * similar to how parser and executor nodes are handled, with one >>> type for >>> * each different kind of snapshot to avoid overloading the meaning of >>> * individual fields. >>> */ >>> typedef struct SnapshotData >> >> I'm thinking of implementing that TODO, splitting SnapshotData into >> separate structs like MVCCSnapshotData, SnapshotDirtyData, etc. It >> seems to me most places can assume that you're dealing with MVCC >> snapshots, and if we had separate types for them, could be using >> MVCCSnapshot instead of the generic Snapshot. Only the table and index >> AM functions need to deal with non-MVCC snapshots. > > Here's a draft of that. Going through this exercise clarified a few > things to me that I didn't realize before: > > - The executor only deals with MVCC snapshots. Special snapshots are > only for the lower-level AM interfaces. > - Only MVCC snapshots can be pushed to the active stack > - Only MVCC or historic MVCC snapshots can be registered with a resource > owner I committed the patches adding comments on Tuesday. Here's an updated version of the patch to split SnapshotData into different structs. The second, new patch simplifies the historic snapshot reference counting during logical decoding. It's in principle independent from the first patch, but it was hard to see how the opportunity before splitting the structs. -- Heikki Linnakangas Neon (https://neon.tech)