xlog.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*
  2. * xlog.h
  3. *
  4. * PostgreSQL write-ahead log manager
  5. *
  6. * Portions Copyright (c) 1996-2022, 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. #include "access/xlogdefs.h"
  14. #include "access/xlogreader.h"
  15. #include "datatype/timestamp.h"
  16. #include "lib/stringinfo.h"
  17. #include "nodes/pg_list.h"
  18. /* Sync methods */
  19. #define SYNC_METHOD_FSYNC 0
  20. #define SYNC_METHOD_FDATASYNC 1
  21. #define SYNC_METHOD_OPEN 2 /* for O_SYNC */
  22. #define SYNC_METHOD_FSYNC_WRITETHROUGH 3
  23. #define SYNC_METHOD_OPEN_DSYNC 4 /* for O_DSYNC */
  24. extern PGDLLIMPORT int sync_method;
  25. extern PGDLLIMPORT XLogRecPtr ProcLastRecPtr;
  26. extern PGDLLIMPORT XLogRecPtr XactLastRecEnd;
  27. extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;
  28. /* these variables are GUC parameters related to XLOG */
  29. extern PGDLLIMPORT int wal_segment_size;
  30. extern PGDLLIMPORT int min_wal_size_mb;
  31. extern PGDLLIMPORT int max_wal_size_mb;
  32. extern PGDLLIMPORT int wal_keep_size_mb;
  33. extern PGDLLIMPORT int max_slot_wal_keep_size_mb;
  34. extern PGDLLIMPORT int XLOGbuffers;
  35. extern PGDLLIMPORT int XLogArchiveTimeout;
  36. extern PGDLLIMPORT int wal_retrieve_retry_interval;
  37. extern PGDLLIMPORT char *XLogArchiveCommand;
  38. extern PGDLLIMPORT bool EnableHotStandby;
  39. extern PGDLLIMPORT bool fullPageWrites;
  40. extern PGDLLIMPORT bool wal_log_hints;
  41. extern PGDLLIMPORT int wal_compression;
  42. extern PGDLLIMPORT bool wal_init_zero;
  43. extern PGDLLIMPORT bool wal_recycle;
  44. extern PGDLLIMPORT bool *wal_consistency_checking;
  45. extern PGDLLIMPORT char *wal_consistency_checking_string;
  46. extern PGDLLIMPORT bool log_checkpoints;
  47. extern PGDLLIMPORT bool track_wal_io_timing;
  48. extern PGDLLIMPORT int wal_decode_buffer_size;
  49. extern PGDLLIMPORT int CheckPointSegments;
  50. /* Archive modes */
  51. typedef enum ArchiveMode
  52. {
  53. ARCHIVE_MODE_OFF = 0, /* disabled */
  54. ARCHIVE_MODE_ON, /* enabled while server is running normally */
  55. ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */
  56. } ArchiveMode;
  57. extern PGDLLIMPORT int XLogArchiveMode;
  58. /* WAL levels */
  59. typedef enum WalLevel
  60. {
  61. WAL_LEVEL_MINIMAL = 0,
  62. WAL_LEVEL_REPLICA,
  63. WAL_LEVEL_LOGICAL
  64. } WalLevel;
  65. /* Compression algorithms for WAL */
  66. typedef enum WalCompression
  67. {
  68. WAL_COMPRESSION_NONE = 0,
  69. WAL_COMPRESSION_PGLZ,
  70. WAL_COMPRESSION_LZ4,
  71. WAL_COMPRESSION_ZSTD
  72. } WalCompression;
  73. /* Recovery states */
  74. typedef enum RecoveryState
  75. {
  76. RECOVERY_STATE_CRASH = 0, /* crash recovery */
  77. RECOVERY_STATE_ARCHIVE, /* archive recovery */
  78. RECOVERY_STATE_DONE /* currently in production */
  79. } RecoveryState;
  80. extern PGDLLIMPORT int wal_level;
  81. /* Is WAL archiving enabled (always or only while server is running normally)? */
  82. #define XLogArchivingActive() \
  83. (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode > ARCHIVE_MODE_OFF)
  84. /* Is WAL archiving enabled always (even during recovery)? */
  85. #define XLogArchivingAlways() \
  86. (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS)
  87. /*
  88. * Is WAL-logging necessary for archival or log-shipping, or can we skip
  89. * WAL-logging if we fsync() the data before committing instead?
  90. */
  91. #define XLogIsNeeded() (wal_level >= WAL_LEVEL_REPLICA)
  92. /*
  93. * Is a full-page image needed for hint bit updates?
  94. *
  95. * Normally, we don't WAL-log hint bit updates, but if checksums are enabled,
  96. * we have to protect them against torn page writes. When you only set
  97. * individual bits on a page, it's still consistent no matter what combination
  98. * of the bits make it to disk, but the checksum wouldn't match. Also WAL-log
  99. * them if forced by wal_log_hints=on.
  100. */
  101. #define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints)
  102. /* Do we need to WAL-log information required only for Hot Standby and logical replication? */
  103. #define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_REPLICA)
  104. /* Do we need to WAL-log information required only for logical replication? */
  105. #define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL)
  106. #ifdef WAL_DEBUG
  107. extern PGDLLIMPORT bool XLOG_DEBUG;
  108. #endif
  109. /*
  110. * OR-able request flag bits for checkpoints. The "cause" bits are used only
  111. * for logging purposes. Note: the flags must be defined so that it's
  112. * sensible to OR together request flags arising from different requestors.
  113. */
  114. /* These directly affect the behavior of CreateCheckPoint and subsidiaries */
  115. #define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */
  116. #define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint, but
  117. * issued at end of WAL recovery */
  118. #define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */
  119. #define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */
  120. #define CHECKPOINT_FLUSH_ALL 0x0010 /* Flush all pages, including those
  121. * belonging to unlogged tables */
  122. /* These are important to RequestCheckpoint */
  123. #define CHECKPOINT_WAIT 0x0020 /* Wait for completion */
  124. #define CHECKPOINT_REQUESTED 0x0040 /* Checkpoint request has been made */
  125. /* These indicate the cause of a checkpoint request */
  126. #define CHECKPOINT_CAUSE_XLOG 0x0080 /* XLOG consumption */
  127. #define CHECKPOINT_CAUSE_TIME 0x0100 /* Elapsed time */
  128. /*
  129. * Flag bits for the record being inserted, set using XLogSetRecordFlags().
  130. */
  131. #define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */
  132. #define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */
  133. /* Checkpoint statistics */
  134. typedef struct CheckpointStatsData
  135. {
  136. TimestampTz ckpt_start_t; /* start of checkpoint */
  137. TimestampTz ckpt_write_t; /* start of flushing buffers */
  138. TimestampTz ckpt_sync_t; /* start of fsyncs */
  139. TimestampTz ckpt_sync_end_t; /* end of fsyncs */
  140. TimestampTz ckpt_end_t; /* end of checkpoint */
  141. int ckpt_bufs_written; /* # of buffers written */
  142. int ckpt_segs_added; /* # of new xlog segments created */
  143. int ckpt_segs_removed; /* # of xlog segments deleted */
  144. int ckpt_segs_recycled; /* # of xlog segments recycled */
  145. int ckpt_sync_rels; /* # of relations synced */
  146. uint64 ckpt_longest_sync; /* Longest sync for one relation */
  147. uint64 ckpt_agg_sync_time; /* The sum of all the individual sync
  148. * times, which is not necessarily the
  149. * same as the total elapsed time for the
  150. * entire sync phase. */
  151. } CheckpointStatsData;
  152. extern PGDLLIMPORT CheckpointStatsData CheckpointStats;
  153. /*
  154. * GetWALAvailability return codes
  155. */
  156. typedef enum WALAvailability
  157. {
  158. WALAVAIL_INVALID_LSN, /* parameter error */
  159. WALAVAIL_RESERVED, /* WAL segment is within max_wal_size */
  160. WALAVAIL_EXTENDED, /* WAL segment is reserved by a slot or
  161. * wal_keep_size */
  162. WALAVAIL_UNRESERVED, /* no longer reserved, but not removed yet */
  163. WALAVAIL_REMOVED /* WAL segment has been removed */
  164. } WALAvailability;
  165. struct XLogRecData;
  166. extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
  167. XLogRecPtr fpw_lsn,
  168. uint8 flags,
  169. int num_fpi,
  170. bool topxid_included);
  171. extern void XLogFlush(XLogRecPtr RecPtr);
  172. extern bool XLogBackgroundFlush(void);
  173. extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
  174. extern int XLogFileInit(XLogSegNo segno, TimeLineID tli);
  175. extern int XLogFileOpen(XLogSegNo segno, TimeLineID tli);
  176. extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);
  177. extern XLogSegNo XLogGetLastRemovedSegno(void);
  178. extern void XLogSetAsyncXactLSN(XLogRecPtr record);
  179. extern void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn);
  180. extern void xlog_redo(XLogReaderState *record);
  181. extern void xlog_desc(StringInfo buf, XLogReaderState *record);
  182. extern const char *xlog_identify(uint8 info);
  183. extern void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli);
  184. extern bool RecoveryInProgress(void);
  185. extern RecoveryState GetRecoveryState(void);
  186. extern bool XLogInsertAllowed(void);
  187. extern XLogRecPtr GetXLogInsertRecPtr(void);
  188. extern XLogRecPtr GetXLogWriteRecPtr(void);
  189. extern uint64 GetSystemIdentifier(void);
  190. extern char *GetMockAuthenticationNonce(void);
  191. extern bool DataChecksumsEnabled(void);
  192. extern XLogRecPtr GetFakeLSNForUnloggedRel(void);
  193. extern Size XLOGShmemSize(void);
  194. extern void XLOGShmemInit(void);
  195. extern void BootStrapXLOG(void);
  196. extern void LocalProcessControlFile(bool reset);
  197. extern void StartupXLOG(void);
  198. extern void ShutdownXLOG(int code, Datum arg);
  199. extern void CreateCheckPoint(int flags);
  200. extern bool CreateRestartPoint(int flags);
  201. extern WALAvailability GetWALAvailability(XLogRecPtr targetLSN);
  202. extern void XLogPutNextOid(Oid nextOid);
  203. extern XLogRecPtr XLogRestorePoint(const char *rpName);
  204. extern void UpdateFullPageWrites(void);
  205. extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p);
  206. extern XLogRecPtr GetRedoRecPtr(void);
  207. extern XLogRecPtr GetInsertRecPtr(void);
  208. extern XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI);
  209. extern TimeLineID GetWALInsertionTimeLine(void);
  210. extern XLogRecPtr GetLastImportantRecPtr(void);
  211. extern void SetWalWriterSleeping(bool sleeping);
  212. extern void assign_max_wal_size(int newval, void *extra);
  213. extern void assign_checkpoint_completion_target(double newval, void *extra);
  214. /*
  215. * Routines used by xlogrecovery.c to call back into xlog.c during recovery.
  216. */
  217. extern void RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI);
  218. extern bool XLogCheckpointNeeded(XLogSegNo new_segno);
  219. extern void SwitchIntoArchiveRecovery(XLogRecPtr EndRecPtr, TimeLineID replayTLI);
  220. extern void ReachedEndOfBackup(XLogRecPtr EndRecPtr, TimeLineID tli);
  221. extern void SetInstallXLogFileSegmentActive(void);
  222. extern bool IsInstallXLogFileSegmentActive(void);
  223. extern void XLogShutdownWalRcv(void);
  224. /*
  225. * Routines to start, stop, and get status of a base backup.
  226. */
  227. /*
  228. * Session-level status of base backups
  229. *
  230. * This is used in parallel with the shared memory status to control parallel
  231. * execution of base backup functions for a given session, be it a backend
  232. * dedicated to replication or a normal backend connected to a database. The
  233. * update of the session-level status happens at the same time as the shared
  234. * memory counters to keep a consistent global and local state of the backups
  235. * running.
  236. */
  237. typedef enum SessionBackupState
  238. {
  239. SESSION_BACKUP_NONE,
  240. SESSION_BACKUP_RUNNING,
  241. } SessionBackupState;
  242. extern XLogRecPtr do_pg_backup_start(const char *backupidstr, bool fast,
  243. TimeLineID *starttli_p, StringInfo labelfile,
  244. List **tablespaces, StringInfo tblspcmapfile);
  245. extern XLogRecPtr do_pg_backup_stop(char *labelfile, bool waitforarchive,
  246. TimeLineID *stoptli_p);
  247. extern void do_pg_abort_backup(int code, Datum arg);
  248. extern void register_persistent_abort_backup_handler(void);
  249. extern SessionBackupState get_backup_status(void);
  250. /* File path names (all relative to $PGDATA) */
  251. #define RECOVERY_SIGNAL_FILE "recovery.signal"
  252. #define STANDBY_SIGNAL_FILE "standby.signal"
  253. #define BACKUP_LABEL_FILE "backup_label"
  254. #define BACKUP_LABEL_OLD "backup_label.old"
  255. #define TABLESPACE_MAP "tablespace_map"
  256. #define TABLESPACE_MAP_OLD "tablespace_map.old"
  257. /* files to signal promotion to primary */
  258. #define PROMOTE_SIGNAL_FILE "promote"
  259. #endif /* XLOG_H */