1 /*------------------------------------------------------------------------- 2 * 3 * snapmgr.h 4 * POSTGRES snapshot manager 5 * 6 * Portions Copyright (c) 1996-2016, 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 "fmgr.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 RelationNeedsWAL(rel) \ 41 && !IsCatalogRelation(rel) \ 42 && !RelationIsAccessibleInLogicalDecoding(rel) \ 43 && !RelationHasUnloggedIndex(rel) \ 44 ) 45 46 #define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) 47 48 /* GUC variables */ 49 extern PGDLLIMPORT int old_snapshot_threshold; 50 51 52 extern Size SnapMgrShmemSize(void); 53 extern void SnapMgrInit(void); 54 extern int64 GetSnapshotCurrentTimestamp(void); 55 extern int64 GetOldSnapshotThresholdTimestamp(void); 56 57 extern bool FirstSnapshotSet; 58 59 extern PGDLLIMPORT TransactionId TransactionXmin; 60 extern PGDLLIMPORT TransactionId RecentXmin; 61 extern PGDLLIMPORT TransactionId RecentGlobalXmin; 62 extern PGDLLIMPORT TransactionId RecentGlobalDataXmin; 63 64 extern Snapshot GetTransactionSnapshot(void); 65 extern Snapshot GetLatestSnapshot(void); 66 extern void SnapshotSetCommandId(CommandId curcid); 67 extern Snapshot GetOldestSnapshot(void); 68 69 extern Snapshot GetCatalogSnapshot(Oid relid); 70 extern Snapshot GetNonHistoricCatalogSnapshot(Oid relid); 71 extern void InvalidateCatalogSnapshot(void); 72 extern void InvalidateCatalogSnapshotConditionally(void); 73 74 extern void PushActiveSnapshot(Snapshot snapshot); 75 extern void PushCopiedSnapshot(Snapshot snapshot); 76 extern void UpdateActiveSnapshotCommandId(void); 77 extern void PopActiveSnapshot(void); 78 extern Snapshot GetActiveSnapshot(void); 79 extern bool ActiveSnapshotSet(void); 80 81 extern Snapshot RegisterSnapshot(Snapshot snapshot); 82 extern void UnregisterSnapshot(Snapshot snapshot); 83 extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner); 84 extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner); 85 86 extern void AtSubCommit_Snapshot(int level); 87 extern void AtSubAbort_Snapshot(int level); 88 extern void AtEOXact_Snapshot(bool isCommit); 89 90 extern Datum pg_export_snapshot(PG_FUNCTION_ARGS); 91 extern void ImportSnapshot(const char *idstr); 92 extern bool XactHasExportedSnapshots(void); 93 extern void DeleteAllExportedSnapshotFiles(void); 94 extern bool ThereAreNoPriorRegisteredSnapshots(void); 95 extern TransactionId TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, 96 Relation relation); 97 extern void MaintainOldSnapshotTimeMapping(int64 whenTaken, TransactionId xmin); 98 99 extern char *ExportSnapshot(Snapshot snapshot); 100 101 /* Support for catalog timetravel for logical decoding */ 102 struct HTAB; 103 extern struct HTAB *HistoricSnapshotGetTupleCids(void); 104 extern void SetupHistoricSnapshot(Snapshot snapshot_now, struct HTAB *tuplecids); 105 extern void TeardownHistoricSnapshot(bool is_error); 106 extern bool HistoricSnapshotActive(void); 107 108 extern Size EstimateSnapshotSpace(Snapshot snapshot); 109 extern void SerializeSnapshot(Snapshot snapshot, char *start_address); 110 extern Snapshot RestoreSnapshot(char *start_address); 111 extern void RestoreTransactionSnapshot(Snapshot snapshot, void *master_pgproc); 112 113 #endif /* SNAPMGR_H */ 114