PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
snapshot.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * snapshot.h
4  * POSTGRES snapshot definition
5  *
6  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * src/include/utils/snapshot.h
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef SNAPSHOT_H
14 #define SNAPSHOT_H
15 
16 #include "access/htup.h"
17 #include "access/xlogdefs.h"
18 #include "datatype/timestamp.h"
19 #include "lib/pairingheap.h"
20 #include "storage/buf.h"
21 
22 
23 typedef struct SnapshotData *Snapshot;
24 
25 #define InvalidSnapshot ((Snapshot) NULL)
26 
27 /*
28  * We use SnapshotData structures to represent both "regular" (MVCC)
29  * snapshots and "special" snapshots that have non-MVCC semantics.
30  * The specific semantics of a snapshot are encoded by the "satisfies"
31  * function.
32  */
34  Snapshot snapshot, Buffer buffer);
35 
36 /*
37  * Struct representing all kind of possible snapshots.
38  *
39  * There are several different kinds of snapshots:
40  * * Normal MVCC snapshots
41  * * MVCC snapshots taken during recovery (in Hot-Standby mode)
42  * * Historic MVCC snapshots used during logical decoding
43  * * snapshots passed to HeapTupleSatisfiesDirty()
44  * * snapshots used for SatisfiesAny, Toast, Self where no members are
45  * accessed.
46  *
47  * TODO: It's probably a good idea to split this struct using a NodeTag
48  * similar to how parser and executor nodes are handled, with one type for
49  * each different kind of snapshot to avoid overloading the meaning of
50  * individual fields.
51  */
52 typedef struct SnapshotData
53 {
54  SnapshotSatisfiesFunc satisfies; /* tuple test function */
55 
56  /*
57  * The remaining fields are used only for MVCC snapshots, and are normally
58  * just zeroes in special snapshots. (But xmin and xmax are used
59  * specially by HeapTupleSatisfiesDirty.)
60  *
61  * An MVCC snapshot can never see the effects of XIDs >= xmax. It can see
62  * the effects of all older XIDs except those listed in the snapshot. xmin
63  * is stored as an optimization to avoid needing to search the XID arrays
64  * for most tuples.
65  */
66  TransactionId xmin; /* all XID < xmin are visible to me */
67  TransactionId xmax; /* all XID >= xmax are invisible to me */
68 
69  /*
70  * For normal MVCC snapshot this contains the all xact IDs that are in
71  * progress, unless the snapshot was taken during recovery in which case
72  * it's empty. For historic MVCC snapshots, the meaning is inverted, i.e.
73  * it contains *committed* transactions between xmin and xmax.
74  *
75  * note: all ids in xip[] satisfy xmin <= xip[i] < xmax
76  */
78  uint32 xcnt; /* # of xact ids in xip[] */
79 
80  /*
81  * For non-historic MVCC snapshots, this contains subxact IDs that are in
82  * progress (and other transactions that are in progress if taken during
83  * recovery). For historic snapshot it contains *all* xids assigned to the
84  * replayed transaction, including the toplevel xid.
85  *
86  * note: all ids in subxip[] are >= xmin, but we don't bother filtering
87  * out any that are >= xmax
88  */
90  int32 subxcnt; /* # of xact ids in subxip[] */
91  bool suboverflowed; /* has the subxip array overflowed? */
92 
93  bool takenDuringRecovery; /* recovery-shaped snapshot? */
94  bool copied; /* false if it's a static snapshot */
95 
96  CommandId curcid; /* in my xact, CID < curcid are visible */
97 
98  /*
99  * An extra return value for HeapTupleSatisfiesDirty, not used in MVCC
100  * snapshots.
101  */
103 
104  /*
105  * Book-keeping information, used by the snapshot manager
106  */
107  uint32 active_count; /* refcount on ActiveSnapshot stack */
108  uint32 regd_count; /* refcount on RegisteredSnapshots */
109  pairingheap_node ph_node; /* link in the RegisteredSnapshots heap */
110 
111  TimestampTz whenTaken; /* timestamp when snapshot was taken */
112  XLogRecPtr lsn; /* position in the WAL stream when taken */
113 } SnapshotData;
114 
115 /*
116  * Result codes for HeapTupleSatisfiesUpdate. This should really be in
117  * tqual.h, but we want to avoid including that file elsewhere.
118  */
119 typedef enum
120 {
126  HeapTupleWouldBlock /* can be returned by heap_tuple_lock */
127 } HTSU_Result;
128 
129 #endif /* SNAPSHOT_H */
uint32 CommandId
Definition: c.h:411
SnapshotSatisfiesFunc satisfies
Definition: snapshot.h:54
uint32 TransactionId
Definition: c.h:397
bool copied
Definition: snapshot.h:94
int64 TimestampTz
Definition: timestamp.h:39
XLogRecPtr lsn
Definition: snapshot.h:112
bool suboverflowed
Definition: snapshot.h:91
struct SnapshotData * Snapshot
Definition: snapshot.h:23
uint32 regd_count
Definition: snapshot.h:108
char bool
Definition: c.h:202
signed int int32
Definition: c.h:256
struct SnapshotData SnapshotData
HTSU_Result
Definition: snapshot.h:119
unsigned int uint32
Definition: c.h:268
TransactionId xmax
Definition: snapshot.h:67
TransactionId xmin
Definition: snapshot.h:66
TransactionId * xip
Definition: snapshot.h:77
CommandId curcid
Definition: snapshot.h:96
pairingheap_node ph_node
Definition: snapshot.h:109
uint32 speculativeToken
Definition: snapshot.h:102
uint64 XLogRecPtr
Definition: xlogdefs.h:21
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:207
bool takenDuringRecovery
Definition: snapshot.h:93
uint32 xcnt
Definition: snapshot.h:78
bool(* SnapshotSatisfiesFunc)(HeapTuple htup, Snapshot snapshot, Buffer buffer)
Definition: snapshot.h:33
TimestampTz whenTaken
Definition: snapshot.h:111
int Buffer
Definition: buf.h:23
TransactionId * subxip
Definition: snapshot.h:89
uint32 active_count
Definition: snapshot.h:107
int32 subxcnt
Definition: snapshot.h:90