mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 02:46:57 +02:00
9d4649ca49
Backpatch-through: certain files through 9.3
132 lines
4.4 KiB
C
132 lines
4.4 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* snapshot.h
|
|
* POSTGRES snapshot definition
|
|
*
|
|
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/utils/snapshot.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef SNAPSHOT_H
|
|
#define SNAPSHOT_H
|
|
|
|
#include "access/htup.h"
|
|
#include "access/xlogdefs.h"
|
|
#include "datatype/timestamp.h"
|
|
#include "lib/pairingheap.h"
|
|
#include "storage/buf.h"
|
|
|
|
|
|
typedef struct SnapshotData *Snapshot;
|
|
|
|
#define InvalidSnapshot ((Snapshot) NULL)
|
|
|
|
/*
|
|
* We use SnapshotData structures to represent both "regular" (MVCC)
|
|
* snapshots and "special" snapshots that have non-MVCC semantics.
|
|
* The specific semantics of a snapshot are encoded by the "satisfies"
|
|
* function.
|
|
*/
|
|
typedef bool (*SnapshotSatisfiesFunc) (HeapTuple htup,
|
|
Snapshot snapshot, Buffer buffer);
|
|
|
|
/*
|
|
* 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
|
|
{
|
|
SnapshotSatisfiesFunc satisfies; /* tuple test function */
|
|
|
|
/*
|
|
* The remaining fields are used only for MVCC snapshots, and are normally
|
|
* just zeroes in special snapshots. (But xmin and xmax are used
|
|
* specially by HeapTupleSatisfiesDirty, and xmin is used specially by
|
|
* HeapTupleSatisfiesNonVacuumable.)
|
|
*
|
|
* An MVCC snapshot can never see the effects of XIDs >= xmax. It can see
|
|
* the effects of all older XIDs except those listed in the snapshot. xmin
|
|
* is stored as an optimization to avoid needing to search the XID arrays
|
|
* for most tuples.
|
|
*/
|
|
TransactionId xmin; /* all XID < xmin are visible to me */
|
|
TransactionId xmax; /* all XID >= xmax are invisible to me */
|
|
|
|
/*
|
|
* For normal MVCC snapshot this contains the all xact IDs that are in
|
|
* progress, unless the snapshot was taken during recovery in which case
|
|
* it's empty. For historic MVCC snapshots, the meaning is inverted, i.e.
|
|
* it contains *committed* transactions between xmin and xmax.
|
|
*
|
|
* note: all ids in xip[] satisfy xmin <= xip[i] < xmax
|
|
*/
|
|
TransactionId *xip;
|
|
uint32 xcnt; /* # of xact ids in xip[] */
|
|
|
|
/*
|
|
* For non-historic MVCC snapshots, this contains subxact IDs that are in
|
|
* progress (and other transactions that are in progress if taken during
|
|
* recovery). For historic snapshot it contains *all* xids assigned to the
|
|
* replayed transaction, including the toplevel xid.
|
|
*
|
|
* note: all ids in subxip[] are >= xmin, but we don't bother filtering
|
|
* out any that are >= xmax
|
|
*/
|
|
TransactionId *subxip;
|
|
int32 subxcnt; /* # of xact ids in subxip[] */
|
|
bool suboverflowed; /* has the subxip array overflowed? */
|
|
|
|
bool takenDuringRecovery; /* recovery-shaped snapshot? */
|
|
bool copied; /* false if it's a static snapshot */
|
|
|
|
CommandId curcid; /* in my xact, CID < curcid are visible */
|
|
|
|
/*
|
|
* An extra return value for HeapTupleSatisfiesDirty, not used in MVCC
|
|
* snapshots.
|
|
*/
|
|
uint32 speculativeToken;
|
|
|
|
/*
|
|
* Book-keeping information, used by the snapshot manager
|
|
*/
|
|
uint32 active_count; /* refcount on ActiveSnapshot stack */
|
|
uint32 regd_count; /* refcount on RegisteredSnapshots */
|
|
pairingheap_node ph_node; /* link in the RegisteredSnapshots heap */
|
|
|
|
TimestampTz whenTaken; /* timestamp when snapshot was taken */
|
|
XLogRecPtr lsn; /* position in the WAL stream when taken */
|
|
} SnapshotData;
|
|
|
|
/*
|
|
* Result codes for HeapTupleSatisfiesUpdate. This should really be in
|
|
* tqual.h, but we want to avoid including that file elsewhere.
|
|
*/
|
|
typedef enum
|
|
{
|
|
HeapTupleMayBeUpdated,
|
|
HeapTupleInvisible,
|
|
HeapTupleSelfUpdated,
|
|
HeapTupleUpdated,
|
|
HeapTupleBeingUpdated,
|
|
HeapTupleWouldBlock /* can be returned by heap_tuple_lock */
|
|
} HTSU_Result;
|
|
|
|
#endif /* SNAPSHOT_H */
|