PostgreSQL Source Code git master
Loading...
Searching...
No Matches
standby.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * standby.h
4 * Definitions for hot standby mode.
5 *
6 *
7 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/storage/standby.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef STANDBY_H
15#define STANDBY_H
16
17#include "datatype/timestamp.h"
18#include "storage/locktag.h"
20#include "storage/standbydefs.h"
21
22typedef struct PGPROC PGPROC;
24
25/* User-settable GUC parameters */
29
30/* Recovery conflict reasons */
31typedef enum
32{
33 /* Backend is connected to a database that is being dropped */
35
36 /* Backend is using a tablespace that is being dropped */
38
39 /* Backend is holding a lock that is blocking recovery */
41
42 /* Backend is holding a snapshot that is blocking recovery */
44
45 /* Backend is using a logical replication slot that must be invalidated */
47
48 /* Backend is holding a pin on a buffer that is blocking recovery */
50
51 /*
52 * The backend is requested to check for deadlocks. The startup process
53 * doesn't check for deadlock directly, because we want to kill one of the
54 * other backends instead of the startup process.
55 */
57
58 /*
59 * Like RECOVERY_CONFLICT_STARTUP_DEADLOCK is, but the suspected deadlock
60 * involves a buffer pin that some other backend is holding. That needs
61 * special checking because the normal deadlock detector doesn't track the
62 * buffer pins.
63 */
66
67#define NUM_RECOVERY_CONFLICT_REASONS (RECOVERY_CONFLICT_BUFFERPIN_DEADLOCK + 1)
68
71
72extern void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon,
73 bool isCatalogRel,
74 RelFileLocator locator);
75extern void ResolveRecoveryConflictWithSnapshotFullXid(FullTransactionId snapshotConflictHorizon,
76 bool isCatalogRel,
77 RelFileLocator locator);
80
83extern void CheckRecoveryConflictDeadlock(void);
84extern void StandbyDeadLockHandler(void);
85extern void StandbyTimeoutHandler(void);
86extern void StandbyLockTimeoutHandler(void);
89 bool still_waiting);
90
91/*
92 * Standby Rmgr (RM_STANDBY_ID)
93 *
94 * Standby recovery manager exists to perform actions that are required
95 * to make hot standby work. That includes logging AccessExclusiveLocks taken
96 * by transactions and running-xacts snapshots.
97 */
98extern void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid);
100 int nsubxids, TransactionId *subxids);
101extern void StandbyReleaseAllLocks(void);
103
104#define MinSizeOfXactRunningXacts offsetof(xl_running_xacts, xids)
105
106
107/*
108 * Declarations for GetRunningTransactionData(). Similar to Snapshots, but
109 * not quite. This has nothing at all to do with visibility on this server,
110 * so this is completely separate from snapmgr.c and snapmgr.h.
111 * This data is important for creating the initial snapshot state on a
112 * standby server. We need lots more information than a normal snapshot,
113 * hence we use a specific data structure for our needs. This data
114 * is written to WAL as a separate record immediately after each
115 * checkpoint. That means that wherever we start a standby from we will
116 * almost immediately see the data we need to begin executing queries.
117 */
118
119typedef enum
120{
121 SUBXIDS_IN_ARRAY, /* xids array includes all running subxids */
122 SUBXIDS_MISSING, /* snapshot overflowed, subxids are missing */
123 SUBXIDS_IN_SUBTRANS, /* subxids are not included in 'xids', but
124 * pg_subtrans is fully up-to-date */
126
128{
129 Oid dbid; /* only track xacts in this database */
130 int xcnt; /* # of xact ids in xids[] */
131 int subxcnt; /* # of subxact ids in xids[] */
133 TransactionId nextXid; /* xid from TransamVariables->nextXid */
134 TransactionId oldestRunningXid; /* *not* oldestXmin */
135 TransactionId oldestDatabaseRunningXid; /* same as above, but within the
136 * current database */
137 TransactionId latestCompletedXid; /* so we can set xmax */
138
139 TransactionId *xids; /* array of (sub)xids still running */
141
143
144extern void LogAccessExclusiveLock(Oid dbOid, Oid relOid);
145extern void LogAccessExclusiveLockPrepare(void);
146
148extern void LogStandbyInvalidations(int nmsgs, SharedInvalidationMessage *msgs,
149 bool relcacheInitFileInval);
150
151#endif /* STANDBY_H */
Datum now(PG_FUNCTION_ARGS)
Definition timestamp.c:1603
#define PGDLLIMPORT
Definition c.h:1421
uint32 TransactionId
Definition c.h:736
int64 TimestampTz
Definition timestamp.h:39
unsigned int Oid
static int fb(int x)
void ResolveRecoveryConflictWithSnapshotFullXid(FullTransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
Definition standby.c:515
RunningTransactionsData * RunningTransactions
Definition standby.h:142
void StandbyTimeoutHandler(void)
Definition standby.c:947
void ResolveRecoveryConflictWithBufferPin(void)
Definition standby.c:795
void StandbyLockTimeoutHandler(void)
Definition standby.c:956
RecoveryConflictReason
Definition standby.h:32
@ RECOVERY_CONFLICT_TABLESPACE
Definition standby.h:37
@ RECOVERY_CONFLICT_SNAPSHOT
Definition standby.h:43
@ RECOVERY_CONFLICT_LOCK
Definition standby.h:40
@ RECOVERY_CONFLICT_DATABASE
Definition standby.h:34
@ RECOVERY_CONFLICT_STARTUP_DEADLOCK
Definition standby.h:56
@ RECOVERY_CONFLICT_BUFFERPIN
Definition standby.h:49
@ RECOVERY_CONFLICT_BUFFERPIN_DEADLOCK
Definition standby.h:64
@ RECOVERY_CONFLICT_LOGICALSLOT
Definition standby.h:46
void StandbyDeadLockHandler(void)
Definition standby.c:938
void CheckRecoveryConflictDeadlock(void)
Definition standby.c:907
void InitRecoveryTransactionEnvironment(void)
Definition standby.c:96
void ResolveRecoveryConflictWithTablespace(Oid tsid)
Definition standby.c:542
void ResolveRecoveryConflictWithDatabase(Oid dbid)
Definition standby.c:572
void StandbyReleaseLockTree(TransactionId xid, int nsubxids, TransactionId *subxids)
Definition standby.c:1094
void StandbyReleaseOldLocks(TransactionId oldxid)
Definition standby.c:1132
void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
Definition standby.c:470
void LogAccessExclusiveLockPrepare(void)
Definition standby.c:1471
void LogStandbyInvalidations(int nmsgs, SharedInvalidationMessage *msgs, bool relcacheInitFileInval)
Definition standby.c:1493
void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid)
Definition standby.c:988
void LogAccessExclusiveLock(Oid dbOid, Oid relOid)
Definition standby.c:1454
PGDLLIMPORT bool log_recovery_conflict_waits
Definition standby.c:43
void LogRecoveryConflict(RecoveryConflictReason reason, TimestampTz wait_start, TimestampTz now, VirtualTransactionId *wait_list, bool still_waiting)
Definition standby.c:275
subxids_array_status
Definition standby.h:120
@ SUBXIDS_IN_SUBTRANS
Definition standby.h:123
@ SUBXIDS_MISSING
Definition standby.h:122
@ SUBXIDS_IN_ARRAY
Definition standby.h:121
void StandbyReleaseAllLocks(void)
Definition standby.c:1108
PGDLLIMPORT int max_standby_archive_delay
Definition standby.c:41
void ResolveRecoveryConflictWithLock(LOCKTAG locktag, bool logging_conflict)
Definition standby.c:626
XLogRecPtr LogStandbySnapshot(Oid dbid)
Definition standby.c:1303
void ShutdownRecoveryTransactionEnvironment(void)
Definition standby.c:162
PGDLLIMPORT int max_standby_streaming_delay
Definition standby.c:42
Definition proc.h:179
TransactionId oldestRunningXid
Definition standby.h:134
TransactionId nextXid
Definition standby.h:133
TransactionId oldestDatabaseRunningXid
Definition standby.h:135
TransactionId latestCompletedXid
Definition standby.h:137
subxids_array_status subxid_status
Definition standby.h:132
TransactionId * xids
Definition standby.h:139
uint64 XLogRecPtr
Definition xlogdefs.h:21