LCOV - code coverage report
Current view: top level - src/include/utils - snapmgr.h (source / functions) Hit Total Coverage
Test: PostgreSQL 15devel Lines: 2 2 100.0 %
Date: 2021-12-09 03:08:47 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  * snapmgr.h
       4             :  *    POSTGRES snapshot manager
       5             :  *
       6             :  * Portions Copyright (c) 1996-2021, 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 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             : static inline bool
     101    12366470 : OldSnapshotThresholdActive(void)
     102             : {
     103    12366470 :     return old_snapshot_threshold >= 0;
     104             : }
     105             : 
     106             : extern Snapshot GetTransactionSnapshot(void);
     107             : extern Snapshot GetLatestSnapshot(void);
     108             : extern void SnapshotSetCommandId(CommandId curcid);
     109             : extern Snapshot GetOldestSnapshot(void);
     110             : 
     111             : extern Snapshot GetCatalogSnapshot(Oid relid);
     112             : extern Snapshot GetNonHistoricCatalogSnapshot(Oid relid);
     113             : extern void InvalidateCatalogSnapshot(void);
     114             : extern void InvalidateCatalogSnapshotConditionally(void);
     115             : 
     116             : extern void PushActiveSnapshot(Snapshot snapshot);
     117             : extern void PushActiveSnapshotWithLevel(Snapshot snapshot, int snap_level);
     118             : extern void PushCopiedSnapshot(Snapshot snapshot);
     119             : extern void UpdateActiveSnapshotCommandId(void);
     120             : extern void PopActiveSnapshot(void);
     121             : extern Snapshot GetActiveSnapshot(void);
     122             : extern bool ActiveSnapshotSet(void);
     123             : 
     124             : extern Snapshot RegisterSnapshot(Snapshot snapshot);
     125             : extern void UnregisterSnapshot(Snapshot snapshot);
     126             : extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner);
     127             : extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner);
     128             : 
     129             : extern void AtSubCommit_Snapshot(int level);
     130             : extern void AtSubAbort_Snapshot(int level);
     131             : extern void AtEOXact_Snapshot(bool isCommit, bool resetXmin);
     132             : 
     133             : extern void ImportSnapshot(const char *idstr);
     134             : extern bool XactHasExportedSnapshots(void);
     135             : extern void DeleteAllExportedSnapshotFiles(void);
     136             : extern void WaitForOlderSnapshots(TransactionId limitXmin, bool progress);
     137             : extern bool ThereAreNoPriorRegisteredSnapshots(void);
     138             : extern bool TransactionIdLimitedForOldSnapshots(TransactionId recentXmin,
     139             :                                                 Relation relation,
     140             :                                                 TransactionId *limit_xid,
     141             :                                                 TimestampTz *limit_ts);
     142             : extern void SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit);
     143             : extern void MaintainOldSnapshotTimeMapping(TimestampTz whenTaken,
     144             :                                            TransactionId xmin);
     145             : 
     146             : extern char *ExportSnapshot(Snapshot snapshot);
     147             : 
     148             : /*
     149             :  * These live in procarray.c because they're intimately linked to the
     150             :  * procarray contents, but thematically they better fit into snapmgr.h.
     151             :  */
     152             : typedef struct GlobalVisState GlobalVisState;
     153             : extern GlobalVisState *GlobalVisTestFor(Relation rel);
     154             : extern bool GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid);
     155             : extern bool GlobalVisTestIsRemovableFullXid(GlobalVisState *state, FullTransactionId fxid);
     156             : extern FullTransactionId GlobalVisTestNonRemovableFullHorizon(GlobalVisState *state);
     157             : extern TransactionId GlobalVisTestNonRemovableHorizon(GlobalVisState *state);
     158             : extern bool GlobalVisCheckRemovableXid(Relation rel, TransactionId xid);
     159             : extern bool GlobalVisCheckRemovableFullXid(Relation rel, FullTransactionId fxid);
     160             : 
     161             : /*
     162             :  * Utility functions for implementing visibility routines in table AMs.
     163             :  */
     164             : extern bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot);
     165             : 
     166             : /* Support for catalog timetravel for logical decoding */
     167             : struct HTAB;
     168             : extern struct HTAB *HistoricSnapshotGetTupleCids(void);
     169             : extern void SetupHistoricSnapshot(Snapshot snapshot_now, struct HTAB *tuplecids);
     170             : extern void TeardownHistoricSnapshot(bool is_error);
     171             : extern bool HistoricSnapshotActive(void);
     172             : 
     173             : extern Size EstimateSnapshotSpace(Snapshot snapshot);
     174             : extern void SerializeSnapshot(Snapshot snapshot, char *start_address);
     175             : extern Snapshot RestoreSnapshot(char *start_address);
     176             : extern void RestoreTransactionSnapshot(Snapshot snapshot, void *source_pgproc);
     177             : 
     178             : #endif                          /* SNAPMGR_H */

Generated by: LCOV version 1.14