1 | /* |
2 | * xlog.h |
3 | * |
4 | * PostgreSQL write-ahead log manager |
5 | * |
6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | * |
9 | * src/include/access/xlog.h |
10 | */ |
11 | #ifndef XLOG_H |
12 | #define XLOG_H |
13 | |
14 | #include "access/rmgr.h" |
15 | #include "access/xlogdefs.h" |
16 | #include "access/xloginsert.h" |
17 | #include "access/xlogreader.h" |
18 | #include "datatype/timestamp.h" |
19 | #include "lib/stringinfo.h" |
20 | #include "nodes/pg_list.h" |
21 | #include "storage/fd.h" |
22 | |
23 | |
24 | /* Sync methods */ |
25 | #define SYNC_METHOD_FSYNC 0 |
26 | #define SYNC_METHOD_FDATASYNC 1 |
27 | #define SYNC_METHOD_OPEN 2 /* for O_SYNC */ |
28 | #define SYNC_METHOD_FSYNC_WRITETHROUGH 3 |
29 | #define SYNC_METHOD_OPEN_DSYNC 4 /* for O_DSYNC */ |
30 | extern int sync_method; |
31 | |
32 | extern PGDLLIMPORT TimeLineID ThisTimeLineID; /* current TLI */ |
33 | |
34 | /* |
35 | * Prior to 8.4, all activity during recovery was carried out by the startup |
36 | * process. This local variable continues to be used in many parts of the |
37 | * code to indicate actions taken by RecoveryManagers. Other processes that |
38 | * potentially perform work during recovery should check RecoveryInProgress(). |
39 | * See XLogCtl notes in xlog.c. |
40 | */ |
41 | extern bool InRecovery; |
42 | |
43 | /* |
44 | * Like InRecovery, standbyState is only valid in the startup process. |
45 | * In all other processes it will have the value STANDBY_DISABLED (so |
46 | * InHotStandby will read as false). |
47 | * |
48 | * In DISABLED state, we're performing crash recovery or hot standby was |
49 | * disabled in postgresql.conf. |
50 | * |
51 | * In INITIALIZED state, we've run InitRecoveryTransactionEnvironment, but |
52 | * we haven't yet processed a RUNNING_XACTS or shutdown-checkpoint WAL record |
53 | * to initialize our master-transaction tracking system. |
54 | * |
55 | * When the transaction tracking is initialized, we enter the SNAPSHOT_PENDING |
56 | * state. The tracked information might still be incomplete, so we can't allow |
57 | * connections yet, but redo functions must update the in-memory state when |
58 | * appropriate. |
59 | * |
60 | * In SNAPSHOT_READY mode, we have full knowledge of transactions that are |
61 | * (or were) running in the master at the current WAL location. Snapshots |
62 | * can be taken, and read-only queries can be run. |
63 | */ |
64 | typedef enum |
65 | { |
66 | STANDBY_DISABLED, |
67 | STANDBY_INITIALIZED, |
68 | STANDBY_SNAPSHOT_PENDING, |
69 | STANDBY_SNAPSHOT_READY |
70 | } HotStandbyState; |
71 | |
72 | extern HotStandbyState standbyState; |
73 | |
74 | #define InHotStandby (standbyState >= STANDBY_SNAPSHOT_PENDING) |
75 | |
76 | /* |
77 | * Recovery target type. |
78 | * Only set during a Point in Time recovery, not when in standby mode. |
79 | */ |
80 | typedef enum |
81 | { |
82 | RECOVERY_TARGET_UNSET, |
83 | RECOVERY_TARGET_XID, |
84 | RECOVERY_TARGET_TIME, |
85 | RECOVERY_TARGET_NAME, |
86 | RECOVERY_TARGET_LSN, |
87 | RECOVERY_TARGET_IMMEDIATE |
88 | } RecoveryTargetType; |
89 | |
90 | /* |
91 | * Recovery target TimeLine goal |
92 | */ |
93 | typedef enum |
94 | { |
95 | RECOVERY_TARGET_TIMELINE_CONTROLFILE, |
96 | RECOVERY_TARGET_TIMELINE_LATEST, |
97 | RECOVERY_TARGET_TIMELINE_NUMERIC |
98 | } RecoveryTargetTimeLineGoal; |
99 | |
100 | extern XLogRecPtr ProcLastRecPtr; |
101 | extern XLogRecPtr XactLastRecEnd; |
102 | extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd; |
103 | |
104 | extern bool reachedConsistency; |
105 | |
106 | /* these variables are GUC parameters related to XLOG */ |
107 | extern int wal_segment_size; |
108 | extern int min_wal_size_mb; |
109 | extern int max_wal_size_mb; |
110 | extern int wal_keep_segments; |
111 | extern int XLOGbuffers; |
112 | extern int XLogArchiveTimeout; |
113 | extern int wal_retrieve_retry_interval; |
114 | extern char *XLogArchiveCommand; |
115 | extern bool EnableHotStandby; |
116 | extern bool fullPageWrites; |
117 | extern bool wal_log_hints; |
118 | extern bool wal_compression; |
119 | extern bool wal_init_zero; |
120 | extern bool wal_recycle; |
121 | extern bool *wal_consistency_checking; |
122 | extern char *wal_consistency_checking_string; |
123 | extern bool log_checkpoints; |
124 | extern char *recoveryRestoreCommand; |
125 | extern char *recoveryEndCommand; |
126 | extern char *archiveCleanupCommand; |
127 | extern bool recoveryTargetInclusive; |
128 | extern int recoveryTargetAction; |
129 | extern int recovery_min_apply_delay; |
130 | extern char *PrimaryConnInfo; |
131 | extern char *PrimarySlotName; |
132 | |
133 | /* indirectly set via GUC system */ |
134 | extern TransactionId recoveryTargetXid; |
135 | extern char *recovery_target_time_string; |
136 | extern const char *recoveryTargetName; |
137 | extern XLogRecPtr recoveryTargetLSN; |
138 | extern RecoveryTargetType recoveryTarget; |
139 | extern char *PromoteTriggerFile; |
140 | extern RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal; |
141 | extern TimeLineID recoveryTargetTLIRequested; |
142 | extern TimeLineID recoveryTargetTLI; |
143 | |
144 | extern int CheckPointSegments; |
145 | |
146 | /* option set locally in startup process only when signal files exist */ |
147 | extern bool StandbyModeRequested; |
148 | extern bool StandbyMode; |
149 | |
150 | /* Archive modes */ |
151 | typedef enum ArchiveMode |
152 | { |
153 | ARCHIVE_MODE_OFF = 0, /* disabled */ |
154 | ARCHIVE_MODE_ON, /* enabled while server is running normally */ |
155 | ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */ |
156 | } ArchiveMode; |
157 | extern int XLogArchiveMode; |
158 | |
159 | /* WAL levels */ |
160 | typedef enum WalLevel |
161 | { |
162 | WAL_LEVEL_MINIMAL = 0, |
163 | WAL_LEVEL_REPLICA, |
164 | WAL_LEVEL_LOGICAL |
165 | } WalLevel; |
166 | |
167 | extern PGDLLIMPORT int wal_level; |
168 | |
169 | /* Is WAL archiving enabled (always or only while server is running normally)? */ |
170 | #define XLogArchivingActive() \ |
171 | (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode > ARCHIVE_MODE_OFF) |
172 | /* Is WAL archiving enabled always (even during recovery)? */ |
173 | #define XLogArchivingAlways() \ |
174 | (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS) |
175 | #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0') |
176 | |
177 | /* |
178 | * Is WAL-logging necessary for archival or log-shipping, or can we skip |
179 | * WAL-logging if we fsync() the data before committing instead? |
180 | */ |
181 | #define XLogIsNeeded() (wal_level >= WAL_LEVEL_REPLICA) |
182 | |
183 | /* |
184 | * Is a full-page image needed for hint bit updates? |
185 | * |
186 | * Normally, we don't WAL-log hint bit updates, but if checksums are enabled, |
187 | * we have to protect them against torn page writes. When you only set |
188 | * individual bits on a page, it's still consistent no matter what combination |
189 | * of the bits make it to disk, but the checksum wouldn't match. Also WAL-log |
190 | * them if forced by wal_log_hints=on. |
191 | */ |
192 | #define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints) |
193 | |
194 | /* Do we need to WAL-log information required only for Hot Standby and logical replication? */ |
195 | #define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_REPLICA) |
196 | |
197 | /* Do we need to WAL-log information required only for logical replication? */ |
198 | #define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL) |
199 | |
200 | #ifdef WAL_DEBUG |
201 | extern bool XLOG_DEBUG; |
202 | #endif |
203 | |
204 | /* |
205 | * OR-able request flag bits for checkpoints. The "cause" bits are used only |
206 | * for logging purposes. Note: the flags must be defined so that it's |
207 | * sensible to OR together request flags arising from different requestors. |
208 | */ |
209 | |
210 | /* These directly affect the behavior of CreateCheckPoint and subsidiaries */ |
211 | #define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */ |
212 | #define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint, but |
213 | * issued at end of WAL recovery */ |
214 | #define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */ |
215 | #define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */ |
216 | #define CHECKPOINT_FLUSH_ALL 0x0010 /* Flush all pages, including those |
217 | * belonging to unlogged tables */ |
218 | /* These are important to RequestCheckpoint */ |
219 | #define CHECKPOINT_WAIT 0x0020 /* Wait for completion */ |
220 | #define CHECKPOINT_REQUESTED 0x0040 /* Checkpoint request has been made */ |
221 | /* These indicate the cause of a checkpoint request */ |
222 | #define CHECKPOINT_CAUSE_XLOG 0x0080 /* XLOG consumption */ |
223 | #define CHECKPOINT_CAUSE_TIME 0x0100 /* Elapsed time */ |
224 | |
225 | /* |
226 | * Flag bits for the record being inserted, set using XLogSetRecordFlags(). |
227 | */ |
228 | #define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */ |
229 | #define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */ |
230 | |
231 | |
232 | /* Checkpoint statistics */ |
233 | typedef struct CheckpointStatsData |
234 | { |
235 | TimestampTz ckpt_start_t; /* start of checkpoint */ |
236 | TimestampTz ckpt_write_t; /* start of flushing buffers */ |
237 | TimestampTz ckpt_sync_t; /* start of fsyncs */ |
238 | TimestampTz ckpt_sync_end_t; /* end of fsyncs */ |
239 | TimestampTz ckpt_end_t; /* end of checkpoint */ |
240 | |
241 | int ckpt_bufs_written; /* # of buffers written */ |
242 | |
243 | int ckpt_segs_added; /* # of new xlog segments created */ |
244 | int ckpt_segs_removed; /* # of xlog segments deleted */ |
245 | int ckpt_segs_recycled; /* # of xlog segments recycled */ |
246 | |
247 | int ckpt_sync_rels; /* # of relations synced */ |
248 | uint64 ckpt_longest_sync; /* Longest sync for one relation */ |
249 | uint64 ckpt_agg_sync_time; /* The sum of all the individual sync |
250 | * times, which is not necessarily the |
251 | * same as the total elapsed time for the |
252 | * entire sync phase. */ |
253 | } CheckpointStatsData; |
254 | |
255 | extern CheckpointStatsData CheckpointStats; |
256 | |
257 | struct XLogRecData; |
258 | |
259 | extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, |
260 | XLogRecPtr fpw_lsn, |
261 | uint8 flags); |
262 | extern void XLogFlush(XLogRecPtr RecPtr); |
263 | extern bool XLogBackgroundFlush(void); |
264 | extern bool XLogNeedsFlush(XLogRecPtr RecPtr); |
265 | extern int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock); |
266 | extern int XLogFileOpen(XLogSegNo segno); |
267 | |
268 | extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli); |
269 | extern XLogSegNo XLogGetLastRemovedSegno(void); |
270 | extern void XLogSetAsyncXactLSN(XLogRecPtr record); |
271 | extern void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn); |
272 | |
273 | extern void xlog_redo(XLogReaderState *record); |
274 | extern void xlog_desc(StringInfo buf, XLogReaderState *record); |
275 | extern const char *xlog_identify(uint8 info); |
276 | |
277 | extern void issue_xlog_fsync(int fd, XLogSegNo segno); |
278 | |
279 | extern bool RecoveryInProgress(void); |
280 | extern bool HotStandbyActive(void); |
281 | extern bool HotStandbyActiveInReplay(void); |
282 | extern bool XLogInsertAllowed(void); |
283 | extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream); |
284 | extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI); |
285 | extern XLogRecPtr GetXLogInsertRecPtr(void); |
286 | extern XLogRecPtr GetXLogWriteRecPtr(void); |
287 | extern bool RecoveryIsPaused(void); |
288 | extern void SetRecoveryPause(bool recoveryPause); |
289 | extern TimestampTz GetLatestXTime(void); |
290 | extern TimestampTz GetCurrentChunkReplayStartTime(void); |
291 | extern char *XLogFileNameP(TimeLineID tli, XLogSegNo segno); |
292 | |
293 | extern void UpdateControlFile(void); |
294 | extern uint64 GetSystemIdentifier(void); |
295 | extern char *GetMockAuthenticationNonce(void); |
296 | extern bool DataChecksumsEnabled(void); |
297 | extern XLogRecPtr GetFakeLSNForUnloggedRel(void); |
298 | extern Size XLOGShmemSize(void); |
299 | extern void XLOGShmemInit(void); |
300 | extern void BootStrapXLOG(void); |
301 | extern void LocalProcessControlFile(bool reset); |
302 | extern void StartupXLOG(void); |
303 | extern void ShutdownXLOG(int code, Datum arg); |
304 | extern void InitXLOGAccess(void); |
305 | extern void CreateCheckPoint(int flags); |
306 | extern bool CreateRestartPoint(int flags); |
307 | extern void XLogPutNextOid(Oid nextOid); |
308 | extern XLogRecPtr XLogRestorePoint(const char *rpName); |
309 | extern void UpdateFullPageWrites(void); |
310 | extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p); |
311 | extern XLogRecPtr GetRedoRecPtr(void); |
312 | extern XLogRecPtr GetInsertRecPtr(void); |
313 | extern XLogRecPtr GetFlushRecPtr(void); |
314 | extern XLogRecPtr GetLastImportantRecPtr(void); |
315 | extern void RemovePromoteSignalFiles(void); |
316 | |
317 | extern bool CheckPromoteSignal(void); |
318 | extern void WakeupRecovery(void); |
319 | extern void SetWalWriterSleeping(bool sleeping); |
320 | |
321 | extern void XLogRequestWalReceiverReply(void); |
322 | |
323 | extern void assign_max_wal_size(int newval, void *); |
324 | extern void assign_checkpoint_completion_target(double newval, void *); |
325 | |
326 | /* |
327 | * Routines to start, stop, and get status of a base backup. |
328 | */ |
329 | |
330 | /* |
331 | * Session-level status of base backups |
332 | * |
333 | * This is used in parallel with the shared memory status to control parallel |
334 | * execution of base backup functions for a given session, be it a backend |
335 | * dedicated to replication or a normal backend connected to a database. The |
336 | * update of the session-level status happens at the same time as the shared |
337 | * memory counters to keep a consistent global and local state of the backups |
338 | * running. |
339 | */ |
340 | typedef enum SessionBackupState |
341 | { |
342 | SESSION_BACKUP_NONE, |
343 | SESSION_BACKUP_EXCLUSIVE, |
344 | SESSION_BACKUP_NON_EXCLUSIVE |
345 | } SessionBackupState; |
346 | |
347 | extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast, |
348 | TimeLineID *starttli_p, StringInfo labelfile, |
349 | List **tablespaces, StringInfo tblspcmapfile, bool infotbssize, |
350 | bool needtblspcmapfile); |
351 | extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive, |
352 | TimeLineID *stoptli_p); |
353 | extern void do_pg_abort_backup(void); |
354 | extern SessionBackupState get_backup_status(void); |
355 | |
356 | /* File path names (all relative to $PGDATA) */ |
357 | #define RECOVERY_SIGNAL_FILE "recovery.signal" |
358 | #define STANDBY_SIGNAL_FILE "standby.signal" |
359 | #define BACKUP_LABEL_FILE "backup_label" |
360 | #define BACKUP_LABEL_OLD "backup_label.old" |
361 | |
362 | #define TABLESPACE_MAP "tablespace_map" |
363 | #define TABLESPACE_MAP_OLD "tablespace_map.old" |
364 | |
365 | /* files to signal promotion to primary */ |
366 | #define PROMOTE_SIGNAL_FILE "promote" |
367 | #define FALLBACK_PROMOTE_SIGNAL_FILE "fallback_promote" |
368 | |
369 | #endif /* XLOG_H */ |
370 | |