PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
xlog.h
Go to the documentation of this file.
1 /*
2  * xlog.h
3  *
4  * PostgreSQL transaction log manager
5  *
6  * Portions Copyright (c) 1996-2017, 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 {
71 
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 standby_mode = on
79  */
80 typedef enum
81 {
89 
93 
94 extern bool reachedConsistency;
95 
96 /* these variables are GUC parameters related to XLOG */
97 extern int min_wal_size;
98 extern int max_wal_size;
99 extern int wal_keep_segments;
100 extern int XLOGbuffers;
101 extern int XLogArchiveTimeout;
102 extern int wal_retrieve_retry_interval;
103 extern char *XLogArchiveCommand;
104 extern bool EnableHotStandby;
105 extern bool fullPageWrites;
106 extern bool wal_log_hints;
107 extern bool wal_compression;
108 extern bool log_checkpoints;
109 
110 extern int CheckPointSegments;
111 
112 /* Archive modes */
113 typedef enum ArchiveMode
114 {
115  ARCHIVE_MODE_OFF = 0, /* disabled */
116  ARCHIVE_MODE_ON, /* enabled while server is running normally */
117  ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */
118 } ArchiveMode;
119 extern int XLogArchiveMode;
120 
121 /* WAL levels */
122 typedef enum WalLevel
123 {
127 } WalLevel;
128 
129 extern PGDLLIMPORT int wal_level;
130 
131 /* Is WAL archiving enabled (always or only while server is running normally)? */
132 #define XLogArchivingActive() \
133  (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode > ARCHIVE_MODE_OFF)
134 /* Is WAL archiving enabled always (even during recovery)? */
135 #define XLogArchivingAlways() \
136  (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS)
137 #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')
138 
139 /*
140  * Is WAL-logging necessary for archival or log-shipping, or can we skip
141  * WAL-logging if we fsync() the data before committing instead?
142  */
143 #define XLogIsNeeded() (wal_level >= WAL_LEVEL_REPLICA)
144 
145 /*
146  * Is a full-page image needed for hint bit updates?
147  *
148  * Normally, we don't WAL-log hint bit updates, but if checksums are enabled,
149  * we have to protect them against torn page writes. When you only set
150  * individual bits on a page, it's still consistent no matter what combination
151  * of the bits make it to disk, but the checksum wouldn't match. Also WAL-log
152  * them if forced by wal_log_hints=on.
153  */
154 #define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints)
155 
156 /* Do we need to WAL-log information required only for Hot Standby and logical replication? */
157 #define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_REPLICA)
158 
159 /* Do we need to WAL-log information required only for logical replication? */
160 #define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL)
161 
162 #ifdef WAL_DEBUG
163 extern bool XLOG_DEBUG;
164 #endif
165 
166 /*
167  * OR-able request flag bits for checkpoints. The "cause" bits are used only
168  * for logging purposes. Note: the flags must be defined so that it's
169  * sensible to OR together request flags arising from different requestors.
170  */
171 
172 /* These directly affect the behavior of CreateCheckPoint and subsidiaries */
173 #define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */
174 #define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint,
175  * but issued at end of WAL
176  * recovery */
177 #define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */
178 #define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */
179 #define CHECKPOINT_FLUSH_ALL 0x0010 /* Flush all pages, including those
180  * belonging to unlogged tables */
181 /* These are important to RequestCheckpoint */
182 #define CHECKPOINT_WAIT 0x0020 /* Wait for completion */
183 /* These indicate the cause of a checkpoint request */
184 #define CHECKPOINT_CAUSE_XLOG 0x0040 /* XLOG consumption */
185 #define CHECKPOINT_CAUSE_TIME 0x0080 /* Elapsed time */
186 
187 /*
188  * Flag bits for the record being inserted, set using XLogSetRecordFlags().
189  */
190 #define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */
191 #define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */
192 
193 
194 /* Checkpoint statistics */
195 typedef struct CheckpointStatsData
196 {
197  TimestampTz ckpt_start_t; /* start of checkpoint */
198  TimestampTz ckpt_write_t; /* start of flushing buffers */
199  TimestampTz ckpt_sync_t; /* start of fsyncs */
200  TimestampTz ckpt_sync_end_t; /* end of fsyncs */
201  TimestampTz ckpt_end_t; /* end of checkpoint */
202 
203  int ckpt_bufs_written; /* # of buffers written */
204 
205  int ckpt_segs_added; /* # of new xlog segments created */
206  int ckpt_segs_removed; /* # of xlog segments deleted */
207  int ckpt_segs_recycled; /* # of xlog segments recycled */
208 
209  int ckpt_sync_rels; /* # of relations synced */
210  uint64 ckpt_longest_sync; /* Longest sync for one relation */
211  uint64 ckpt_agg_sync_time; /* The sum of all the individual sync
212  * times, which is not necessarily the
213  * same as the total elapsed time for
214  * the entire sync phase. */
216 
218 
219 struct XLogRecData;
220 
221 extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
222  XLogRecPtr fpw_lsn,
223  uint8 flags);
224 extern void XLogFlush(XLogRecPtr RecPtr);
225 extern bool XLogBackgroundFlush(void);
226 extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
227 extern int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock);
228 extern int XLogFileOpen(XLogSegNo segno);
229 
230 extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);
232 extern void XLogSetAsyncXactLSN(XLogRecPtr record);
234 
235 extern void xlog_redo(XLogReaderState *record);
236 extern void xlog_desc(StringInfo buf, XLogReaderState *record);
237 extern const char *xlog_identify(uint8 info);
238 
239 extern void issue_xlog_fsync(int fd, XLogSegNo segno);
240 
241 extern bool RecoveryInProgress(void);
242 extern bool HotStandbyActive(void);
243 extern bool HotStandbyActiveInReplay(void);
244 extern bool XLogInsertAllowed(void);
245 extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream);
246 extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI);
247 extern XLogRecPtr GetXLogInsertRecPtr(void);
248 extern XLogRecPtr GetXLogWriteRecPtr(void);
249 extern bool RecoveryIsPaused(void);
250 extern void SetRecoveryPause(bool recoveryPause);
251 extern TimestampTz GetLatestXTime(void);
253 extern char *XLogFileNameP(TimeLineID tli, XLogSegNo segno);
254 
255 extern void UpdateControlFile(void);
256 extern uint64 GetSystemIdentifier(void);
257 extern bool DataChecksumsEnabled(void);
259 extern Size XLOGShmemSize(void);
260 extern void XLOGShmemInit(void);
261 extern void BootStrapXLOG(void);
262 extern void StartupXLOG(void);
263 extern void ShutdownXLOG(int code, Datum arg);
264 extern void InitXLOGAccess(void);
265 extern void CreateCheckPoint(int flags);
266 extern bool CreateRestartPoint(int flags);
267 extern void XLogPutNextOid(Oid nextOid);
268 extern XLogRecPtr XLogRestorePoint(const char *rpName);
269 extern void UpdateFullPageWrites(void);
270 extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p);
271 extern XLogRecPtr GetRedoRecPtr(void);
272 extern XLogRecPtr GetInsertRecPtr(void);
273 extern XLogRecPtr GetFlushRecPtr(void);
275 extern void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch);
276 extern void RemovePromoteSignalFiles(void);
277 
278 extern bool CheckPromoteSignal(void);
279 extern void WakeupRecovery(void);
280 extern void SetWalWriterSleeping(bool sleeping);
281 
282 extern void XLogRequestWalReceiverReply(void);
283 
284 extern void assign_max_wal_size(int newval, void *extra);
285 extern void assign_checkpoint_completion_target(double newval, void *extra);
286 
287 /*
288  * Starting/stopping a base backup
289  */
290 extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,
291  TimeLineID *starttli_p, StringInfo labelfile, DIR *tblspcdir,
292  List **tablespaces, StringInfo tblspcmapfile, bool infotbssize,
293  bool needtblspcmapfile);
294 extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive,
295  TimeLineID *stoptli_p);
296 extern void do_pg_abort_backup(void);
297 
298 /* File path names (all relative to $PGDATA) */
299 #define BACKUP_LABEL_FILE "backup_label"
300 #define BACKUP_LABEL_OLD "backup_label.old"
301 
302 #define TABLESPACE_MAP "tablespace_map"
303 #define TABLESPACE_MAP_OLD "tablespace_map.old"
304 
305 #endif /* XLOG_H */
void CreateCheckPoint(int flags)
Definition: xlog.c:8339
int wal_keep_segments
Definition: xlog.c:89
struct CheckpointStatsData CheckpointStatsData
XLogRecPtr GetXLogWriteRecPtr(void)
Definition: xlog.c:10909
uint64 ckpt_agg_sync_time
Definition: xlog.h:211
TimestampTz ckpt_sync_end_t
Definition: xlog.h:200
bool CreateRestartPoint(int flags)
Definition: xlog.c:8881
int ckpt_sync_rels
Definition: xlog.h:209
bool XLogInsertAllowed(void)
Definition: xlog.c:7790
bool XLogNeedsFlush(XLogRecPtr RecPtr)
Definition: xlog.c:2950
uint32 TimeLineID
Definition: xlogdefs.h:45
XLogRecPtr GetRedoRecPtr(void)
Definition: xlog.c:7985
bool DataChecksumsEnabled(void)
Definition: xlog.c:4577
void WakeupRecovery(void)
Definition: xlog.c:11865
uint32 TransactionId
Definition: c.h:393
void XLogFlush(XLogRecPtr RecPtr)
Definition: xlog.c:2630
void xlog_desc(StringInfo buf, XLogReaderState *record)
Definition: xlogdesc.c:36
bool HotStandbyActive(void)
Definition: xlog.c:7751
int XLogFileOpen(XLogSegNo segno)
Definition: xlog.c:3385
TimestampTz ckpt_start_t
Definition: xlog.h:197
XLogRecPtr XactLastRecEnd
Definition: xlog.c:329
bool wal_log_hints
Definition: xlog.c:96
unsigned char uint8
Definition: c.h:263
int ckpt_segs_recycled
Definition: xlog.h:207
bool fullPageWrites
Definition: xlog.c:95
XLogSegNo XLogGetLastRemovedSegno(void)
Definition: xlog.c:3656
void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch)
Definition: xlog.c:8113
unsigned int Oid
Definition: postgres_ext.h:31
void SetRecoveryPause(bool recoveryPause)
Definition: xlog.c:5791
bool CheckPromoteSignal(void)
Definition: xlog.c:11849
XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, StringInfo labelfile, DIR *tblspcdir, List **tablespaces, StringInfo tblspcmapfile, bool infotbssize, bool needtblspcmapfile)
Definition: xlog.c:9977
XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI)
Definition: xlog.c:10874
static int fd(const char *x, int i)
Definition: preproc-init.c:105
void UpdateFullPageWrites(void)
Definition: xlog.c:9311
bool XLogBackgroundFlush(void)
Definition: xlog.c:2819
#define PGDLLIMPORT
Definition: c.h:1059
void xlog_redo(XLogReaderState *record)
Definition: xlog.c:9415
char * XLogFileNameP(TimeLineID tli, XLogSegNo segno)
Definition: xlog.c:9930
int max_wal_size
Definition: xlog.c:87
void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn)
Definition: xlog.c:2521
void XLogSetAsyncXactLSN(XLogRecPtr record)
Definition: xlog.c:2480
void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli)
Definition: xlog.c:3628
double TimestampTz
Definition: timestamp.h:51
XLogRecPtr GetInsertRecPtr(void)
Definition: xlog.c:8028
bool reachedConsistency
Definition: xlog.c:814
Definition: dirent.c:25
bool wal_compression
Definition: xlog.c:97
void assign_checkpoint_completion_target(double newval, void *extra)
Definition: xlog.c:2115
void UpdateControlFile(void)
Definition: xlog.c:4522
int XLogArchiveTimeout
Definition: xlog.c:91
int XLogArchiveMode
Definition: xlog.c:92
const char * xlog_identify(uint8 info)
Definition: xlogdesc.c:143
void InitXLOGAccess(void)
Definition: xlog.c:7962
HotStandbyState standbyState
Definition: xlog.c:191
PGDLLIMPORT int wal_level
Definition: xlog.c:100
bool EnableHotStandby
Definition: xlog.c:94
static char * buf
Definition: pg_test_fsync.c:65
XLogRecPtr GetXLogInsertRecPtr(void)
Definition: xlog.c:10893
int XLOGbuffers
Definition: xlog.c:90
XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags)
Definition: xlog.c:939
uint64 XLogSegNo
Definition: xlogdefs.h:34
unsigned int uint32
Definition: c.h:265
RecoveryTargetType
Definition: xlog.h:80
void RemovePromoteSignalFiles(void)
Definition: xlog.c:11838
int ckpt_segs_removed
Definition: xlog.h:206
bool log_checkpoints
Definition: xlog.c:98
int min_wal_size
Definition: xlog.c:88
XLogRecPtr GetFlushRecPtr(void)
Definition: xlog.c:8044
int ckpt_bufs_written
Definition: xlog.h:203
void StartupXLOG(void)
Definition: xlog.c:6038
bool HotStandbyActiveInReplay(void)
Definition: xlog.c:7776
int CheckPointSegments
Definition: xlog.c:120
uintptr_t Datum
Definition: postgres.h:374
void issue_xlog_fsync(int fd, XLogSegNo segno)
Definition: xlog.c:9887
XLogRecPtr ProcLastRecPtr
Definition: xlog.c:328
bool InRecovery
Definition: xlog.c:188
TimestampTz GetCurrentChunkReplayStartTime(void)
Definition: xlog.c:5940
XLogRecPtr GetLastImportantRecPtr(void)
Definition: xlog.c:8062
int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock)
Definition: xlog.c:3026
int sync_method
Definition: xlog.c:99
uint64 XLogRecPtr
Definition: xlogdefs.h:21
XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p)
Definition: xlog.c:10471
PGDLLIMPORT XLogRecPtr XactLastCommitEnd
Definition: xlog.c:330
void SetWalWriterSleeping(bool sleeping)
Definition: xlog.c:11874
void ShutdownXLOG(int code, Datum arg)
Definition: xlog.c:8143
XLogRecPtr GetFakeLSNForUnloggedRel(void)
Definition: xlog.c:4593
void do_pg_abort_backup(void)
Definition: xlog.c:10854
void assign_max_wal_size(int newval, void *extra)
Definition: xlog.c:2108
ArchiveMode
Definition: xlog.h:113
size_t Size
Definition: c.h:352
TimestampTz GetLatestXTime(void)
Definition: xlog.c:5910
TimestampTz ckpt_write_t
Definition: xlog.h:198
#define newval
void XLogRequestWalReceiverReply(void)
Definition: xlog.c:11885
XLogRecPtr XLogRestorePoint(const char *rpName)
Definition: xlog.c:9230
Size XLOGShmemSize(void)
Definition: xlog.c:4668
bool RecoveryInProgress(void)
Definition: xlog.c:7695
TimestampTz ckpt_sync_t
Definition: xlog.h:199
int ckpt_segs_added
Definition: xlog.h:205
void XLOGShmemInit(void)
Definition: xlog.c:4709
bool RecoveryIsPaused(void)
Definition: xlog.c:5779
static const unsigned __int64 epoch
Definition: gettimeofday.c:34
void * arg
CheckpointStatsData CheckpointStats
Definition: xlog.c:169
PGDLLIMPORT TimeLineID ThisTimeLineID
Definition: xlog.c:175
void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
Definition: xlog.c:8013
int wal_retrieve_retry_interval
Definition: xlog.c:103
void BootStrapXLOG(void)
Definition: xlog.c:4813
void XLogPutNextOid(Oid nextOid)
Definition: xlog.c:9175
Definition: pg_list.h:45
void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream)
Definition: xlog.c:5956
uint64 GetSystemIdentifier(void)
Definition: xlog.c:4567
TimestampTz ckpt_end_t
Definition: xlog.h:201
HotStandbyState
Definition: xlog.h:64
WalLevel
Definition: xlog.h:122
uint64 ckpt_longest_sync
Definition: xlog.h:210
char * XLogArchiveCommand
Definition: xlog.c:93