Age Owner TLA Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * snapmgr.h 4 : * POSTGRES snapshot manager 5 : * 6 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group 7 : * Portions Copyright (c) 1994, Regents of the University of California 8 : * 9 : * src/include/utils/snapmgr.h 10 : * 11 : *------------------------------------------------------------------------- 12 : */ 13 : #ifndef SNAPMGR_H 14 : #define SNAPMGR_H 15 : 16 : #include "access/transam.h" 17 : #include "utils/relcache.h" 18 : #include "utils/resowner.h" 19 : #include "utils/snapshot.h" 20 : 21 : 22 : /* 23 : * The structure used to map times to TransactionId values for the "snapshot 24 : * too old" feature must have a few entries at the tail to hold old values; 25 : * otherwise the lookup will often fail and the expected early pruning or 26 : * vacuum will not usually occur. It is best if this padding is for a number 27 : * of minutes greater than a thread would normally be stalled, but it's OK if 28 : * early vacuum opportunities are occasionally missed, so there's no need to 29 : * use an extreme value or get too fancy. 10 minutes seems plenty. 30 : */ 31 : #define OLD_SNAPSHOT_PADDING_ENTRIES 10 32 : #define OLD_SNAPSHOT_TIME_MAP_ENTRIES (old_snapshot_threshold + OLD_SNAPSHOT_PADDING_ENTRIES) 33 : 34 : /* 35 : * Common definition of relation properties that allow early pruning/vacuuming 36 : * when old_snapshot_threshold >= 0. 37 : */ 38 : #define RelationAllowsEarlyPruning(rel) \ 39 : ( \ 40 : RelationIsPermanent(rel) && !IsCatalogRelation(rel) \ 41 : && !RelationIsAccessibleInLogicalDecoding(rel) \ 42 : ) 43 : 44 : #define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) 45 : 46 : /* GUC variables */ 47 : extern PGDLLIMPORT int old_snapshot_threshold; 48 : 49 : 50 : extern Size SnapMgrShmemSize(void); 51 : extern void SnapMgrInit(void); 52 : extern TimestampTz GetSnapshotCurrentTimestamp(void); 53 : extern TimestampTz GetOldSnapshotThresholdTimestamp(void); 54 : extern void SnapshotTooOldMagicForTest(void); 55 : 56 : extern PGDLLIMPORT bool FirstSnapshotSet; 57 : 58 : extern PGDLLIMPORT TransactionId TransactionXmin; 59 : extern PGDLLIMPORT TransactionId RecentXmin; 60 : 61 : /* Variables representing various special snapshot semantics */ 62 : extern PGDLLIMPORT SnapshotData SnapshotSelfData; 63 : extern PGDLLIMPORT SnapshotData SnapshotAnyData; 64 : extern PGDLLIMPORT SnapshotData CatalogSnapshotData; 65 : 66 : #define SnapshotSelf (&SnapshotSelfData) 67 : #define SnapshotAny (&SnapshotAnyData) 68 : 69 : /* 70 : * We don't provide a static SnapshotDirty variable because it would be 71 : * non-reentrant. Instead, users of that snapshot type should declare a 72 : * local variable of type SnapshotData, and initialize it with this macro. 73 : */ 74 : #define InitDirtySnapshot(snapshotdata) \ 75 : ((snapshotdata).snapshot_type = SNAPSHOT_DIRTY) 76 : 77 : /* 78 : * Similarly, some initialization is required for a NonVacuumable snapshot. 79 : * The caller must supply the visibility cutoff state to use (c.f. 80 : * GlobalVisTestFor()). 81 : */ 82 : #define InitNonVacuumableSnapshot(snapshotdata, vistestp) \ 83 : ((snapshotdata).snapshot_type = SNAPSHOT_NON_VACUUMABLE, \ 84 : (snapshotdata).vistest = (vistestp)) 85 : 86 : /* 87 : * Similarly, some initialization is required for SnapshotToast. We need 88 : * to set lsn and whenTaken correctly to support snapshot_too_old. 89 : */ 90 : #define InitToastSnapshot(snapshotdata, l, w) \ 91 : ((snapshotdata).snapshot_type = SNAPSHOT_TOAST, \ 92 : (snapshotdata).lsn = (l), \ 93 : (snapshotdata).whenTaken = (w)) 94 : 95 : /* This macro encodes the knowledge of which snapshots are MVCC-safe */ 96 : #define IsMVCCSnapshot(snapshot) \ 97 : ((snapshot)->snapshot_type == SNAPSHOT_MVCC || \ 98 : (snapshot)->snapshot_type == SNAPSHOT_HISTORIC_MVCC) 99 : 100 : #ifndef FRONTEND 101 : static inline bool 970 andres 102 CBC 9384962 : OldSnapshotThresholdActive(void) 103 : { 104 9384962 : return old_snapshot_threshold >= 0; 105 : } 106 : #endif 107 : 108 : extern Snapshot GetTransactionSnapshot(void); 109 : extern Snapshot GetLatestSnapshot(void); 110 : extern void SnapshotSetCommandId(CommandId curcid); 111 : extern Snapshot GetOldestSnapshot(void); 112 : 113 : extern Snapshot GetCatalogSnapshot(Oid relid); 114 : extern Snapshot GetNonHistoricCatalogSnapshot(Oid relid); 115 : extern void InvalidateCatalogSnapshot(void); 116 : extern void InvalidateCatalogSnapshotConditionally(void); 117 : 118 : extern void PushActiveSnapshot(Snapshot snapshot); 119 : extern void PushActiveSnapshotWithLevel(Snapshot snapshot, int snap_level); 120 : extern void PushCopiedSnapshot(Snapshot snapshot); 121 : extern void UpdateActiveSnapshotCommandId(void); 122 : extern void PopActiveSnapshot(void); 123 : extern Snapshot GetActiveSnapshot(void); 124 : extern bool ActiveSnapshotSet(void); 125 : 126 : extern Snapshot RegisterSnapshot(Snapshot snapshot); 127 : extern void UnregisterSnapshot(Snapshot snapshot); 128 : extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner); 129 : extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner); 130 : 131 : extern void AtSubCommit_Snapshot(int level); 132 : extern void AtSubAbort_Snapshot(int level); 133 : extern void AtEOXact_Snapshot(bool isCommit, bool resetXmin); 134 : 135 : extern void ImportSnapshot(const char *idstr); 136 : extern bool XactHasExportedSnapshots(void); 137 : extern void DeleteAllExportedSnapshotFiles(void); 138 : extern void WaitForOlderSnapshots(TransactionId limitXmin, bool progress); 139 : extern bool ThereAreNoPriorRegisteredSnapshots(void); 140 : extern bool HaveRegisteredOrActiveSnapshot(void); 141 : extern bool TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, 142 : Relation relation, 143 : TransactionId *limit_xid, 144 : TimestampTz *limit_ts); 145 : extern void SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit); 146 : extern void MaintainOldSnapshotTimeMapping(TimestampTz whenTaken, 147 : TransactionId xmin); 148 : 149 : extern char *ExportSnapshot(Snapshot snapshot); 150 : 151 : /* 152 : * These live in procarray.c because they're intimately linked to the 153 : * procarray contents, but thematically they better fit into snapmgr.h. 154 : */ 155 : typedef struct GlobalVisState GlobalVisState; 156 : extern GlobalVisState *GlobalVisTestFor(Relation rel); 157 : extern bool GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid); 158 : extern bool GlobalVisTestIsRemovableFullXid(GlobalVisState *state, FullTransactionId fxid); 159 : extern FullTransactionId GlobalVisTestNonRemovableFullHorizon(GlobalVisState *state); 160 : extern TransactionId GlobalVisTestNonRemovableHorizon(GlobalVisState *state); 161 : extern bool GlobalVisCheckRemovableXid(Relation rel, TransactionId xid); 162 : extern bool GlobalVisCheckRemovableFullXid(Relation rel, FullTransactionId fxid); 163 : 164 : /* 165 : * Utility functions for implementing visibility routines in table AMs. 166 : */ 167 : extern bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot); 168 : 169 : /* Support for catalog timetravel for logical decoding */ 170 : struct HTAB; 171 : extern struct HTAB *HistoricSnapshotGetTupleCids(void); 172 : extern void SetupHistoricSnapshot(Snapshot historic_snapshot, struct HTAB *tuplecids); 173 : extern void TeardownHistoricSnapshot(bool is_error); 174 : extern bool HistoricSnapshotActive(void); 175 : 176 : extern Size EstimateSnapshotSpace(Snapshot snapshot); 177 : extern void SerializeSnapshot(Snapshot snapshot, char *start_address); 178 : extern Snapshot RestoreSnapshot(char *start_address); 179 : extern void RestoreTransactionSnapshot(Snapshot snapshot, void *source_pgproc); 180 : 181 : #endif /* SNAPMGR_H */