0003-Add-comment-with-more-details-on-active-snapshots.patch
text/x-patch
Filename: 0003-Add-comment-with-more-details-on-active-snapshots.patch
Type: text/x-patch
Part: 2
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0003
Subject: Add comment with more details on active snapshots
| File | + | − |
|---|---|---|
| src/backend/utils/time/snapmgr.c | 55 | 0 |
From 0d56ca03b2f290ab8e38e775e8d0b19631233ea0 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas <heikki.linnakangas@iki.fi> Date: Wed, 11 Dec 2024 14:22:54 +0200 Subject: [PATCH 3/5] Add comment with more details on active snapshots --- src/backend/utils/time/snapmgr.c | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index 3c408762728..05f16666192 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -3,11 +3,66 @@ * snapmgr.c * PostgreSQL snapshot manager * + * The following functions return a snapshot that can be used in visibility + * checks: + * + * - GetTransactionSnapshot + * - GetLatestSnapshot + * - GetCatalogSnapshot + * - GetNonHistoricCatalogSnapshot + * + * All of these functions return a reference to a statically allocated + * snapshot, which must be copied and registered by calling + * PushActiveSnapshot() or RegisterSnapshot() before use. + * + * In addition to the above, there are some special snapshots, like + * SnapshotSelf, SnapshotAny, and "dirty" snapshots. + * * We keep track of snapshots in two ways: those "registered" by resowner.c, * and the "active snapshot" stack. All snapshots in either of them live in * persistent memory. When a snapshot is no longer in any of these lists * (tracked by separate refcounts on each snapshot), its memory can be freed. * + * ActiveSnapshot stack + * -------------------- + * + * Most visibility checks use the current "active snapshot". When running + * normal queries, the active snapshot is set when query execution begins, + * depending on transaction isolation level. + * + * The active snapshot is tracked in a stack, so that the currently active one + * is at the top of the stack. It mirrors the process call stack: whenever we + * recurse or switch context to fetch rows from a different portal for + * example, the appropriate snapshot is pushed to become the active snapshot, + * and popped on return. Once upon a time, ActiveSnapshot was just a global + * variable that was saved and restored similar to CurrentMemoryContext, but + * nowadays it's managed as a separate data structure so that we can keep + * track of which snapshots are in use and reset MyProc->xmin when there is no + * active snapshot. + * + * However, there are a couple of exceptions where the active snapshot stack + * does not strictly mirror the call stack: + * + * - VACUUM and a few other utility commands manage their own transactions, + * which take their own snapshots. They are called with an active snapshot + * set, like most utility commands, but they pop the active snapshot that + * was pushed by the caller. PortalRunUtility knows about the possibility + * that the snapshot it pushed is no longer active on return. + * + * - When COMMIT or ROLLBACK is executed within a procedure or DO-block, the + * active snapshot stack is destroyed, and re-established later when + * subsequent statements in the procedure are executed. There are many + * limitations on when in-procedure COMMIT/ROLLBACK is allowed; one such + * limitation is that all the snapshots on the active snapshot stack are + * known to portals that are being executed, which makes it safe to reset + * the stack. See EnsurePortalSnapshotExists(). + * + * Registered snapshots + * -------------------- + * + * In addition to snapshots pushed to the active snapshot stack, a snapshot + * can be registered with a resource owner. + * * The FirstXactSnapshot, if any, is treated a bit specially: we increment its * regd_count and list it in RegisteredSnapshots, but this reference is not * tracked by a resource owner. We used to use the TopTransactionResourceOwner -- 2.39.5