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