Files
openGauss-server/src/include/utils/snapmgr.h
2022-11-07 22:04:18 +08:00

122 lines
5.2 KiB
C

/* -------------------------------------------------------------------------
*
* snapmgr.h
* openGauss snapshot manager
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/utils/snapmgr.h
*
* -------------------------------------------------------------------------
*/
#ifndef SNAPMGR_H
#define SNAPMGR_H
#include "utils/resowner.h"
#include "utils/snapshot.h"
#include "access/transam.h"
/* Static variables representing various special snapshot semantics */
extern THR_LOCAL PGDLLIMPORT SnapshotData SnapshotNowData;
extern THR_LOCAL PGDLLIMPORT SnapshotData SnapshotSelfData;
extern THR_LOCAL PGDLLIMPORT SnapshotData SnapshotAnyData;
extern THR_LOCAL PGDLLIMPORT SnapshotData SnapshotToastData;
#ifdef ENABLE_MULTIPLE_NODES
extern THR_LOCAL PGDLLIMPORT SnapshotData SnapshotNowNoSyncData;
#endif
#define SnapshotNow (&SnapshotNowData)
#ifdef ENABLE_MULTIPLE_NODES
#define SnapshotNowNoSync (&SnapshotNowNoSyncData)
#endif
#define SnapshotSelf (&SnapshotSelfData)
#define SnapshotAny (&SnapshotAnyData)
#define SnapshotToast (&SnapshotToastData)
#ifdef USE_ASSERT_CHECKING
#define LatestTransactionStatusError(xid, snapshot, action) PrintCurrentSnapshotInfo(PANIC, xid, snapshot, action)
#else
#define LatestTransactionStatusError(xid, snapshot, action) PrintCurrentSnapshotInfo(ERROR, xid, snapshot, action)
#endif
extern bool XidVisibleInSnapshot(TransactionId xid, Snapshot snapshot, TransactionIdStatus *hintstatus,
Buffer buffer, bool *sync);
extern bool UHeapXidVisibleInSnapshot(TransactionId xid, Snapshot snapshot, TransactionIdStatus *hintstatus,
Buffer buffer, bool *sync);
extern bool XidVisibleInDecodeSnapshot(TransactionId xid, Snapshot snapshot,
TransactionIdStatus* hintstatus, Buffer buffer);
extern bool CommittedXidVisibleInSnapshot(TransactionId xid, Snapshot snapshot, Buffer buffer);
extern bool CommittedXidVisibleInDecodeSnapshot(TransactionId xid, Snapshot snapshot, Buffer buffer);
extern bool IsXidVisibleInGtmLiteLocalSnapshot(TransactionId xid, Snapshot snapshot, TransactionIdStatus hint_status,
bool xmin_equal_xmax, Buffer buffer, bool *sync);
extern void RecheckXidFinish(TransactionId xid, CommitSeqNo csn);
/*
* We don't provide a static SnapshotDirty variable because it would be
* non-reentrant. Instead, users of that snapshot type should declare a
* local variable of type SnapshotData, and initialize it with this macro.
*/
#define InitDirtySnapshot(snapshotdata) ((snapshotdata).satisfies = SNAPSHOT_DIRTY)
#define IsVersionMVCCSnapshot(snapshot) \
(((snapshot)->satisfies) == SNAPSHOT_VERSION_MVCC || \
((snapshot)->satisfies) == SNAPSHOT_DELTA || \
((snapshot)->satisfies) == SNAPSHOT_LOST)
/* This macro encodes the knowledge of which snapshots are MVCC-safe */
#define IsMVCCSnapshot(snapshot) \
((((snapshot)->satisfies) == SNAPSHOT_MVCC) || (((snapshot)->satisfies) == SNAPSHOT_HISTORIC_MVCC) || \
(((snapshot)->satisfies) == SNAPSHOT_DECODE_MVCC) || IsVersionMVCCSnapshot(snapshot))
extern Snapshot GetTransactionSnapshot(bool force_local_snapshot = false);
extern Snapshot GetLatestSnapshot(void);
extern Snapshot GetCatalogSnapshot();
extern void SnapshotSetCommandId(CommandId curcid);
extern void PushActiveSnapshot(Snapshot snapshot);
extern void PushCopiedSnapshot(Snapshot snapshot);
extern void UpdateActiveSnapshotCommandId(void);
extern void PopActiveSnapshot(void);
extern Snapshot GetActiveSnapshot(void);
extern bool ActiveSnapshotSet(void);
extern void FreeSnapshotDeepForce(Snapshot snap);
extern Snapshot RegisterSnapshot(Snapshot snapshot);
extern void UnregisterSnapshot(Snapshot snapshot);
extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner);
extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner);
extern void RegisterStreamSnapshots();
extern void ForgetRegisterStreamSnapshots();
extern void UnRegisterStreamSnapshots();
extern void AtSubCommit_Snapshot(int level);
extern void AtSubAbort_Snapshot(int level);
extern void AtEOXact_Snapshot(bool isCommit);
extern Datum pg_export_snapshot(PG_FUNCTION_ARGS);
extern void ImportSnapshot(const char* idstr);
extern bool XactHasExportedSnapshots(void);
extern void DeleteAllExportedSnapshotFiles(void);
extern void StreamTxnContextSaveSnapmgr(void* stc);
extern void StreamTxnContextRestoreSnapmgr(const void* stc);
extern void StreamTxnContextSetSnapShot(void* snapshotPtr);
extern bool ThereAreNoPriorRegisteredSnapshots(void);
extern Snapshot PgFdwCopySnapshot(Snapshot snapshot);
extern char* ExportSnapshot(Snapshot snapshot, CommitSeqNo *snapshotcsn);
extern Snapshot CopySnapshotByCurrentMcxt(Snapshot snapshot);
/* Support for catalog timetravel for logical decoding */
struct HTAB;
extern struct HTAB* HistoricSnapshotGetTupleCids(void);
extern void SetupHistoricSnapshot(Snapshot snapshot_now, struct HTAB* tuplecids);
extern void TeardownHistoricSnapshot(bool is_error);
extern bool HistoricSnapshotActive(void);
extern void SetTransactionSnapshot(Snapshot sourcesnap, VirtualTransactionId *sourcevxid, ThreadId sourcepid);
#endif /* SNAPMGR_H */