1 /*------------------------------------------------------------------------- 2 * 3 * snapmgr.h 4 * POSTGRES snapshot manager 5 * 6 * Portions Copyright (c) 1996-2020, 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 (rel)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT \ 41 && !IsCatalogRelation(rel) \ 42 && !RelationIsAccessibleInLogicalDecoding(rel) \ 43 ) 44 45 #define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) 46 47 /* GUC variables */ 48 extern PGDLLIMPORT int old_snapshot_threshold; 49 50 51 extern Size SnapMgrShmemSize(void); 52 extern void SnapMgrInit(void); 53 extern TimestampTz GetSnapshotCurrentTimestamp(void); 54 extern TimestampTz GetOldSnapshotThresholdTimestamp(void); 55 56 extern bool FirstSnapshotSet; 57 58 extern PGDLLIMPORT TransactionId TransactionXmin; 59 extern PGDLLIMPORT TransactionId RecentXmin; 60 extern PGDLLIMPORT TransactionId RecentGlobalXmin; 61 extern PGDLLIMPORT TransactionId RecentGlobalDataXmin; 62 63 /* Variables representing various special snapshot semantics */ 64 extern PGDLLIMPORT SnapshotData SnapshotSelfData; 65 extern PGDLLIMPORT SnapshotData SnapshotAnyData; 66 extern PGDLLIMPORT SnapshotData CatalogSnapshotData; 67 68 #define SnapshotSelf (&SnapshotSelfData) 69 #define SnapshotAny (&SnapshotAnyData) 70 71 /* 72 * We don't provide a static SnapshotDirty variable because it would be 73 * non-reentrant. Instead, users of that snapshot type should declare a 74 * local variable of type SnapshotData, and initialize it with this macro. 75 */ 76 #define InitDirtySnapshot(snapshotdata) \ 77 ((snapshotdata).snapshot_type = SNAPSHOT_DIRTY) 78 79 /* 80 * Similarly, some initialization is required for a NonVacuumable snapshot. 81 * The caller must supply the xmin horizon to use (e.g., RecentGlobalXmin). 82 */ 83 #define InitNonVacuumableSnapshot(snapshotdata, xmin_horizon) \ 84 ((snapshotdata).snapshot_type = SNAPSHOT_NON_VACUUMABLE, \ 85 (snapshotdata).xmin = (xmin_horizon)) 86 87 /* 88 * Similarly, some initialization is required for SnapshotToast. We need 89 * to set lsn and whenTaken correctly to support snapshot_too_old. 90 */ 91 #define InitToastSnapshot(snapshotdata, l, w) \ 92 ((snapshotdata).snapshot_type = SNAPSHOT_TOAST, \ 93 (snapshotdata).lsn = (l), \ 94 (snapshotdata).whenTaken = (w)) 95 96 /* This macro encodes the knowledge of which snapshots are MVCC-safe */ 97 #define IsMVCCSnapshot(snapshot) \ 98 ((snapshot)->snapshot_type == SNAPSHOT_MVCC || \ 99 (snapshot)->snapshot_type == SNAPSHOT_HISTORIC_MVCC) 100 101 102 extern Snapshot GetTransactionSnapshot(void); 103 extern Snapshot GetLatestSnapshot(void); 104 extern void SnapshotSetCommandId(CommandId curcid); 105 extern Snapshot GetOldestSnapshot(void); 106 107 extern Snapshot GetCatalogSnapshot(Oid relid); 108 extern Snapshot GetNonHistoricCatalogSnapshot(Oid relid); 109 extern void InvalidateCatalogSnapshot(void); 110 extern void InvalidateCatalogSnapshotConditionally(void); 111 112 extern void PushActiveSnapshot(Snapshot snapshot); 113 extern void PushActiveSnapshotWithLevel(Snapshot snapshot, int snap_level); 114 extern void PushCopiedSnapshot(Snapshot snapshot); 115 extern void UpdateActiveSnapshotCommandId(void); 116 extern void PopActiveSnapshot(void); 117 extern Snapshot GetActiveSnapshot(void); 118 extern bool ActiveSnapshotSet(void); 119 120 extern Snapshot RegisterSnapshot(Snapshot snapshot); 121 extern void UnregisterSnapshot(Snapshot snapshot); 122 extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner); 123 extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner); 124 125 extern FullTransactionId GetFullRecentGlobalXmin(void); 126 127 extern void AtSubCommit_Snapshot(int level); 128 extern void AtSubAbort_Snapshot(int level); 129 extern void AtEOXact_Snapshot(bool isCommit, bool resetXmin); 130 131 extern void ImportSnapshot(const char *idstr); 132 extern bool XactHasExportedSnapshots(void); 133 extern void DeleteAllExportedSnapshotFiles(void); 134 extern bool ThereAreNoPriorRegisteredSnapshots(void); 135 extern TransactionId TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, 136 Relation relation); 137 extern void MaintainOldSnapshotTimeMapping(TimestampTz whenTaken, 138 TransactionId xmin); 139 140 extern char *ExportSnapshot(Snapshot snapshot); 141 142 /* 143 * Utility functions for implementing visibility routines in table AMs. 144 */ 145 extern bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot); 146 147 /* Support for catalog timetravel for logical decoding */ 148 struct HTAB; 149 extern struct HTAB *HistoricSnapshotGetTupleCids(void); 150 extern void SetupHistoricSnapshot(Snapshot snapshot_now, struct HTAB *tuplecids); 151 extern void TeardownHistoricSnapshot(bool is_error); 152 extern bool HistoricSnapshotActive(void); 153 154 extern Size EstimateSnapshotSpace(Snapshot snapshot); 155 extern void SerializeSnapshot(Snapshot snapshot, char *start_address); 156 extern Snapshot RestoreSnapshot(char *start_address); 157 extern void RestoreTransactionSnapshot(Snapshot snapshot, void *master_pgproc); 158 159 #endif /* SNAPMGR_H */ 160