1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * procarray.h |
4 | * POSTGRES process array definitions. |
5 | * |
6 | * |
7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
8 | * Portions Copyright (c) 1994, Regents of the University of California |
9 | * |
10 | * src/include/storage/procarray.h |
11 | * |
12 | *------------------------------------------------------------------------- |
13 | */ |
14 | #ifndef PROCARRAY_H |
15 | #define PROCARRAY_H |
16 | |
17 | #include "storage/lock.h" |
18 | #include "storage/standby.h" |
19 | #include "utils/relcache.h" |
20 | #include "utils/snapshot.h" |
21 | |
22 | |
23 | /* |
24 | * These are to implement PROCARRAY_FLAGS_XXX |
25 | * |
26 | * Note: These flags are cloned from PROC_XXX flags in src/include/storage/proc.h |
27 | * to avoid forcing to include proc.h when including procarray.h. So if you modify |
28 | * PROC_XXX flags, you need to modify these flags. |
29 | */ |
30 | #define PROCARRAY_VACUUM_FLAG 0x02 /* currently running lazy |
31 | * vacuum */ |
32 | #define PROCARRAY_ANALYZE_FLAG 0x04 /* currently running |
33 | * analyze */ |
34 | #define PROCARRAY_LOGICAL_DECODING_FLAG 0x10 /* currently doing logical |
35 | * decoding outside xact */ |
36 | |
37 | #define PROCARRAY_SLOTS_XMIN 0x20 /* replication slot xmin, |
38 | * catalog_xmin */ |
39 | /* |
40 | * Only flags in PROCARRAY_PROC_FLAGS_MASK are considered when matching |
41 | * PGXACT->vacuumFlags. Other flags are used for different purposes and |
42 | * have no corresponding PROC flag equivalent. |
43 | */ |
44 | #define PROCARRAY_PROC_FLAGS_MASK (PROCARRAY_VACUUM_FLAG | \ |
45 | PROCARRAY_ANALYZE_FLAG | \ |
46 | PROCARRAY_LOGICAL_DECODING_FLAG) |
47 | |
48 | /* Use the following flags as an input "flags" to GetOldestXmin function */ |
49 | /* Consider all backends except for logical decoding ones which manage xmin separately */ |
50 | #define PROCARRAY_FLAGS_DEFAULT PROCARRAY_LOGICAL_DECODING_FLAG |
51 | /* Ignore vacuum backends */ |
52 | #define PROCARRAY_FLAGS_VACUUM PROCARRAY_FLAGS_DEFAULT | PROCARRAY_VACUUM_FLAG |
53 | /* Ignore analyze backends */ |
54 | #define PROCARRAY_FLAGS_ANALYZE PROCARRAY_FLAGS_DEFAULT | PROCARRAY_ANALYZE_FLAG |
55 | /* Ignore both vacuum and analyze backends */ |
56 | #define PROCARRAY_FLAGS_VACUUM_ANALYZE PROCARRAY_FLAGS_DEFAULT | PROCARRAY_VACUUM_FLAG | PROCARRAY_ANALYZE_FLAG |
57 | |
58 | extern Size ProcArrayShmemSize(void); |
59 | extern void CreateSharedProcArray(void); |
60 | extern void ProcArrayAdd(PGPROC *proc); |
61 | extern void ProcArrayRemove(PGPROC *proc, TransactionId latestXid); |
62 | |
63 | extern void ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid); |
64 | extern void ProcArrayClearTransaction(PGPROC *proc); |
65 | |
66 | extern void ProcArrayInitRecovery(TransactionId initializedUptoXID); |
67 | extern void ProcArrayApplyRecoveryInfo(RunningTransactions running); |
68 | extern void ProcArrayApplyXidAssignment(TransactionId topxid, |
69 | int nsubxids, TransactionId *subxids); |
70 | |
71 | extern void RecordKnownAssignedTransactionIds(TransactionId xid); |
72 | extern void ExpireTreeKnownAssignedTransactionIds(TransactionId xid, |
73 | int nsubxids, TransactionId *subxids, |
74 | TransactionId max_xid); |
75 | extern void ExpireAllKnownAssignedTransactionIds(void); |
76 | extern void ExpireOldKnownAssignedTransactionIds(TransactionId xid); |
77 | |
78 | extern int GetMaxSnapshotXidCount(void); |
79 | extern int GetMaxSnapshotSubxidCount(void); |
80 | |
81 | extern Snapshot GetSnapshotData(Snapshot snapshot); |
82 | |
83 | extern bool ProcArrayInstallImportedXmin(TransactionId xmin, |
84 | VirtualTransactionId *sourcevxid); |
85 | extern bool ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc); |
86 | |
87 | extern RunningTransactions GetRunningTransactionData(void); |
88 | |
89 | extern bool TransactionIdIsInProgress(TransactionId xid); |
90 | extern bool TransactionIdIsActive(TransactionId xid); |
91 | extern TransactionId GetOldestXmin(Relation rel, int flags); |
92 | extern TransactionId GetOldestActiveTransactionId(void); |
93 | extern TransactionId GetOldestSafeDecodingTransactionId(bool catalogOnly); |
94 | |
95 | extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids); |
96 | extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids); |
97 | |
98 | extern PGPROC *BackendPidGetProc(int pid); |
99 | extern PGPROC *BackendPidGetProcWithLock(int pid); |
100 | extern int BackendXidGetPid(TransactionId xid); |
101 | extern bool IsBackendPid(int pid); |
102 | |
103 | extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin, |
104 | bool excludeXmin0, bool allDbs, int excludeVacuum, |
105 | int *nvxids); |
106 | extern VirtualTransactionId *GetConflictingVirtualXIDs(TransactionId limitXmin, Oid dbOid); |
107 | extern pid_t CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode); |
108 | |
109 | extern bool MinimumActiveBackends(int min); |
110 | extern int CountDBBackends(Oid databaseid); |
111 | extern int CountDBConnections(Oid databaseid); |
112 | extern void CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending); |
113 | extern int CountUserBackends(Oid roleid); |
114 | extern bool CountOtherDBBackends(Oid databaseId, |
115 | int *nbackends, int *nprepared); |
116 | |
117 | extern void XidCacheRemoveRunningXids(TransactionId xid, |
118 | int nxids, const TransactionId *xids, |
119 | TransactionId latestXid); |
120 | |
121 | extern void ProcArraySetReplicationSlotXmin(TransactionId xmin, |
122 | TransactionId catalog_xmin, bool already_locked); |
123 | |
124 | extern void ProcArrayGetReplicationSlotXmin(TransactionId *xmin, |
125 | TransactionId *catalog_xmin); |
126 | |
127 | #endif /* PROCARRAY_H */ |
128 | |