| 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 | |