PostgreSQL Source Code git master
Loading...
Searching...
No Matches
xlog.h File Reference
Include dependency graph for xlog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  CheckpointStatsData
 

Macros

#define XLogArchivingActive()    (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode > ARCHIVE_MODE_OFF)
 
#define XLogArchivingAlways()    (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS)
 
#define XLogIsNeeded()   (wal_level >= WAL_LEVEL_REPLICA)
 
#define XLogHintBitIsNeeded()   (wal_log_hints || DataChecksumsNeedWrite())
 
#define XLogStandbyInfoActive()   (wal_level >= WAL_LEVEL_REPLICA)
 
#define XLogLogicalInfoActive()    (wal_level >= WAL_LEVEL_LOGICAL || XLogLogicalInfo)
 
#define CHECKPOINT_IS_SHUTDOWN   0x0001 /* Checkpoint is for shutdown */
 
#define CHECKPOINT_END_OF_RECOVERY
 
#define CHECKPOINT_FAST   0x0004 /* Do it without delays */
 
#define CHECKPOINT_FORCE   0x0008 /* Force even if no activity */
 
#define CHECKPOINT_FLUSH_UNLOGGED   0x0010 /* Flush unlogged tables */
 
#define CHECKPOINT_WAIT   0x0020 /* Wait for completion */
 
#define CHECKPOINT_REQUESTED   0x0040 /* Checkpoint request has been made */
 
#define CHECKPOINT_CAUSE_XLOG   0x0080 /* XLOG consumption */
 
#define CHECKPOINT_CAUSE_TIME   0x0100 /* Elapsed time */
 
#define XLOG_INCLUDE_ORIGIN   0x01 /* include the replication origin */
 
#define XLOG_MARK_UNIMPORTANT   0x02 /* record not important for durability */
 
#define RECOVERY_SIGNAL_FILE   "recovery.signal"
 
#define STANDBY_SIGNAL_FILE   "standby.signal"
 
#define BACKUP_LABEL_FILE   "backup_label"
 
#define BACKUP_LABEL_OLD   "backup_label.old"
 
#define TABLESPACE_MAP   "tablespace_map"
 
#define TABLESPACE_MAP_OLD   "tablespace_map.old"
 
#define PROMOTE_SIGNAL_FILE   "promote"
 

Typedefs

typedef enum ArchiveMode ArchiveMode
 
typedef enum WalLevel WalLevel
 
typedef enum WalCompression WalCompression
 
typedef enum RecoveryState RecoveryState
 
typedef struct CheckpointStatsData CheckpointStatsData
 
typedef enum WALAvailability WALAvailability
 
typedef enum SessionBackupState SessionBackupState
 

Enumerations

enum  WalSyncMethod {
  WAL_SYNC_METHOD_FSYNC = 0 , WAL_SYNC_METHOD_FDATASYNC , WAL_SYNC_METHOD_OPEN , WAL_SYNC_METHOD_FSYNC_WRITETHROUGH ,
  WAL_SYNC_METHOD_OPEN_DSYNC
}
 
enum  ArchiveMode { ARCHIVE_MODE_OFF = 0 , ARCHIVE_MODE_ON , ARCHIVE_MODE_ALWAYS }
 
enum  WalLevel { WAL_LEVEL_MINIMAL = 0 , WAL_LEVEL_REPLICA , WAL_LEVEL_LOGICAL }
 
enum  WalCompression { WAL_COMPRESSION_NONE = 0 , WAL_COMPRESSION_PGLZ , WAL_COMPRESSION_LZ4 , WAL_COMPRESSION_ZSTD }
 
enum  RecoveryState { RECOVERY_STATE_CRASH = 0 , RECOVERY_STATE_ARCHIVE , RECOVERY_STATE_DONE }
 
enum  WALAvailability {
  WALAVAIL_INVALID_LSN , WALAVAIL_RESERVED , WALAVAIL_EXTENDED , WALAVAIL_UNRESERVED ,
  WALAVAIL_REMOVED
}
 
enum  SessionBackupState { SESSION_BACKUP_NONE , SESSION_BACKUP_RUNNING }
 

Functions

XLogRecPtr XLogInsertRecord (struct XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, int num_fpi, uint64 fpi_bytes, bool topxid_included)
 
void XLogFlush (XLogRecPtr record)
 
bool XLogBackgroundFlush (void)
 
bool XLogNeedsFlush (XLogRecPtr record)
 
int XLogFileInit (XLogSegNo logsegno, TimeLineID logtli)
 
int XLogFileOpen (XLogSegNo segno, TimeLineID tli)
 
void CheckXLogRemoved (XLogSegNo segno, TimeLineID tli)
 
XLogSegNo XLogGetLastRemovedSegno (void)
 
XLogSegNo XLogGetOldestSegno (TimeLineID tli)
 
void XLogSetAsyncXactLSN (XLogRecPtr asyncXactLSN)
 
void XLogSetReplicationSlotMinimumLSN (XLogRecPtr lsn)
 
XLogRecPtr XLogGetReplicationSlotMinimumLSN (void)
 
void xlog_redo (struct XLogReaderState *record)
 
void xlog2_redo (struct XLogReaderState *record)
 
void xlog_desc (StringInfo buf, struct XLogReaderState *record)
 
void xlog2_desc (StringInfo buf, struct XLogReaderState *record)
 
const charxlog_identify (uint8 info)
 
const charxlog2_identify (uint8 info)
 
void issue_xlog_fsync (int fd, XLogSegNo segno, TimeLineID tli)
 
bool RecoveryInProgress (void)
 
RecoveryState GetRecoveryState (void)
 
bool XLogInsertAllowed (void)
 
XLogRecPtr GetXLogInsertRecPtr (void)
 
XLogRecPtr GetXLogInsertEndRecPtr (void)
 
XLogRecPtr GetXLogWriteRecPtr (void)
 
uint64 GetSystemIdentifier (void)
 
charGetMockAuthenticationNonce (void)
 
bool DataChecksumsNeedWrite (void)
 
bool DataChecksumsNeedVerify (void)
 
bool DataChecksumsOn (void)
 
bool DataChecksumsOff (void)
 
bool DataChecksumsInProgressOn (void)
 
void SetDataChecksumsOnInProgress (void)
 
void SetDataChecksumsOn (void)
 
void SetDataChecksumsOff (void)
 
const charshow_data_checksums (void)
 
const charget_checksum_state_string (uint32 state)
 
void InitLocalDataChecksumState (void)
 
void SetLocalDataChecksumState (uint32 data_checksum_version)
 
bool GetDefaultCharSignedness (void)
 
XLogRecPtr GetFakeLSNForUnloggedRel (void)
 
void BootStrapXLOG (uint32 data_checksum_version)
 
void InitializeWalConsistencyChecking (void)
 
void LocalProcessControlFile (bool reset)
 
WalLevel GetActiveWalLevelOnStandby (void)
 
void StartupXLOG (void)
 
void ShutdownXLOG (int code, Datum arg)
 
bool CreateCheckPoint (int flags)
 
bool CreateRestartPoint (int flags)
 
WALAvailability GetWALAvailability (XLogRecPtr targetLSN)
 
void XLogPutNextOid (Oid nextOid)
 
XLogRecPtr XLogRestorePoint (const char *rpName)
 
XLogRecPtr XLogAssignLSN (void)
 
void UpdateFullPageWrites (void)
 
void GetFullPageWriteInfo (XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
 
XLogRecPtr GetRedoRecPtr (void)
 
XLogRecPtr GetInsertRecPtr (void)
 
XLogRecPtr GetFlushRecPtr (TimeLineID *insertTLI)
 
TimeLineID GetWALInsertionTimeLine (void)
 
TimeLineID GetWALInsertionTimeLineIfSet (void)
 
XLogRecPtr GetLastImportantRecPtr (void)
 
void SetWalWriterSleeping (bool sleeping)
 
void WakeupCheckpointer (void)
 
Size WALReadFromBuffers (char *dstbuf, XLogRecPtr startptr, Size count, TimeLineID tli)
 
void RemoveNonParentXlogFiles (XLogRecPtr switchpoint, TimeLineID newTLI)
 
bool XLogCheckpointNeeded (XLogSegNo new_segno)
 
void SwitchIntoArchiveRecovery (XLogRecPtr EndRecPtr, TimeLineID replayTLI)
 
void ReachedEndOfBackup (XLogRecPtr EndRecPtr, TimeLineID tli)
 
void SetInstallXLogFileSegmentActive (void)
 
bool IsInstallXLogFileSegmentActive (void)
 
void ResetInstallXLogFileSegmentActive (void)
 
void XLogShutdownWalRcv (void)
 
void do_pg_backup_start (const char *backupidstr, bool fast, List **tablespaces, BackupState *state, StringInfo tblspcmapfile)
 
void do_pg_backup_stop (BackupState *state, bool waitforarchive)
 
void do_pg_abort_backup (int code, Datum arg)
 
void register_persistent_abort_backup_handler (void)
 
SessionBackupState get_backup_status (void)
 

Variables

PGDLLIMPORT int wal_sync_method
 
PGDLLIMPORT XLogRecPtr ProcLastRecPtr
 
PGDLLIMPORT XLogRecPtr XactLastRecEnd
 
PGDLLIMPORT XLogRecPtr XactLastCommitEnd
 
PGDLLIMPORT int wal_segment_size
 
PGDLLIMPORT int min_wal_size_mb
 
PGDLLIMPORT int max_wal_size_mb
 
PGDLLIMPORT int wal_keep_size_mb
 
PGDLLIMPORT int max_slot_wal_keep_size_mb
 
PGDLLIMPORT int XLOGbuffers
 
PGDLLIMPORT int XLogArchiveTimeout
 
PGDLLIMPORT int wal_retrieve_retry_interval
 
PGDLLIMPORT charXLogArchiveCommand
 
PGDLLIMPORT bool EnableHotStandby
 
PGDLLIMPORT bool fullPageWrites
 
PGDLLIMPORT bool wal_log_hints
 
PGDLLIMPORT int wal_compression
 
PGDLLIMPORT bool wal_init_zero
 
PGDLLIMPORT bool wal_recycle
 
PGDLLIMPORT boolwal_consistency_checking
 
PGDLLIMPORT charwal_consistency_checking_string
 
PGDLLIMPORT bool log_checkpoints
 
PGDLLIMPORT int CommitDelay
 
PGDLLIMPORT int CommitSiblings
 
PGDLLIMPORT bool track_wal_io_timing
 
PGDLLIMPORT int wal_decode_buffer_size
 
PGDLLIMPORT int data_checksums
 
PGDLLIMPORT int CheckPointSegments
 
PGDLLIMPORT int XLogArchiveMode
 
PGDLLIMPORT int wal_level
 
PGDLLIMPORT bool XLogLogicalInfo
 
PGDLLIMPORT CheckpointStatsData CheckpointStats
 

Macro Definition Documentation

◆ BACKUP_LABEL_FILE

#define BACKUP_LABEL_FILE   "backup_label"

Definition at line 334 of file xlog.h.

◆ BACKUP_LABEL_OLD

#define BACKUP_LABEL_OLD   "backup_label.old"

Definition at line 335 of file xlog.h.

◆ CHECKPOINT_CAUSE_TIME

#define CHECKPOINT_CAUSE_TIME   0x0100 /* Elapsed time */

Definition at line 161 of file xlog.h.

◆ CHECKPOINT_CAUSE_XLOG

#define CHECKPOINT_CAUSE_XLOG   0x0080 /* XLOG consumption */

Definition at line 160 of file xlog.h.

◆ CHECKPOINT_END_OF_RECOVERY

#define CHECKPOINT_END_OF_RECOVERY
Value:
0x0002 /* Like shutdown checkpoint, but
* issued at end of WAL recovery */

Definition at line 152 of file xlog.h.

173{
174 TimestampTz ckpt_start_t; /* start of checkpoint */
175 TimestampTz ckpt_write_t; /* start of flushing buffers */
176 TimestampTz ckpt_sync_t; /* start of fsyncs */
177 TimestampTz ckpt_sync_end_t; /* end of fsyncs */
178 TimestampTz ckpt_end_t; /* end of checkpoint */
179
180 int ckpt_bufs_written; /* # of buffers written */
181 int ckpt_slru_written; /* # of SLRU buffers written */
182
183 int ckpt_segs_added; /* # of new xlog segments created */
184 int ckpt_segs_removed; /* # of xlog segments deleted */
185 int ckpt_segs_recycled; /* # of xlog segments recycled */
186
187 int ckpt_sync_rels; /* # of relations synced */
188 uint64 ckpt_longest_sync; /* Longest sync for one relation */
189 uint64 ckpt_agg_sync_time; /* The sum of all the individual sync
190 * times, which is not necessarily the
191 * same as the total elapsed time for the
192 * entire sync phase. */
194
196
197/*
198 * GetWALAvailability return codes
199 */
200typedef enum WALAvailability
201{
202 WALAVAIL_INVALID_LSN, /* parameter error */
203 WALAVAIL_RESERVED, /* WAL segment is within max_wal_size */
204 WALAVAIL_EXTENDED, /* WAL segment is reserved by a slot or
205 * wal_keep_size */
206 WALAVAIL_UNRESERVED, /* no longer reserved, but not removed yet */
207 WALAVAIL_REMOVED, /* WAL segment has been removed */
209
210struct XLogRecData;
211struct XLogReaderState;
212
215 uint8 flags,
216 int num_fpi,
218 bool topxid_included);
219extern void XLogFlush(XLogRecPtr record);
220extern bool XLogBackgroundFlush(void);
221extern bool XLogNeedsFlush(XLogRecPtr record);
223extern int XLogFileOpen(XLogSegNo segno, TimeLineID tli);
224
225extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);
228extern void XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN);
231
232extern void xlog_redo(struct XLogReaderState *record);
233extern void xlog2_redo(struct XLogReaderState *record);
234extern void xlog_desc(StringInfo buf, struct XLogReaderState *record);
235extern void xlog2_desc(StringInfo buf, struct XLogReaderState *record);
236extern const char *xlog_identify(uint8 info);
237extern const char *xlog2_identify(uint8 info);
238
239extern void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli);
240
241extern bool RecoveryInProgress(void);
243extern bool XLogInsertAllowed(void);
246extern XLogRecPtr GetXLogWriteRecPtr(void);
247
248extern uint64 GetSystemIdentifier(void);
249extern char *GetMockAuthenticationNonce(void);
250extern bool DataChecksumsNeedWrite(void);
251extern bool DataChecksumsNeedVerify(void);
252extern bool DataChecksumsOn(void);
253extern bool DataChecksumsOff(void);
254extern bool DataChecksumsInProgressOn(void);
255extern void SetDataChecksumsOnInProgress(void);
256extern void SetDataChecksumsOn(void);
257extern void SetDataChecksumsOff(void);
258extern const char *show_data_checksums(void);
259extern const char *get_checksum_state_string(uint32 state);
260extern void InitLocalDataChecksumState(void);
261extern void SetLocalDataChecksumState(uint32 data_checksum_version);
262extern bool GetDefaultCharSignedness(void);
264extern void BootStrapXLOG(uint32 data_checksum_version);
265extern void InitializeWalConsistencyChecking(void);
266extern void LocalProcessControlFile(bool reset);
268extern void StartupXLOG(void);
269extern void ShutdownXLOG(int code, Datum arg);
270extern bool CreateCheckPoint(int flags);
271extern bool CreateRestartPoint(int flags);
273extern void XLogPutNextOid(Oid nextOid);
274extern XLogRecPtr XLogRestorePoint(const char *rpName);
275extern XLogRecPtr XLogAssignLSN(void);
276extern void UpdateFullPageWrites(void);
278extern XLogRecPtr GetRedoRecPtr(void);
279extern XLogRecPtr GetInsertRecPtr(void);
284
285extern void SetWalWriterSleeping(bool sleeping);
286
287extern void WakeupCheckpointer(void);
288
289extern Size WALReadFromBuffers(char *dstbuf, XLogRecPtr startptr, Size count,
290 TimeLineID tli);
291
292/*
293 * Routines used by xlogrecovery.c to call back into xlog.c during recovery.
294 */
299extern void SetInstallXLogFileSegmentActive(void);
300extern bool IsInstallXLogFileSegmentActive(void);
301extern void ResetInstallXLogFileSegmentActive(void);
302extern void XLogShutdownWalRcv(void);
303
304/*
305 * Routines to start, stop, and get status of a base backup.
306 */
307
308/*
309 * Session-level status of base backups
310 *
311 * This is used in parallel with the shared memory status to control parallel
312 * execution of base backup functions for a given session, be it a backend
313 * dedicated to replication or a normal backend connected to a database. The
314 * update of the session-level status happens at the same time as the shared
315 * memory counters to keep a consistent global and local state of the backups
316 * running.
317 */
318typedef enum SessionBackupState
319{
323
324extern void do_pg_backup_start(const char *backupidstr, bool fast,
325 List **tablespaces, BackupState *state,
328extern void do_pg_abort_backup(int code, Datum arg);
331
332/* File path names (all relative to $PGDATA) */
333#define RECOVERY_SIGNAL_FILE "recovery.signal"
334#define STANDBY_SIGNAL_FILE "standby.signal"
335#define BACKUP_LABEL_FILE "backup_label"
336#define BACKUP_LABEL_OLD "backup_label.old"
337
338#define TABLESPACE_MAP "tablespace_map"
339#define TABLESPACE_MAP_OLD "tablespace_map.old"
340
341/* files to signal promotion to primary */
342#define PROMOTE_SIGNAL_FILE "promote"
343
344#endif /* XLOG_H */
#define PGDLLIMPORT
Definition c.h:1492
uint8_t uint8
Definition c.h:681
uint64_t uint64
Definition c.h:684
uint32_t uint32
Definition c.h:683
size_t Size
Definition c.h:748
int64 TimestampTz
Definition timestamp.h:39
Datum arg
Definition elog.c:1323
static char buf[DEFAULT_XLOG_SEG_SIZE]
uint64_t Datum
Definition postgres.h:70
unsigned int Oid
static int fd(const char *x, int i)
static int fb(int x)
void reset(void)
Definition pg_list.h:54
DecodedXLogRecord * record
Definition xlogreader.h:235
XLogRecPtr EndRecPtr
Definition xlogreader.h:206
int XLogFileInit(XLogSegNo logsegno, TimeLineID logtli)
Definition xlog.c:3430
uint64 GetSystemIdentifier(void)
Definition xlog.c:4642
void UpdateFullPageWrites(void)
Definition xlog.c:8755
bool RecoveryInProgress(void)
Definition xlog.c:6835
void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
Definition xlog.c:6968
TimeLineID GetWALInsertionTimeLine(void)
Definition xlog.c:7021
void do_pg_abort_backup(int code, Datum arg)
Definition xlog.c:10054
XLogSegNo XLogGetLastRemovedSegno(void)
Definition xlog.c:3808
void SetLocalDataChecksumState(uint32 data_checksum_version)
Definition xlog.c:4969
void xlog_desc(StringInfo buf, struct XLogReaderState *record)
Definition xlogdesc.c:93
Size WALReadFromBuffers(char *dstbuf, XLogRecPtr startptr, Size count, TimeLineID tli)
Definition xlog.c:1789
void SetDataChecksumsOff(void)
Definition xlog.c:4865
XLogRecPtr GetRedoRecPtr(void)
Definition xlog.c:6938
void SetInstallXLogFileSegmentActive(void)
Definition xlog.c:10159
void StartupXLOG(void)
Definition xlog.c:5845
bool IsInstallXLogFileSegmentActive(void)
Definition xlog.c:10176
void BootStrapXLOG(uint32 data_checksum_version)
Definition xlog.c:5453
bool CreateRestartPoint(int flags)
Definition xlog.c:8129
XLogRecPtr GetInsertRecPtr(void)
Definition xlog.c:6983
XLogRecPtr XLogGetReplicationSlotMinimumLSN(void)
Definition xlog.c:2699
SessionBackupState get_backup_status(void)
Definition xlog.c:9761
void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli)
Definition xlog.c:3777
WALAvailability
Definition xlog.h:200
@ WALAVAIL_REMOVED
Definition xlog.h:206
@ WALAVAIL_RESERVED
Definition xlog.h:202
@ WALAVAIL_UNRESERVED
Definition xlog.h:205
@ WALAVAIL_EXTENDED
Definition xlog.h:203
@ WALAVAIL_INVALID_LSN
Definition xlog.h:201
PGDLLIMPORT CheckpointStatsData CheckpointStats
Definition xlog.c:216
WALAvailability GetWALAvailability(XLogRecPtr targetLSN)
Definition xlog.c:8414
void ShutdownXLOG(int code, Datum arg)
Definition xlog.c:7103
RecoveryState GetRecoveryState(void)
Definition xlog.c:6871
const char * xlog2_identify(uint8 info)
Definition xlogdesc.c:284
const char * xlog_identify(uint8 info)
Definition xlogdesc.c:224
void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn)
Definition xlog.c:2686
void SwitchIntoArchiveRecovery(XLogRecPtr EndRecPtr, TimeLineID replayTLI)
Definition xlog.c:6710
bool DataChecksumsNeedVerify(void)
Definition xlog.c:4732
void SetDataChecksumsOn(void)
Definition xlog.c:4801
bool GetDefaultCharSignedness(void)
Definition xlog.c:4991
bool DataChecksumsOn(void)
Definition xlog.c:4694
XLogRecPtr GetXLogInsertRecPtr(void)
Definition xlog.c:10095
void SetWalWriterSleeping(bool sleeping)
Definition xlog.c:10191
void WakeupCheckpointer(void)
void SetDataChecksumsOnInProgress(void)
Definition xlog.c:4748
int XLogFileOpen(XLogSegNo segno, TimeLineID tli)
Definition xlog.c:3668
XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI)
Definition xlog.c:7000
WalLevel GetActiveWalLevelOnStandby(void)
Definition xlog.c:5284
void xlog_redo(struct XLogReaderState *record)
Definition xlog.c:8824
void InitializeWalConsistencyChecking(void)
Definition xlog.c:5188
void RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI)
Definition xlog.c:3990
XLogRecPtr GetLastImportantRecPtr(void)
Definition xlog.c:7057
SessionBackupState
Definition xlog.h:318
@ SESSION_BACKUP_RUNNING
Definition xlog.h:320
@ SESSION_BACKUP_NONE
Definition xlog.h:319
XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, int num_fpi, uint64 fpi_bytes, bool topxid_included)
Definition xlog.c:784
bool XLogNeedsFlush(XLogRecPtr record)
Definition xlog.c:3158
void register_persistent_abort_backup_handler(void)
Definition xlog.c:10081
void ReachedEndOfBackup(XLogRecPtr EndRecPtr, TimeLineID tli)
Definition xlog.c:6748
void LocalProcessControlFile(bool reset)
Definition xlog.c:5269
XLogSegNo XLogGetOldestSegno(TimeLineID tli)
Definition xlog.c:3824
bool DataChecksumsOff(void)
Definition xlog.c:4682
XLogRecPtr GetXLogWriteRecPtr(void)
Definition xlog.c:10127
void ResetInstallXLogFileSegmentActive(void)
Definition xlog.c:10168
void xlog2_redo(struct XLogReaderState *record)
Definition xlog.c:9238
bool XLogBackgroundFlush(void)
Definition xlog.c:3003
char * GetMockAuthenticationNonce(void)
Definition xlog.c:4652
const char * show_data_checksums(void)
Definition xlog.c:4978
bool DataChecksumsInProgressOn(void)
Definition xlog.c:4706
bool XLogInsertAllowed(void)
Definition xlog.c:6890
void do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces, BackupState *state, StringInfo tblspcmapfile)
Definition xlog.c:9458
void xlog2_desc(StringInfo buf, struct XLogReaderState *record)
Definition xlogdesc.c:78
const char * get_checksum_state_string(uint32 state)
Definition xlogdesc.c:59
XLogRecPtr XLogRestorePoint(const char *rpName)
Definition xlog.c:8625
TimeLineID GetWALInsertionTimeLineIfSet(void)
Definition xlog.c:7037
void do_pg_backup_stop(BackupState *state, bool waitforarchive)
Definition xlog.c:9780
WalLevel
Definition xlog.h:75
bool CreateCheckPoint(int flags)
Definition xlog.c:7400
bool DataChecksumsNeedWrite(void)
Definition xlog.c:4673
XLogRecPtr GetFakeLSNForUnloggedRel(void)
Definition xlog.c:5006
XLogRecPtr GetXLogInsertEndRecPtr(void)
Definition xlog.c:10111
void XLogPutNextOid(Oid nextOid)
Definition xlog.c:8570
void XLogFlush(XLogRecPtr record)
Definition xlog.c:2800
XLogRecPtr XLogAssignLSN(void)
Definition xlog.c:8655
void InitLocalDataChecksumState(void)
Definition xlog.c:4960
RecoveryState
Definition xlog.h:92
void XLogShutdownWalRcv(void)
Definition xlog.c:10149
void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli)
Definition xlog.c:9361
void XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN)
Definition xlog.c:2630
bool XLogCheckpointNeeded(XLogSegNo new_segno)
Definition xlog.c:2301
uint64 XLogRecPtr
Definition xlogdefs.h:21
uint32 TimeLineID
Definition xlogdefs.h:63
uint64 XLogSegNo
Definition xlogdefs.h:52

◆ CHECKPOINT_FAST

#define CHECKPOINT_FAST   0x0004 /* Do it without delays */

Definition at line 153 of file xlog.h.

◆ CHECKPOINT_FLUSH_UNLOGGED

#define CHECKPOINT_FLUSH_UNLOGGED   0x0010 /* Flush unlogged tables */

Definition at line 155 of file xlog.h.

◆ CHECKPOINT_FORCE

#define CHECKPOINT_FORCE   0x0008 /* Force even if no activity */

Definition at line 154 of file xlog.h.

◆ CHECKPOINT_IS_SHUTDOWN

#define CHECKPOINT_IS_SHUTDOWN   0x0001 /* Checkpoint is for shutdown */

Definition at line 151 of file xlog.h.

◆ CHECKPOINT_REQUESTED

#define CHECKPOINT_REQUESTED   0x0040 /* Checkpoint request has been made */

Definition at line 158 of file xlog.h.

◆ CHECKPOINT_WAIT

#define CHECKPOINT_WAIT   0x0020 /* Wait for completion */

Definition at line 157 of file xlog.h.

◆ PROMOTE_SIGNAL_FILE

#define PROMOTE_SIGNAL_FILE   "promote"

Definition at line 341 of file xlog.h.

◆ RECOVERY_SIGNAL_FILE

#define RECOVERY_SIGNAL_FILE   "recovery.signal"

Definition at line 332 of file xlog.h.

◆ STANDBY_SIGNAL_FILE

#define STANDBY_SIGNAL_FILE   "standby.signal"

Definition at line 333 of file xlog.h.

◆ TABLESPACE_MAP

#define TABLESPACE_MAP   "tablespace_map"

Definition at line 337 of file xlog.h.

◆ TABLESPACE_MAP_OLD

#define TABLESPACE_MAP_OLD   "tablespace_map.old"

Definition at line 338 of file xlog.h.

◆ XLOG_INCLUDE_ORIGIN

#define XLOG_INCLUDE_ORIGIN   0x01 /* include the replication origin */

Definition at line 166 of file xlog.h.

◆ XLOG_MARK_UNIMPORTANT

#define XLOG_MARK_UNIMPORTANT   0x02 /* record not important for durability */

Definition at line 167 of file xlog.h.

◆ XLogArchivingActive

Definition at line 102 of file xlog.h.

◆ XLogArchivingAlways

Definition at line 105 of file xlog.h.

◆ XLogHintBitIsNeeded

#define XLogHintBitIsNeeded ( )    (wal_log_hints || DataChecksumsNeedWrite())

Definition at line 123 of file xlog.h.

◆ XLogIsNeeded

#define XLogIsNeeded ( )    (wal_level >= WAL_LEVEL_REPLICA)

Definition at line 112 of file xlog.h.

◆ XLogLogicalInfoActive

#define XLogLogicalInfoActive ( )     (wal_level >= WAL_LEVEL_LOGICAL || XLogLogicalInfo)

Definition at line 137 of file xlog.h.

◆ XLogStandbyInfoActive

#define XLogStandbyInfoActive ( )    (wal_level >= WAL_LEVEL_REPLICA)

Definition at line 126 of file xlog.h.

Typedef Documentation

◆ ArchiveMode

◆ CheckpointStatsData

◆ RecoveryState

◆ SessionBackupState

◆ WALAvailability

◆ WalCompression

◆ WalLevel

Enumeration Type Documentation

◆ ArchiveMode

Enumerator
ARCHIVE_MODE_OFF 
ARCHIVE_MODE_ON 
ARCHIVE_MODE_ALWAYS 

Definition at line 65 of file xlog.h.

66{
67 ARCHIVE_MODE_OFF = 0, /* disabled */
68 ARCHIVE_MODE_ON, /* enabled while server is running normally */
69 ARCHIVE_MODE_ALWAYS, /* enabled always (even during recovery) */
ArchiveMode
Definition xlog.h:66
@ ARCHIVE_MODE_ALWAYS
Definition xlog.h:69
@ ARCHIVE_MODE_OFF
Definition xlog.h:67
@ ARCHIVE_MODE_ON
Definition xlog.h:68

◆ RecoveryState

Enumerator
RECOVERY_STATE_CRASH 
RECOVERY_STATE_ARCHIVE 
RECOVERY_STATE_DONE 

Definition at line 91 of file xlog.h.

92{
93 RECOVERY_STATE_CRASH = 0, /* crash recovery */
94 RECOVERY_STATE_ARCHIVE, /* archive recovery */
95 RECOVERY_STATE_DONE, /* currently in production */
@ RECOVERY_STATE_CRASH
Definition xlog.h:93
@ RECOVERY_STATE_DONE
Definition xlog.h:95
@ RECOVERY_STATE_ARCHIVE
Definition xlog.h:94

◆ SessionBackupState

Enumerator
SESSION_BACKUP_NONE 
SESSION_BACKUP_RUNNING 

Definition at line 317 of file xlog.h.

◆ WALAvailability

Enumerator
WALAVAIL_INVALID_LSN 
WALAVAIL_RESERVED 
WALAVAIL_EXTENDED 
WALAVAIL_UNRESERVED 
WALAVAIL_REMOVED 

Definition at line 199 of file xlog.h.

201{
202 WALAVAIL_INVALID_LSN, /* parameter error */
203 WALAVAIL_RESERVED, /* WAL segment is within max_wal_size */
204 WALAVAIL_EXTENDED, /* WAL segment is reserved by a slot or
205 * wal_keep_size */
206 WALAVAIL_UNRESERVED, /* no longer reserved, but not removed yet */
207 WALAVAIL_REMOVED, /* WAL segment has been removed */

◆ WalCompression

Enumerator
WAL_COMPRESSION_NONE 
WAL_COMPRESSION_PGLZ 
WAL_COMPRESSION_LZ4 
WAL_COMPRESSION_ZSTD 

Definition at line 82 of file xlog.h.

83{
WalCompression
Definition xlog.h:83
@ WAL_COMPRESSION_NONE
Definition xlog.h:84
@ WAL_COMPRESSION_LZ4
Definition xlog.h:86
@ WAL_COMPRESSION_PGLZ
Definition xlog.h:85
@ WAL_COMPRESSION_ZSTD
Definition xlog.h:87

◆ WalLevel

Enumerator
WAL_LEVEL_MINIMAL 
WAL_LEVEL_REPLICA 
WAL_LEVEL_LOGICAL 

Definition at line 74 of file xlog.h.

75{
79} WalLevel;
@ WAL_LEVEL_REPLICA
Definition xlog.h:77
@ WAL_LEVEL_LOGICAL
Definition xlog.h:78
@ WAL_LEVEL_MINIMAL
Definition xlog.h:76

◆ WalSyncMethod

Enumerator
WAL_SYNC_METHOD_FSYNC 
WAL_SYNC_METHOD_FDATASYNC 
WAL_SYNC_METHOD_OPEN 
WAL_SYNC_METHOD_FSYNC_WRITETHROUGH 
WAL_SYNC_METHOD_OPEN_DSYNC 

Definition at line 23 of file xlog.h.

24{
27 WAL_SYNC_METHOD_OPEN, /* for O_SYNC */
29 WAL_SYNC_METHOD_OPEN_DSYNC /* for O_DSYNC */
30};
@ WAL_SYNC_METHOD_OPEN
Definition xlog.h:27
@ WAL_SYNC_METHOD_FDATASYNC
Definition xlog.h:26
@ WAL_SYNC_METHOD_FSYNC_WRITETHROUGH
Definition xlog.h:28
@ WAL_SYNC_METHOD_OPEN_DSYNC
Definition xlog.h:29
@ WAL_SYNC_METHOD_FSYNC
Definition xlog.h:25

Function Documentation

◆ BootStrapXLOG()

void BootStrapXLOG ( uint32  data_checksum_version)
extern

Definition at line 5453 of file xlog.c.

5454{
5455 CheckPoint checkPoint;
5456 PGAlignedXLogBlock buffer;
5457 XLogPageHeader page;
5459 XLogRecord *record;
5460 char *recptr;
5461 uint64 sysidentifier;
5462 struct timeval tv;
5463 pg_crc32c crc;
5464
5465 /* allow ordinary WAL segment creation, like StartupXLOG() would */
5467
5468 /*
5469 * Select a hopefully-unique system identifier code for this installation.
5470 * We use the result of gettimeofday(), including the fractional seconds
5471 * field, as being about as unique as we can easily get. (Think not to
5472 * use random(), since it hasn't been seeded and there's no portable way
5473 * to seed it other than the system clock value...) The upper half of the
5474 * uint64 value is just the tv_sec part, while the lower half contains the
5475 * tv_usec part (which must fit in 20 bits), plus 12 bits from our current
5476 * PID for a little extra uniqueness. A person knowing this encoding can
5477 * determine the initialization time of the installation, which could
5478 * perhaps be useful sometimes.
5479 */
5480 gettimeofday(&tv, NULL);
5481 sysidentifier = ((uint64) tv.tv_sec) << 32;
5482 sysidentifier |= ((uint64) tv.tv_usec) << 12;
5483 sysidentifier |= getpid() & 0xFFF;
5484
5485 memset(&buffer, 0, sizeof buffer);
5486 page = (XLogPageHeader) &buffer;
5487
5488 /*
5489 * Set up information for the initial checkpoint record
5490 *
5491 * The initial checkpoint record is written to the beginning of the WAL
5492 * segment with logid=0 logseg=1. The very first WAL segment, 0/0, is not
5493 * used, so that we can use 0/0 to mean "before any valid WAL segment".
5494 */
5498 checkPoint.fullPageWrites = fullPageWrites;
5500 checkPoint.wal_level = wal_level;
5501 checkPoint.nextXid =
5503 checkPoint.nextOid = FirstGenbkiObjectId;
5504 checkPoint.nextMulti = FirstMultiXactId;
5505 checkPoint.nextMultiOffset = 1;
5507 checkPoint.oldestXidDB = Template1DbOid;
5508 checkPoint.oldestMulti = FirstMultiXactId;
5509 checkPoint.oldestMultiDB = Template1DbOid;
5512 checkPoint.time = (pg_time_t) time(NULL);
5514 checkPoint.dataChecksumState = data_checksum_version;
5515
5516 TransamVariables->nextXid = checkPoint.nextXid;
5517 TransamVariables->nextOid = checkPoint.nextOid;
5519 MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset);
5520 AdvanceOldestClogXid(checkPoint.oldestXid);
5521 SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB);
5522 SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB);
5524
5525 /* Set up the XLOG page header */
5526 page->xlp_magic = XLOG_PAGE_MAGIC;
5527 page->xlp_info = XLP_LONG_HEADER;
5531 longpage->xlp_sysid = sysidentifier;
5532 longpage->xlp_seg_size = wal_segment_size;
5533 longpage->xlp_xlog_blcksz = XLOG_BLCKSZ;
5534
5535 /* Insert the initial checkpoint record */
5536 recptr = ((char *) page + SizeOfXLogLongPHD);
5537 record = (XLogRecord *) recptr;
5538 record->xl_prev = InvalidXLogRecPtr;
5539 record->xl_xid = InvalidTransactionId;
5540 record->xl_tot_len = SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(checkPoint);
5542 record->xl_rmid = RM_XLOG_ID;
5544 /* fill the XLogRecordDataHeaderShort struct */
5545 *(recptr++) = (char) XLR_BLOCK_ID_DATA_SHORT;
5546 *(recptr++) = sizeof(checkPoint);
5547 memcpy(recptr, &checkPoint, sizeof(checkPoint));
5548 recptr += sizeof(checkPoint);
5549 Assert(recptr - (char *) record == record->xl_tot_len);
5550
5552 COMP_CRC32C(crc, ((char *) record) + SizeOfXLogRecord, record->xl_tot_len - SizeOfXLogRecord);
5553 COMP_CRC32C(crc, (char *) record, offsetof(XLogRecord, xl_crc));
5554 FIN_CRC32C(crc);
5555 record->xl_crc = crc;
5556
5557 /* Create first XLOG segment file */
5560
5561 /*
5562 * We needn't bother with Reserve/ReleaseExternalFD here, since we'll
5563 * close the file again in a moment.
5564 */
5565
5566 /* Write the first page with the initial record */
5567 errno = 0;
5569 if (write(openLogFile, &buffer, XLOG_BLCKSZ) != XLOG_BLCKSZ)
5570 {
5571 /* if write didn't set errno, assume problem is no disk space */
5572 if (errno == 0)
5573 errno = ENOSPC;
5574 ereport(PANIC,
5576 errmsg("could not write bootstrap write-ahead log file: %m")));
5577 }
5579
5581 if (pg_fsync(openLogFile) != 0)
5582 ereport(PANIC,
5584 errmsg("could not fsync bootstrap write-ahead log file: %m")));
5586
5587 if (close(openLogFile) != 0)
5588 ereport(PANIC,
5590 errmsg("could not close bootstrap write-ahead log file: %m")));
5591
5592 openLogFile = -1;
5593
5594 /* Now create pg_control */
5595 InitControlFile(sysidentifier, data_checksum_version);
5596 ControlFile->time = checkPoint.time;
5597 ControlFile->checkPoint = checkPoint.redo;
5598 ControlFile->checkPointCopy = checkPoint;
5599
5600 /* some additional ControlFile fields are set in WriteControlFile() */
5602
5603 /* Bootstrap the commit log, too */
5604 BootStrapCLOG();
5608
5609 /*
5610 * Force control file to be read - in contrast to normal processing we'd
5611 * otherwise never run the checks and GUC related initializations therein.
5612 */
5614}
#define Assert(condition)
Definition c.h:1002
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
void BootStrapCLOG(void)
Definition clog.c:850
void BootStrapCommitTs(void)
Definition commit_ts.c:599
void SetCommitTsLimit(TransactionId oldestXact, TransactionId newestXact)
Definition commit_ts.c:892
int errcode_for_file_access(void)
Definition elog.c:898
#define PANIC
Definition elog.h:44
#define ereport(elevel,...)
Definition elog.h:152
int pg_fsync(int fd)
Definition fd.c:390
#define close(a)
Definition win32.h:12
#define write(a, b, c)
Definition win32.h:14
void MultiXactSetNextMXact(MultiXactId nextMulti, MultiXactOffset nextMultiOffset)
Definition multixact.c:2063
void BootStrapMultiXact(void)
Definition multixact.c:1863
void SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid)
Definition multixact.c:2085
#define FirstMultiXactId
Definition multixact.h:26
static char * errmsg
#define XLOG_CHECKPOINT_SHUTDOWN
Definition pg_control.h:72
uint32 pg_crc32c
Definition pg_crc32c.h:38
#define COMP_CRC32C(crc, data, len)
Definition pg_crc32c.h:177
#define INIT_CRC32C(crc)
Definition pg_crc32c.h:41
#define FIN_CRC32C(crc)
Definition pg_crc32c.h:182
return crc
int64 pg_time_t
Definition pgtime.h:23
Oid oldestMultiDB
Definition pg_control.h:52
MultiXactId oldestMulti
Definition pg_control.h:51
MultiXactOffset nextMultiOffset
Definition pg_control.h:48
TransactionId newestCommitTsXid
Definition pg_control.h:56
TransactionId oldestXid
Definition pg_control.h:49
TimeLineID PrevTimeLineID
Definition pg_control.h:40
TimeLineID ThisTimeLineID
Definition pg_control.h:39
TransactionId oldestActiveXid
Definition pg_control.h:65
bool fullPageWrites
Definition pg_control.h:42
MultiXactId nextMulti
Definition pg_control.h:47
FullTransactionId nextXid
Definition pg_control.h:45
TransactionId oldestCommitTsXid
Definition pg_control.h:54
pg_time_t time
Definition pg_control.h:53
int wal_level
Definition pg_control.h:43
bool logicalDecodingEnabled
Definition pg_control.h:44
uint32 dataChecksumState
Definition pg_control.h:68
XLogRecPtr redo
Definition pg_control.h:37
Oid oldestXidDB
Definition pg_control.h:50
CheckPoint checkPointCopy
Definition pg_control.h:143
pg_time_t time
Definition pg_control.h:140
XLogRecPtr checkPoint
Definition pg_control.h:141
FullTransactionId nextXid
Definition transam.h:220
XLogRecPtr xlp_pageaddr
XLogRecPtr xl_prev
Definition xlogrecord.h:45
uint8 xl_info
Definition xlogrecord.h:46
uint32 xl_tot_len
Definition xlogrecord.h:43
TransactionId xl_xid
Definition xlogrecord.h:44
RmgrId xl_rmid
Definition xlogrecord.h:47
void BootStrapSUBTRANS(void)
Definition subtrans.c:288
#define InvalidTransactionId
Definition transam.h:31
#define FirstGenbkiObjectId
Definition transam.h:195
#define FirstNormalTransactionId
Definition transam.h:34
static FullTransactionId FullTransactionIdFromEpochAndXid(uint32 epoch, TransactionId xid)
Definition transam.h:71
void SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid)
Definition varsup.c:367
void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid)
Definition varsup.c:350
TransamVariablesData * TransamVariables
Definition varsup.c:37
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition wait_event.h:67
static void pgstat_report_wait_end(void)
Definition wait_event.h:83
int gettimeofday(struct timeval *tp, void *tzp)
int XLogFileInit(XLogSegNo logsegno, TimeLineID logtli)
Definition xlog.c:3430
bool fullPageWrites
Definition xlog.c:129
static void InitControlFile(uint64 sysidentifier, uint32 data_checksum_version)
Definition xlog.c:4254
void SetInstallXLogFileSegmentActive(void)
Definition xlog.c:10159
static int openLogFile
Definition xlog.c:655
int wal_level
Definition xlog.c:138
static void WriteControlFile(void)
Definition xlog.c:4295
int wal_segment_size
Definition xlog.c:150
static TimeLineID openLogTLI
Definition xlog.c:657
static ControlFileData * ControlFile
Definition xlog.c:584
#define BootstrapTimeLineID
Definition xlog.c:118
static void ReadControlFile(void)
Definition xlog.c:4405
XLogLongPageHeaderData * XLogLongPageHeader
XLogPageHeaderData * XLogPageHeader
#define XLP_LONG_HEADER
#define XLOG_PAGE_MAGIC
#define SizeOfXLogLongPHD
#define InvalidXLogRecPtr
Definition xlogdefs.h:28
#define SizeOfXLogRecordDataHeaderShort
Definition xlogrecord.h:217
#define XLR_BLOCK_ID_DATA_SHORT
Definition xlogrecord.h:241
#define SizeOfXLogRecord
Definition xlogrecord.h:55

References AdvanceOldestClogXid(), Assert, BootStrapCLOG(), BootStrapCommitTs(), BootStrapMultiXact(), BootStrapSUBTRANS(), BootstrapTimeLineID, ControlFileData::checkPoint, ControlFileData::checkPointCopy, close, COMP_CRC32C, ControlFile, crc, CheckPoint::dataChecksumState, ereport, errcode_for_file_access(), errmsg, fb(), FIN_CRC32C, FirstGenbkiObjectId, FirstMultiXactId, FirstNormalTransactionId, fullPageWrites, CheckPoint::fullPageWrites, FullTransactionIdFromEpochAndXid(), gettimeofday(), INIT_CRC32C, InitControlFile(), InvalidTransactionId, InvalidXLogRecPtr, CheckPoint::logicalDecodingEnabled, memcpy(), MultiXactSetNextMXact(), CheckPoint::newestCommitTsXid, CheckPoint::nextMulti, CheckPoint::nextMultiOffset, TransamVariablesData::nextOid, CheckPoint::nextOid, TransamVariablesData::nextXid, CheckPoint::nextXid, TransamVariablesData::oidCount, CheckPoint::oldestActiveXid, CheckPoint::oldestCommitTsXid, CheckPoint::oldestMulti, CheckPoint::oldestMultiDB, CheckPoint::oldestXid, CheckPoint::oldestXidDB, openLogFile, openLogTLI, PANIC, pg_fsync(), pgstat_report_wait_end(), pgstat_report_wait_start(), CheckPoint::PrevTimeLineID, ReadControlFile(), CheckPoint::redo, SetCommitTsLimit(), SetInstallXLogFileSegmentActive(), SetMultiXactIdLimit(), SetTransactionIdLimit(), SizeOfXLogLongPHD, SizeOfXLogRecord, SizeOfXLogRecordDataHeaderShort, CheckPoint::ThisTimeLineID, CheckPoint::time, ControlFileData::time, TransamVariables, wal_level, CheckPoint::wal_level, WAL_LEVEL_LOGICAL, wal_segment_size, write, WriteControlFile(), XLogRecord::xl_crc, XLogRecord::xl_info, XLogRecord::xl_prev, XLogRecord::xl_rmid, XLogRecord::xl_tot_len, XLogRecord::xl_xid, XLOG_CHECKPOINT_SHUTDOWN, XLOG_PAGE_MAGIC, XLogFileInit(), XLogPageHeaderData::xlp_info, XLP_LONG_HEADER, XLogPageHeaderData::xlp_magic, XLogPageHeaderData::xlp_pageaddr, XLogPageHeaderData::xlp_tli, and XLR_BLOCK_ID_DATA_SHORT.

Referenced by BootstrapModeMain().

◆ CheckXLogRemoved()

void CheckXLogRemoved ( XLogSegNo  segno,
TimeLineID  tli 
)
extern

Definition at line 3777 of file xlog.c.

3778{
3779 int save_errno = errno;
3780 XLogSegNo lastRemovedSegNo;
3781
3783 lastRemovedSegNo = XLogCtl->lastRemovedSegNo;
3785
3786 if (segno <= lastRemovedSegNo)
3787 {
3788 char filename[MAXFNAMELEN];
3789
3791 errno = save_errno;
3792 ereport(ERROR,
3794 errmsg("requested WAL segment %s has already been removed",
3795 filename)));
3796 }
3797 errno = save_errno;
3798}
#define ERROR
Definition elog.h:40
static char * filename
Definition pg_dumpall.c:120
static void SpinLockRelease(volatile slock_t *lock)
Definition spin.h:62
static void SpinLockAcquire(volatile slock_t *lock)
Definition spin.h:56
slock_t info_lck
Definition xlog.c:562
XLogSegNo lastRemovedSegNo
Definition xlog.c:467
static XLogCtlData * XLogCtl
Definition xlog.c:575
#define MAXFNAMELEN
static void XLogFileName(char *fname, TimeLineID tli, XLogSegNo logSegNo, int wal_segsz_bytes)

References ereport, errcode_for_file_access(), errmsg, ERROR, fb(), filename, XLogCtlData::info_lck, XLogCtlData::lastRemovedSegNo, MAXFNAMELEN, SpinLockAcquire(), SpinLockRelease(), wal_segment_size, XLogCtl, and XLogFileName().

Referenced by logical_read_xlog_page(), perform_base_backup(), and XLogSendPhysical().

◆ CreateCheckPoint()

bool CreateCheckPoint ( int  flags)
extern

Definition at line 7400 of file xlog.c.

7401{
7402 bool shutdown;
7403 CheckPoint checkPoint;
7407 uint32 freespace;
7411 int nvxids;
7412 int oldXLogAllowed = 0;
7413
7414 /*
7415 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
7416 * issued at a different time.
7417 */
7419 shutdown = true;
7420 else
7421 shutdown = false;
7422
7423 /* sanity check */
7424 if (RecoveryInProgress() && (flags & CHECKPOINT_END_OF_RECOVERY) == 0)
7425 elog(ERROR, "can't create a checkpoint during recovery");
7426
7427 /*
7428 * Prepare to accumulate statistics.
7429 *
7430 * Note: because it is possible for log_checkpoints to change while a
7431 * checkpoint proceeds, we always accumulate stats, even if
7432 * log_checkpoints is currently off.
7433 */
7436
7437 /*
7438 * Let smgr prepare for checkpoint; this has to happen outside the
7439 * critical section and before we determine the REDO pointer. Note that
7440 * smgr must not do anything that'd have to be undone if we decide no
7441 * checkpoint is needed.
7442 */
7444
7445 /* Run these points outside the critical section. */
7446 INJECTION_POINT("create-checkpoint-initial", NULL);
7447 INJECTION_POINT_LOAD("create-checkpoint-run");
7448
7449 /*
7450 * Use a critical section to force system panic if we have trouble.
7451 */
7453
7454 if (shutdown)
7455 {
7460 }
7461
7462 /* Begin filling in the checkpoint WAL record */
7463 MemSet(&checkPoint, 0, sizeof(checkPoint));
7464 checkPoint.time = (pg_time_t) time(NULL);
7465
7466 /*
7467 * For Hot Standby, derive the oldestActiveXid before we fix the redo
7468 * pointer. This allows us to begin accumulating changes to assemble our
7469 * starting snapshot of locks and transactions.
7470 */
7472 checkPoint.oldestActiveXid = GetOldestActiveTransactionId(false, true);
7473 else
7475
7476 /*
7477 * Get location of last important record before acquiring insert locks (as
7478 * GetLastImportantRecPtr() also locks WAL locks).
7479 */
7481
7482 /*
7483 * If this isn't a shutdown or forced checkpoint, and if there has been no
7484 * WAL activity requiring a checkpoint, skip it. The idea here is to
7485 * avoid inserting duplicate checkpoints when the system is idle.
7486 */
7488 CHECKPOINT_FORCE)) == 0)
7489 {
7491 {
7494 (errmsg_internal("checkpoint skipped because system is idle")));
7495 return false;
7496 }
7497 }
7498
7499 /*
7500 * An end-of-recovery checkpoint is created before anyone is allowed to
7501 * write WAL. To allow us to write the checkpoint record, temporarily
7502 * enable XLogInsertAllowed.
7503 */
7504 if (flags & CHECKPOINT_END_OF_RECOVERY)
7506
7508 if (flags & CHECKPOINT_END_OF_RECOVERY)
7510 else
7511 checkPoint.PrevTimeLineID = checkPoint.ThisTimeLineID;
7512
7513 /*
7514 * We must block concurrent insertions while examining insert state.
7515 */
7517
7518 checkPoint.fullPageWrites = Insert->fullPageWrites;
7519 checkPoint.wal_level = wal_level;
7520
7521 /*
7522 * Get the current data_checksum_version value from xlogctl, valid at the
7523 * time of the checkpoint.
7524 */
7528
7529 if (shutdown)
7530 {
7532
7533 /*
7534 * Compute new REDO record ptr = location of next XLOG record.
7535 *
7536 * Since this is a shutdown checkpoint, there can't be any concurrent
7537 * WAL insertion.
7538 */
7539 freespace = INSERT_FREESPACE(curInsert);
7540 if (freespace == 0)
7541 {
7544 else
7546 }
7547 checkPoint.redo = curInsert;
7548
7549 /*
7550 * Here we update the shared RedoRecPtr for future XLogInsert calls;
7551 * this must be done while holding all the insertion locks.
7552 *
7553 * Note: if we fail to complete the checkpoint, RedoRecPtr will be
7554 * left pointing past where it really needs to point. This is okay;
7555 * the only consequence is that XLogInsert might back up whole buffers
7556 * that it didn't really need to. We can't postpone advancing
7557 * RedoRecPtr because XLogInserts that happen while we are dumping
7558 * buffers must assume that their buffer changes are not included in
7559 * the checkpoint.
7560 */
7561 RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo;
7562 }
7563
7564 /*
7565 * Now we can release the WAL insertion locks, allowing other xacts to
7566 * proceed while we are flushing disk buffers.
7567 */
7569
7570 /*
7571 * If this is an online checkpoint, we have not yet determined the redo
7572 * point. We do so now by inserting the special XLOG_CHECKPOINT_REDO
7573 * record; the LSN at which it starts becomes the new redo pointer. We
7574 * don't do this for a shutdown checkpoint, because in that case no WAL
7575 * can be written between the redo point and the insertion of the
7576 * checkpoint record itself, so the checkpoint record itself serves to
7577 * mark the redo point.
7578 */
7579 if (!shutdown)
7580 {
7582
7584 redo_rec.wal_level = wal_level;
7586 redo_rec.data_checksum_version = XLogCtl->data_checksum_version;
7589
7590 /* Include WAL level in record for WAL summarizer's benefit. */
7594
7595 /*
7596 * XLogInsertRecord will have updated XLogCtl->Insert.RedoRecPtr in
7597 * shared memory and RedoRecPtr in backend-local memory, but we need
7598 * to copy that into the record that will be inserted when the
7599 * checkpoint is complete.
7600 */
7601 checkPoint.redo = RedoRecPtr;
7602 }
7603
7604 /* Update the info_lck-protected copy of RedoRecPtr as well */
7606 XLogCtl->RedoRecPtr = checkPoint.redo;
7608
7609 /*
7610 * If enabled, log checkpoint start. We postpone this until now so as not
7611 * to log anything if we decided to skip the checkpoint.
7612 */
7613 if (log_checkpoints)
7614 LogCheckpointStart(flags, false);
7615
7616 INJECTION_POINT_CACHED("create-checkpoint-run", NULL);
7617
7618 /* Update the process title */
7619 update_checkpoint_display(flags, false, false);
7620
7622
7623 /*
7624 * Get the other info we need for the checkpoint record.
7625 *
7626 * We don't need to save oldestClogXid in the checkpoint, it only matters
7627 * for the short period in which clog is being truncated, and if we crash
7628 * during that we'll redo the clog truncation and fix up oldestClogXid
7629 * there.
7630 */
7632 checkPoint.nextXid = TransamVariables->nextXid;
7633 checkPoint.oldestXid = TransamVariables->oldestXid;
7636
7641
7643 checkPoint.nextOid = TransamVariables->nextOid;
7644 if (!shutdown)
7645 checkPoint.nextOid += TransamVariables->oidCount;
7647
7649
7651 &checkPoint.nextMulti,
7652 &checkPoint.nextMultiOffset,
7653 &checkPoint.oldestMulti,
7654 &checkPoint.oldestMultiDB);
7655
7656 /*
7657 * Having constructed the checkpoint record, ensure all shmem disk buffers
7658 * and commit-log buffers are flushed to disk.
7659 *
7660 * This I/O could fail for various reasons. If so, we will fail to
7661 * complete the checkpoint, but there is no reason to force a system
7662 * panic. Accordingly, exit critical section while doing it.
7663 */
7665
7666 /*
7667 * In some cases there are groups of actions that must all occur on one
7668 * side or the other of a checkpoint record. Before flushing the
7669 * checkpoint record we must explicitly wait for any backend currently
7670 * performing those groups of actions.
7671 *
7672 * One example is end of transaction, so we must wait for any transactions
7673 * that are currently in commit critical sections. If an xact inserted
7674 * its commit record into XLOG just before the REDO point, then a crash
7675 * restart from the REDO point would not replay that record, which means
7676 * that our flushing had better include the xact's update of pg_xact. So
7677 * we wait till he's out of his commit critical section before proceeding.
7678 * See notes in RecordTransactionCommit().
7679 *
7680 * Because we've already released the insertion locks, this test is a bit
7681 * fuzzy: it is possible that we will wait for xacts we didn't really need
7682 * to wait for. But the delay should be short and it seems better to make
7683 * checkpoint take a bit longer than to hold off insertions longer than
7684 * necessary. (In fact, the whole reason we have this issue is that xact.c
7685 * does commit record XLOG insertion and clog update as two separate steps
7686 * protected by different locks, but again that seems best on grounds of
7687 * minimizing lock contention.)
7688 *
7689 * A transaction that has not yet set delayChkptFlags when we look cannot
7690 * be at risk, since it has not inserted its commit record yet; and one
7691 * that's already cleared it is not at risk either, since it's done fixing
7692 * clog and we will correctly flush the update below. So we cannot miss
7693 * any xacts we need to wait for.
7694 */
7696 if (nvxids > 0)
7697 {
7698 do
7699 {
7700 /*
7701 * Keep absorbing fsync requests while we wait. There could even
7702 * be a deadlock if we don't, if the process that prevents the
7703 * checkpoint is trying to add a request to the queue.
7704 */
7706
7708 pg_usleep(10000L); /* wait for 10 msec */
7712 }
7713 pfree(vxids);
7714
7715 CheckPointGuts(checkPoint.redo, flags);
7716
7718 if (nvxids > 0)
7719 {
7720 do
7721 {
7723
7725 pg_usleep(10000L); /* wait for 10 msec */
7729 }
7730 pfree(vxids);
7731
7732 /*
7733 * Take a snapshot of running transactions and write this to WAL. This
7734 * allows us to reconstruct the state of running transactions during
7735 * archive recovery, if required. Skip, if this info disabled.
7736 *
7737 * If we are shutting down, or Startup process is completing crash
7738 * recovery we don't need to write running xact data.
7739 */
7742
7744
7745 /*
7746 * Now insert the checkpoint record into XLOG.
7747 */
7749 XLogRegisterData(&checkPoint, sizeof(checkPoint));
7753
7755
7756 /*
7757 * We mustn't write any new WAL after a shutdown checkpoint, or it will be
7758 * overwritten at next startup. No-one should even try, this just allows
7759 * sanity-checking. In the case of an end-of-recovery checkpoint, we want
7760 * to just temporarily disable writing until the system has exited
7761 * recovery.
7762 */
7763 if (shutdown)
7764 {
7765 if (flags & CHECKPOINT_END_OF_RECOVERY)
7767 else
7768 LocalXLogInsertAllowed = 0; /* never again write WAL */
7769 }
7770
7771 /*
7772 * We now have ProcLastRecPtr = start of actual checkpoint record, recptr
7773 * = end of actual checkpoint record.
7774 */
7775 if (shutdown && checkPoint.redo != ProcLastRecPtr)
7776 ereport(PANIC,
7777 (errmsg("concurrent write-ahead log activity while database system is shutting down")));
7778
7779 /*
7780 * Remember the prior checkpoint's redo ptr for
7781 * UpdateCheckPointDistanceEstimate()
7782 */
7784
7785 /*
7786 * Update the control file.
7787 */
7789 if (shutdown)
7792 ControlFile->checkPointCopy = checkPoint;
7793 /* crash recovery should always recover to the end of WAL */
7796
7797 /*
7798 * Persist unloggedLSN value. It's reset on crash recovery, so this goes
7799 * unused on non-shutdown checkpoints, but seems useful to store it always
7800 * for debugging purposes.
7801 */
7803
7806
7807 /*
7808 * We are now done with critical updates; no need for system panic if we
7809 * have trouble while fooling with old log segments.
7810 */
7812
7813 /*
7814 * WAL summaries end when the next XLOG_CHECKPOINT_REDO or
7815 * XLOG_CHECKPOINT_SHUTDOWN record is reached. This is the first point
7816 * where (a) we're not inside of a critical section and (b) we can be
7817 * certain that the relevant record has been flushed to disk, which must
7818 * happen before it can be summarized.
7819 *
7820 * If this is a shutdown checkpoint, then this happens reasonably
7821 * promptly: we've only just inserted and flushed the
7822 * XLOG_CHECKPOINT_SHUTDOWN record. If this is not a shutdown checkpoint,
7823 * then this might not be very prompt at all: the XLOG_CHECKPOINT_REDO
7824 * record was written before we began flushing data to disk, and that
7825 * could be many minutes ago at this point. However, we don't XLogFlush()
7826 * after inserting that record, so we're not guaranteed that it's on disk
7827 * until after the above call that flushes the XLOG_CHECKPOINT_ONLINE
7828 * record.
7829 */
7831
7832 /*
7833 * Let smgr do post-checkpoint cleanup (eg, deleting old files).
7834 */
7836
7837 /*
7838 * Update the average distance between checkpoints if the prior checkpoint
7839 * exists.
7840 */
7843
7844 INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
7845
7846 /*
7847 * Delete old log files, those no longer needed for last checkpoint to
7848 * prevent the disk holding the xlog from growing full.
7849 */
7855 {
7856 /*
7857 * Some slots have been invalidated; recalculate the old-segment
7858 * horizon, starting again from RedoRecPtr.
7859 */
7862 }
7863 _logSegNo--;
7865 checkPoint.ThisTimeLineID);
7866
7867 /*
7868 * Make more log segments if needed. (Do this after recycling old log
7869 * segments, since that may supply some of the needed files.)
7870 */
7871 if (!shutdown)
7873
7874 /*
7875 * Truncate pg_subtrans if possible. We can throw away all data before
7876 * the oldest XMIN of any running transaction. No future transaction will
7877 * attempt to reference any pg_subtrans entry older than that (see Asserts
7878 * in subtrans.c). During recovery, though, we mustn't do this because
7879 * StartupSUBTRANS hasn't been called yet.
7880 */
7881 if (!RecoveryInProgress())
7883
7884 /* Real work is done; log and update stats. */
7885 LogCheckpointEnd(false, flags);
7886
7887 /* Reset the process title */
7888 update_checkpoint_display(flags, false, true);
7889
7891 NBuffers,
7895
7896 return true;
7897}
static uint64 pg_atomic_read_membarrier_u64(volatile pg_atomic_uint64 *ptr)
Definition atomics.h:471
TimestampTz GetCurrentTimestamp(void)
Definition timestamp.c:1649
#define MemSet(start, val, len)
Definition c.h:1166
void AbsorbSyncRequests(void)
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
#define DEBUG1
Definition elog.h:31
#define elog(elevel,...)
Definition elog.h:228
static void Insert(File file)
Definition fd.c:1301
int NBuffers
Definition globals.c:144
#define INJECTION_POINT(name, arg)
#define INJECTION_POINT_CACHED(name, arg)
#define INJECTION_POINT_LOAD(name)
bool IsLogicalDecodingEnabled(void)
Definition logicalctl.c:202
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition lwlock.c:1150
void LWLockRelease(LWLock *lock)
Definition lwlock.c:1767
@ LW_SHARED
Definition lwlock.h:105
@ LW_EXCLUSIVE
Definition lwlock.h:104
void pfree(void *pointer)
Definition mcxt.c:1619
#define START_CRIT_SECTION()
Definition miscadmin.h:152
#define END_CRIT_SECTION()
Definition miscadmin.h:154
void MultiXactGetCheckptMulti(bool is_shutdown, MultiXactId *nextMulti, MultiXactOffset *nextMultiOffset, MultiXactId *oldestMulti, Oid *oldestMultiDB)
Definition multixact.c:2017
#define XLOG_CHECKPOINT_REDO
Definition pg_control.h:86
@ DB_SHUTDOWNING
Definition pg_control.h:102
@ DB_SHUTDOWNED
Definition pg_control.h:100
#define XLOG_CHECKPOINT_ONLINE
Definition pg_control.h:73
#define InvalidOid
#define DELAY_CHKPT_START
Definition proc.h:139
#define DELAY_CHKPT_COMPLETE
Definition proc.h:140
TransactionId GetOldestTransactionIdConsideredRunning(void)
Definition procarray.c:1973
bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids, int type)
Definition procarray.c:3049
TransactionId GetOldestActiveTransactionId(bool inCommitOnly, bool allDbs)
Definition procarray.c:2832
VirtualTransactionId * GetVirtualXIDsDelayingChkpt(int *nvxids, int type)
Definition procarray.c:3004
void pg_usleep(long microsec)
Definition signal.c:53
bool InvalidateObsoleteReplicationSlots(uint32 possible_causes, XLogSegNo oldestSegno, Oid dboid, TransactionId snapshotConflictHorizon)
Definition slot.c:2216
@ RS_INVAL_WAL_REMOVED
Definition slot.h:62
@ RS_INVAL_IDLE_TIMEOUT
Definition slot.h:68
XLogRecPtr LogStandbySnapshot(void)
Definition standby.c:1284
TimestampTz ckpt_start_t
Definition xlog.h:173
int ckpt_segs_removed
Definition xlog.h:183
int ckpt_bufs_written
Definition xlog.h:179
int ckpt_segs_recycled
Definition xlog.h:184
XLogRecPtr minRecoveryPoint
Definition pg_control.h:176
XLogRecPtr unloggedLSN
Definition pg_control.h:145
TimeLineID minRecoveryPointTLI
Definition pg_control.h:177
TransactionId oldestCommitTsXid
Definition transam.h:232
TransactionId newestCommitTsXid
Definition transam.h:233
TransactionId oldestXid
Definition transam.h:222
uint32 data_checksum_version
Definition xlog.c:560
TimeLineID InsertTimeLineID
Definition xlog.c:515
XLogRecPtr RedoRecPtr
Definition xlog.c:463
XLogCtlInsert Insert
Definition xlog.c:459
TimeLineID PrevTimeLineID
Definition xlog.c:516
pg_atomic_uint64 unloggedLSN
Definition xlog.c:470
XLogRecPtr RedoRecPtr
Definition xlog.c:437
void TruncateSUBTRANS(TransactionId oldestXact)
Definition subtrans.c:404
void SyncPreCheckpoint(void)
Definition sync.c:178
void SyncPostCheckpoint(void)
Definition sync.c:203
void WakeupWalSummarizer(void)
XLogRecPtr ProcLastRecPtr
Definition xlog.c:260
bool RecoveryInProgress(void)
Definition xlog.c:6835
static void WALInsertLockRelease(void)
Definition xlog.c:1486
static XLogRecPtr XLogBytePosToRecPtr(uint64 bytepos)
Definition xlog.c:1899
static void WALInsertLockAcquireExclusive(void)
Definition xlog.c:1457
static void UpdateControlFile(void)
Definition xlog.c:4633
static void RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr, TimeLineID insertTLI)
Definition xlog.c:3915
static void LogCheckpointStart(int flags, bool restartpoint)
Definition xlog.c:7172
static XLogRecPtr RedoRecPtr
Definition xlog.c:280
static void LogCheckpointEnd(bool restartpoint, int flags)
Definition xlog.c:7190
static void WALInsertLockAcquire(void)
Definition xlog.c:1412
static void PreallocXlogFiles(XLogRecPtr endptr, TimeLineID tli)
Definition xlog.c:3740
bool log_checkpoints
Definition xlog.c:136
static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
Definition xlog.c:8498
static int LocalSetXLogInsertAllowed(void)
Definition xlog.c:6923
XLogRecPtr GetLastImportantRecPtr(void)
Definition xlog.c:7057
static void UpdateCheckPointDistanceEstimate(uint64 nbytes)
Definition xlog.c:7297
#define INSERT_FREESPACE(endptr)
Definition xlog.c:600
static int LocalXLogInsertAllowed
Definition xlog.c:243
CheckpointStatsData CheckpointStats
Definition xlog.c:216
void XLogFlush(XLogRecPtr record)
Definition xlog.c:2800
static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags)
Definition xlog.c:8049
static void update_checkpoint_display(int flags, bool restartpoint, bool reset)
Definition xlog.c:7335
#define CHECKPOINT_END_OF_RECOVERY
Definition xlog.h:152
#define CHECKPOINT_FORCE
Definition xlog.h:154
#define CHECKPOINT_IS_SHUTDOWN
Definition xlog.h:151
#define XLogStandbyInfoActive()
Definition xlog.h:126
#define XLogSegmentOffset(xlogptr, wal_segsz_bytes)
#define XLByteToSeg(xlrp, logSegNo, wal_segsz_bytes)
#define SizeOfXLogShortPHD
#define XLogRecPtrIsValid(r)
Definition xlogdefs.h:29
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Definition xloginsert.c:482
void XLogRegisterData(const void *data, uint32 len)
Definition xloginsert.c:372
void XLogBeginInsert(void)
Definition xloginsert.c:153

References AbsorbSyncRequests(), ControlFileData::checkPoint, CHECKPOINT_END_OF_RECOVERY, CHECKPOINT_FORCE, CHECKPOINT_IS_SHUTDOWN, ControlFileData::checkPointCopy, CheckPointGuts(), CheckpointStats, CheckpointStatsData::ckpt_bufs_written, CheckpointStatsData::ckpt_segs_added, CheckpointStatsData::ckpt_segs_recycled, CheckpointStatsData::ckpt_segs_removed, CheckpointStatsData::ckpt_start_t, ControlFile, XLogCtlData::data_checksum_version, CheckPoint::dataChecksumState, DB_SHUTDOWNED, DB_SHUTDOWNING, DEBUG1, DELAY_CHKPT_COMPLETE, DELAY_CHKPT_START, elog, END_CRIT_SECTION, ereport, errmsg, errmsg_internal(), ERROR, fb(), CheckPoint::fullPageWrites, GetCurrentTimestamp(), GetLastImportantRecPtr(), GetOldestActiveTransactionId(), GetOldestTransactionIdConsideredRunning(), GetVirtualXIDsDelayingChkpt(), HaveVirtualXIDsDelayingChkpt(), XLogCtlData::info_lck, INJECTION_POINT, INJECTION_POINT_CACHED, INJECTION_POINT_LOAD, XLogCtlData::Insert, Insert(), INSERT_FREESPACE, XLogCtlData::InsertTimeLineID, InvalidateObsoleteReplicationSlots(), InvalidOid, InvalidTransactionId, InvalidXLogRecPtr, IsLogicalDecodingEnabled(), KeepLogSeg(), LocalSetXLogInsertAllowed(), LocalXLogInsertAllowed, log_checkpoints, LogCheckpointEnd(), LogCheckpointStart(), CheckPoint::logicalDecodingEnabled, LogStandbySnapshot(), LW_EXCLUSIVE, LW_SHARED, LWLockAcquire(), LWLockRelease(), MemSet, ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, MultiXactGetCheckptMulti(), NBuffers, TransamVariablesData::newestCommitTsXid, CheckPoint::newestCommitTsXid, CheckPoint::nextMulti, CheckPoint::nextMultiOffset, TransamVariablesData::nextOid, CheckPoint::nextOid, TransamVariablesData::nextXid, CheckPoint::nextXid, TransamVariablesData::oidCount, CheckPoint::oldestActiveXid, TransamVariablesData::oldestCommitTsXid, CheckPoint::oldestCommitTsXid, CheckPoint::oldestMulti, CheckPoint::oldestMultiDB, TransamVariablesData::oldestXid, CheckPoint::oldestXid, TransamVariablesData::oldestXidDB, CheckPoint::oldestXidDB, PANIC, pfree(), pg_atomic_read_membarrier_u64(), pg_usleep(), pgstat_report_wait_end(), pgstat_report_wait_start(), PreallocXlogFiles(), XLogCtlData::PrevTimeLineID, CheckPoint::PrevTimeLineID, ProcLastRecPtr, RecoveryInProgress(), CheckPoint::redo, RedoRecPtr, XLogCtlInsert::RedoRecPtr, XLogCtlData::RedoRecPtr, RemoveOldXlogFiles(), RS_INVAL_IDLE_TIMEOUT, RS_INVAL_WAL_REMOVED, SizeOfXLogLongPHD, SizeOfXLogShortPHD, SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, ControlFileData::state, SyncPostCheckpoint(), SyncPreCheckpoint(), CheckPoint::ThisTimeLineID, CheckPoint::time, TransamVariables, TruncateSUBTRANS(), XLogCtlData::unloggedLSN, ControlFileData::unloggedLSN, update_checkpoint_display(), UpdateCheckPointDistanceEstimate(), UpdateControlFile(), WakeupWalSummarizer(), wal_level, CheckPoint::wal_level, wal_segment_size, WALInsertLockAcquire(), WALInsertLockAcquireExclusive(), WALInsertLockRelease(), XLByteToSeg, XLOG_CHECKPOINT_ONLINE, XLOG_CHECKPOINT_REDO, XLOG_CHECKPOINT_SHUTDOWN, XLogBeginInsert(), XLogBytePosToRecPtr(), XLogCtl, XLogFlush(), XLogInsert(), XLogRecPtrIsValid, XLogRegisterData(), XLogSegmentOffset, and XLogStandbyInfoActive.

Referenced by CheckpointerMain(), RequestCheckpoint(), and ShutdownXLOG().

◆ CreateRestartPoint()

bool CreateRestartPoint ( int  flags)
extern

Definition at line 8129 of file xlog.c.

8130{
8131 XLogRecPtr lastCheckPointRecPtr;
8132 XLogRecPtr lastCheckPointEndPtr;
8133 CheckPoint lastCheckPoint;
8137 TimeLineID replayTLI;
8138 XLogRecPtr endptr;
8141
8142 /* Concurrent checkpoint/restartpoint cannot happen */
8144
8145 /* Get a local copy of the last safe checkpoint record. */
8147 lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;
8148 lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr;
8149 lastCheckPoint = XLogCtl->lastCheckPoint;
8151
8152 /*
8153 * Check that we're still in recovery mode. It's ok if we exit recovery
8154 * mode after this check, the restart point is valid anyway.
8155 */
8156 if (!RecoveryInProgress())
8157 {
8159 (errmsg_internal("skipping restartpoint, recovery has already ended")));
8160 return false;
8161 }
8162
8163 /*
8164 * If the last checkpoint record we've replayed is already our last
8165 * restartpoint, we can't perform a new restart point. We still update
8166 * minRecoveryPoint in that case, so that if this is a shutdown restart
8167 * point, we won't start up earlier than before. That's not strictly
8168 * necessary, but when hot standby is enabled, it would be rather weird if
8169 * the database opened up for read-only connections at a point-in-time
8170 * before the last shutdown. Such time travel is still possible in case of
8171 * immediate shutdown, though.
8172 *
8173 * We don't explicitly advance minRecoveryPoint when we do create a
8174 * restartpoint. It's assumed that flushing the buffers will do that as a
8175 * side-effect.
8176 */
8177 if (!XLogRecPtrIsValid(lastCheckPointRecPtr) ||
8178 lastCheckPoint.redo <= ControlFile->checkPointCopy.redo)
8179 {
8181 errmsg_internal("skipping restartpoint, already performed at %X/%08X",
8182 LSN_FORMAT_ARGS(lastCheckPoint.redo)));
8183
8185 if (flags & CHECKPOINT_IS_SHUTDOWN)
8186 {
8191 }
8192 return false;
8193 }
8194
8195 /*
8196 * Update the shared RedoRecPtr so that the startup process can calculate
8197 * the number of segments replayed since last restartpoint, and request a
8198 * restartpoint if it exceeds CheckPointSegments.
8199 *
8200 * Like in CreateCheckPoint(), hold off insertions to update it, although
8201 * during recovery this is just pro forma, because no WAL insertions are
8202 * happening.
8203 */
8205 RedoRecPtr = XLogCtl->Insert.RedoRecPtr = lastCheckPoint.redo;
8207
8208 /* Also update the info_lck-protected copy */
8210 XLogCtl->RedoRecPtr = lastCheckPoint.redo;
8212
8213 /*
8214 * Prepare to accumulate statistics.
8215 *
8216 * Note: because it is possible for log_checkpoints to change while a
8217 * checkpoint proceeds, we always accumulate stats, even if
8218 * log_checkpoints is currently off.
8219 */
8222
8223 if (log_checkpoints)
8224 LogCheckpointStart(flags, true);
8225
8226 /* Update the process title */
8227 update_checkpoint_display(flags, true, false);
8228
8229 CheckPointGuts(lastCheckPoint.redo, flags);
8230
8231 /*
8232 * This location needs to be after CheckPointGuts() to ensure that some
8233 * work has already happened during this checkpoint.
8234 */
8235 INJECTION_POINT("create-restart-point", NULL);
8236
8237 /*
8238 * Remember the prior checkpoint's redo ptr for
8239 * UpdateCheckPointDistanceEstimate()
8240 */
8242
8243 /*
8244 * Update pg_control, using current time. Check that it still shows an
8245 * older checkpoint, else do nothing; this is a quick hack to make sure
8246 * nothing really bad happens if somehow we get here after the
8247 * end-of-recovery checkpoint.
8248 */
8250 if (ControlFile->checkPointCopy.redo < lastCheckPoint.redo)
8251 {
8252 /*
8253 * Update the checkpoint information. We do this even if the cluster
8254 * does not show DB_IN_ARCHIVE_RECOVERY to match with the set of WAL
8255 * segments recycled below.
8256 */
8257 ControlFile->checkPoint = lastCheckPointRecPtr;
8258 ControlFile->checkPointCopy = lastCheckPoint;
8259
8260 /*
8261 * Ensure minRecoveryPoint is past the checkpoint record and update it
8262 * if the control file still shows DB_IN_ARCHIVE_RECOVERY. Normally,
8263 * this will have happened already while writing out dirty buffers,
8264 * but not necessarily - e.g. because no buffers were dirtied. We do
8265 * this because a backup performed in recovery uses minRecoveryPoint
8266 * to determine which WAL files must be included in the backup, and
8267 * the file (or files) containing the checkpoint record must be
8268 * included, at a minimum. Note that for an ordinary restart of
8269 * recovery there's no value in having the minimum recovery point any
8270 * earlier than this anyway, because redo will begin just after the
8271 * checkpoint record.
8272 */
8274 {
8275 if (ControlFile->minRecoveryPoint < lastCheckPointEndPtr)
8276 {
8277 ControlFile->minRecoveryPoint = lastCheckPointEndPtr;
8279
8280 /* update local copy */
8283 }
8284 if (flags & CHECKPOINT_IS_SHUTDOWN)
8286 }
8287
8288 /* we shall start with the latest checksum version */
8290
8292 }
8294
8295 /*
8296 * Update the average distance between checkpoints/restartpoints if the
8297 * prior checkpoint exists.
8298 */
8301
8302 /*
8303 * Delete old log files, those no longer needed for last restartpoint to
8304 * prevent the disk holding the xlog from growing full.
8305 */
8307
8308 /*
8309 * Retreat _logSegNo using the current end of xlog replayed or received,
8310 * whichever is later.
8311 */
8313 replayPtr = GetXLogReplayRecPtr(&replayTLI);
8314 endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
8315 KeepLogSeg(endptr, &_logSegNo);
8316
8317 INJECTION_POINT("restartpoint-before-slot-invalidation", NULL);
8318
8322 {
8323 /*
8324 * Some slots have been invalidated; recalculate the old-segment
8325 * horizon, starting again from RedoRecPtr.
8326 */
8328 KeepLogSeg(endptr, &_logSegNo);
8329 }
8330 _logSegNo--;
8331
8332 /*
8333 * Try to recycle segments on a useful timeline. If we've been promoted
8334 * since the beginning of this restartpoint, use the new timeline chosen
8335 * at end of recovery. If we're still in recovery, use the timeline we're
8336 * currently replaying.
8337 *
8338 * There is no guarantee that the WAL segments will be useful on the
8339 * current timeline; if recovery proceeds to a new timeline right after
8340 * this, the pre-allocated WAL segments on this timeline will not be used,
8341 * and will go wasted until recycled on the next restartpoint. We'll live
8342 * with that.
8343 */
8344 if (!RecoveryInProgress())
8345 replayTLI = XLogCtl->InsertTimeLineID;
8346
8347 RemoveOldXlogFiles(_logSegNo, RedoRecPtr, endptr, replayTLI);
8348
8349 /*
8350 * Make more log segments if needed. (Do this after recycling old log
8351 * segments, since that may supply some of the needed files.)
8352 */
8353 PreallocXlogFiles(endptr, replayTLI);
8354
8355 /*
8356 * Truncate pg_subtrans if possible. We can throw away all data before
8357 * the oldest XMIN of any running transaction. No future transaction will
8358 * attempt to reference any pg_subtrans entry older than that (see Asserts
8359 * in subtrans.c). When hot standby is disabled, though, we mustn't do
8360 * this because StartupSUBTRANS hasn't been called yet.
8361 */
8362 if (EnableHotStandby)
8364
8365 /* Real work is done; log and update stats. */
8366 LogCheckpointEnd(true, flags);
8367
8368 /* Reset the process title */
8369 update_checkpoint_display(flags, true, true);
8370
8373 errmsg("recovery restart point at %X/%08X",
8374 LSN_FORMAT_ARGS(lastCheckPoint.redo)),
8375 xtime ? errdetail("Last completed transaction was at log time %s.",
8377
8378 /*
8379 * Finally, execute archive_cleanup_command, if any.
8380 */
8383 "archive_cleanup_command",
8384 false,
8386
8387 return true;
8388}
const char * timestamptz_to_str(TimestampTz t)
Definition timestamp.c:1870
#define LOG
Definition elog.h:32
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define DEBUG2
Definition elog.h:30
bool IsUnderPostmaster
Definition globals.c:122
@ B_CHECKPOINTER
Definition miscadmin.h:366
BackendType MyBackendType
Definition miscinit.c:65
@ DB_IN_ARCHIVE_RECOVERY
Definition pg_control.h:104
@ DB_SHUTDOWNED_IN_RECOVERY
Definition pg_control.h:101
uint32 data_checksum_version
Definition pg_control.h:232
CheckPoint lastCheckPoint
Definition xlog.c:551
XLogRecPtr lastCheckPointRecPtr
Definition xlog.c:549
XLogRecPtr lastCheckPointEndPtr
Definition xlog.c:550
XLogRecPtr GetWalRcvFlushRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI)
bool EnableHotStandby
Definition xlog.c:128
static void UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force)
Definition xlog.c:2720
static XLogRecPtr LocalMinRecoveryPoint
Definition xlog.c:666
static TimeLineID LocalMinRecoveryPointTLI
Definition xlog.c:667
void ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOnSignal, uint32 wait_event_info)
#define LSN_FORMAT_ARGS(lsn)
Definition xlogdefs.h:47
char * archiveCleanupCommand
XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI)
TimestampTz GetLatestXTime(void)

References archiveCleanupCommand, Assert, B_CHECKPOINTER, ControlFileData::checkPoint, CHECKPOINT_IS_SHUTDOWN, ControlFileData::checkPointCopy, CheckPointGuts(), CheckpointStats, CheckpointStatsData::ckpt_start_t, ControlFile, ControlFileData::data_checksum_version, CheckPoint::dataChecksumState, DB_IN_ARCHIVE_RECOVERY, DB_SHUTDOWNED_IN_RECOVERY, DEBUG2, EnableHotStandby, ereport, errdetail(), errmsg, errmsg_internal(), ExecuteRecoveryCommand(), fb(), GetCurrentTimestamp(), GetLatestXTime(), GetOldestTransactionIdConsideredRunning(), GetWalRcvFlushRecPtr(), GetXLogReplayRecPtr(), XLogCtlData::info_lck, INJECTION_POINT, XLogCtlData::Insert, XLogCtlData::InsertTimeLineID, InvalidateObsoleteReplicationSlots(), InvalidOid, InvalidTransactionId, InvalidXLogRecPtr, IsUnderPostmaster, KeepLogSeg(), XLogCtlData::lastCheckPoint, XLogCtlData::lastCheckPointEndPtr, XLogCtlData::lastCheckPointRecPtr, LocalMinRecoveryPoint, LocalMinRecoveryPointTLI, LOG, log_checkpoints, LogCheckpointEnd(), LogCheckpointStart(), LSN_FORMAT_ARGS, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), MemSet, ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, MyBackendType, PreallocXlogFiles(), RecoveryInProgress(), CheckPoint::redo, RedoRecPtr, XLogCtlInsert::RedoRecPtr, XLogCtlData::RedoRecPtr, RemoveOldXlogFiles(), RS_INVAL_IDLE_TIMEOUT, RS_INVAL_WAL_REMOVED, SpinLockAcquire(), SpinLockRelease(), ControlFileData::state, CheckPoint::ThisTimeLineID, timestamptz_to_str(), TruncateSUBTRANS(), update_checkpoint_display(), UpdateCheckPointDistanceEstimate(), UpdateControlFile(), UpdateMinRecoveryPoint(), wal_segment_size, WALInsertLockAcquireExclusive(), WALInsertLockRelease(), XLByteToSeg, XLogCtl, and XLogRecPtrIsValid.

Referenced by CheckpointerMain(), and ShutdownXLOG().

◆ DataChecksumsInProgressOn()

bool DataChecksumsInProgressOn ( void  )
extern

Definition at line 4706 of file xlog.c.

4707{
4708 bool ret;
4709
4713
4714 return ret;
4715}
@ PG_DATA_CHECKSUM_INPROGRESS_ON
Definition checksum.h:31

References XLogCtlData::data_checksum_version, XLogCtlData::info_lck, PG_DATA_CHECKSUM_INPROGRESS_ON, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by createdb(), and launcher_exit().

◆ DataChecksumsNeedVerify()

bool DataChecksumsNeedVerify ( void  )
extern

Definition at line 4732 of file xlog.c.

4733{
4735}
@ PG_DATA_CHECKSUM_VERSION
Definition checksum.h:29
static ChecksumStateType LocalDataChecksumState
Definition xlog.c:677

References LocalDataChecksumState, and PG_DATA_CHECKSUM_VERSION.

Referenced by DataChecksumsWorkerLauncherMain(), PageIsVerified(), read_file_data_into_buffer(), sendFile(), and verify_page_checksum().

◆ DataChecksumsNeedWrite()

◆ DataChecksumsOff()

bool DataChecksumsOff ( void  )
extern

Definition at line 4682 of file xlog.c.

4683{
4684 bool ret;
4685
4689
4690 return ret;
4691}
@ PG_DATA_CHECKSUM_OFF
Definition checksum.h:28

References XLogCtlData::data_checksum_version, XLogCtlData::info_lck, PG_DATA_CHECKSUM_OFF, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by StartDataChecksumsWorkerLauncher().

◆ DataChecksumsOn()

bool DataChecksumsOn ( void  )
extern

◆ do_pg_abort_backup()

void do_pg_abort_backup ( int  code,
Datum  arg 
)
extern

Definition at line 10054 of file xlog.c.

10055{
10057
10058 /* If called during backup start, there shouldn't be one already running */
10060
10062 {
10066
10069
10072 errmsg("aborting backup due to backend exiting before pg_backup_stop was called"));
10073 }
10074}
#define WARNING
Definition elog.h:37
static bool DatumGetBool(Datum X)
Definition postgres.h:100
int runningBackups
Definition xlog.c:445
static SessionBackupState sessionBackupState
Definition xlog.c:398

References arg, Assert, DatumGetBool(), ereport, errmsg, fb(), XLogCtlData::Insert, XLogCtlInsert::runningBackups, SESSION_BACKUP_NONE, sessionBackupState, WALInsertLockAcquireExclusive(), WALInsertLockRelease(), WARNING, and XLogCtl.

Referenced by do_pg_backup_start(), perform_base_backup(), and register_persistent_abort_backup_handler().

◆ do_pg_backup_start()

void do_pg_backup_start ( const char backupidstr,
bool  fast,
List **  tablespaces,
BackupState state,
StringInfo  tblspcmapfile 
)
extern

Definition at line 9458 of file xlog.c.

9460{
9462
9463 Assert(state != NULL);
9465
9466 /*
9467 * During recovery, we don't need to check WAL level. Because, if WAL
9468 * level is not sufficient, it's impossible to get here during recovery.
9469 */
9471 ereport(ERROR,
9473 errmsg("WAL level not sufficient for making an online backup"),
9474 errhint("\"wal_level\" must be set to \"replica\" or \"logical\" at server start.")));
9475
9477 ereport(ERROR,
9479 errmsg("backup label too long (max %d bytes)",
9480 MAXPGPATH)));
9481
9482 strlcpy(state->name, backupidstr, sizeof(state->name));
9483
9484 /*
9485 * Mark backup active in shared memory. We must do full-page WAL writes
9486 * during an on-line backup even if not doing so at other times, because
9487 * it's quite possible for the backup dump to obtain a "torn" (partially
9488 * written) copy of a database page if it reads the page concurrently with
9489 * our write to the same page. This can be fixed as long as the first
9490 * write to the page in the WAL sequence is a full-page write. Hence, we
9491 * increment runningBackups then force a CHECKPOINT, to ensure there are
9492 * no dirty pages in shared memory that might get dumped while the backup
9493 * is in progress without having a corresponding WAL record. (Once the
9494 * backup is complete, we need not force full-page writes anymore, since
9495 * we expect that any pages not modified during the backup interval must
9496 * have been correctly captured by the backup.)
9497 *
9498 * Note that forcing full-page writes has no effect during an online
9499 * backup from the standby.
9500 *
9501 * We must hold all the insertion locks to change the value of
9502 * runningBackups, to ensure adequate interlocking against
9503 * XLogInsertRecord().
9504 */
9508
9509 /*
9510 * Ensure we decrement runningBackups if we fail below. NB -- for this to
9511 * work correctly, it is critical that sessionBackupState is only updated
9512 * after this block is over.
9513 */
9515 {
9516 bool gotUniqueStartpoint = false;
9517 DIR *tblspcdir;
9518 struct dirent *de;
9520 int datadirpathlen;
9521
9522 /*
9523 * Force an XLOG file switch before the checkpoint, to ensure that the
9524 * WAL segment the checkpoint is written to doesn't contain pages with
9525 * old timeline IDs. That would otherwise happen if you called
9526 * pg_backup_start() right after restoring from a PITR archive: the
9527 * first WAL segment containing the startup checkpoint has pages in
9528 * the beginning with the old timeline ID. That can cause trouble at
9529 * recovery: we won't have a history file covering the old timeline if
9530 * pg_wal directory was not included in the base backup and the WAL
9531 * archive was cleared too before starting the backup.
9532 *
9533 * During recovery, we skip forcing XLOG file switch, which means that
9534 * the backup taken during recovery is not available for the special
9535 * recovery case described above.
9536 */
9538 RequestXLogSwitch(false);
9539
9540 do
9541 {
9542 bool checkpointfpw;
9543
9544 /*
9545 * Force a CHECKPOINT. Aside from being necessary to prevent torn
9546 * page problems, this guarantees that two successive backup runs
9547 * will have different checkpoint positions and hence different
9548 * history file names, even if nothing happened in between.
9549 *
9550 * During recovery, establish a restartpoint if possible. We use
9551 * the last restartpoint as the backup starting checkpoint. This
9552 * means that two successive backup runs can have same checkpoint
9553 * positions.
9554 *
9555 * Since the fact that we are executing do_pg_backup_start()
9556 * during recovery means that checkpointer is running, we can use
9557 * RequestCheckpoint() to establish a restartpoint.
9558 *
9559 * We use CHECKPOINT_FAST only if requested by user (via passing
9560 * fast = true). Otherwise this can take awhile.
9561 */
9563 (fast ? CHECKPOINT_FAST : 0));
9564
9565 /*
9566 * Now we need to fetch the checkpoint record location, and also
9567 * its REDO pointer. The oldest point in WAL that would be needed
9568 * to restore starting from the checkpoint is precisely the REDO
9569 * pointer.
9570 */
9572 state->checkpointloc = ControlFile->checkPoint;
9573 state->startpoint = ControlFile->checkPointCopy.redo;
9577
9579 {
9581
9582 /*
9583 * Check to see if all WAL replayed during online backup
9584 * (i.e., since last restartpoint used as backup starting
9585 * checkpoint) contain full-page writes.
9586 */
9590
9591 if (!checkpointfpw || state->startpoint <= recptr)
9592 ereport(ERROR,
9594 errmsg("WAL generated with \"full_page_writes=off\" was replayed "
9595 "since last restartpoint"),
9596 errhint("This means that the backup being taken on the standby "
9597 "is corrupt and should not be used. "
9598 "Enable \"full_page_writes\" and run CHECKPOINT on the primary, "
9599 "and then try an online backup again.")));
9600
9601 /*
9602 * During recovery, since we don't use the end-of-backup WAL
9603 * record and don't write the backup history file, the
9604 * starting WAL location doesn't need to be unique. This means
9605 * that two base backups started at the same time might use
9606 * the same checkpoint as starting locations.
9607 */
9608 gotUniqueStartpoint = true;
9609 }
9610
9611 /*
9612 * If two base backups are started at the same time (in WAL sender
9613 * processes), we need to make sure that they use different
9614 * checkpoints as starting locations, because we use the starting
9615 * WAL location as a unique identifier for the base backup in the
9616 * end-of-backup WAL record and when we write the backup history
9617 * file. Perhaps it would be better generate a separate unique ID
9618 * for each backup instead of forcing another checkpoint, but
9619 * taking a checkpoint right after another is not that expensive
9620 * either because only few buffers have been dirtied yet.
9621 */
9623 if (XLogCtl->Insert.lastBackupStart < state->startpoint)
9624 {
9625 XLogCtl->Insert.lastBackupStart = state->startpoint;
9626 gotUniqueStartpoint = true;
9627 }
9629 } while (!gotUniqueStartpoint);
9630
9631 /*
9632 * Construct tablespace_map file.
9633 */
9635
9636 /* Collect information about all tablespaces */
9638 while ((de = ReadDir(tblspcdir, PG_TBLSPC_DIR)) != NULL)
9639 {
9640 char fullpath[MAXPGPATH + sizeof(PG_TBLSPC_DIR)];
9641 char linkpath[MAXPGPATH];
9642 char *relpath = NULL;
9643 char *s;
9645 char *badp;
9646 Oid tsoid;
9647
9648 /*
9649 * Try to parse the directory name as an unsigned integer.
9650 *
9651 * Tablespace directories should be positive integers that can be
9652 * represented in 32 bits, with no leading zeroes or trailing
9653 * garbage. If we come across a name that doesn't meet those
9654 * criteria, skip it.
9655 */
9656 if (de->d_name[0] < '1' || de->d_name[1] > '9')
9657 continue;
9658 errno = 0;
9659 tsoid = strtoul(de->d_name, &badp, 10);
9660 if (*badp != '\0' || errno == EINVAL || errno == ERANGE)
9661 continue;
9662
9663 snprintf(fullpath, sizeof(fullpath), "%s/%s", PG_TBLSPC_DIR, de->d_name);
9664
9665 de_type = get_dirent_type(fullpath, de, false, ERROR);
9666
9667 if (de_type == PGFILETYPE_LNK)
9668 {
9670 ssize_t rllen;
9671
9672 rllen = readlink(fullpath, linkpath, sizeof(linkpath));
9673 if (rllen < 0)
9674 {
9676 (errmsg("could not read symbolic link \"%s\": %m",
9677 fullpath)));
9678 continue;
9679 }
9680 else if (rllen >= sizeof(linkpath))
9681 {
9683 (errmsg("symbolic link \"%s\" target is too long",
9684 fullpath)));
9685 continue;
9686 }
9687 linkpath[rllen] = '\0';
9688
9689 /*
9690 * Relpath holds the relative path of the tablespace directory
9691 * when it's located within PGDATA, or NULL if it's located
9692 * elsewhere.
9693 */
9694 if (rllen > datadirpathlen &&
9698
9699 /*
9700 * Add a backslash-escaped version of the link path to the
9701 * tablespace map file.
9702 */
9704 for (s = linkpath; *s; s++)
9705 {
9706 if (*s == '\n' || *s == '\r' || *s == '\\')
9709 }
9711 de->d_name, escapedpath.data);
9712 pfree(escapedpath.data);
9713 }
9714 else if (de_type == PGFILETYPE_DIR)
9715 {
9716 /*
9717 * It's possible to use allow_in_place_tablespaces to create
9718 * directories directly under pg_tblspc, for testing purposes
9719 * only.
9720 *
9721 * In this case, we store a relative path rather than an
9722 * absolute path into the tablespaceinfo.
9723 */
9724 snprintf(linkpath, sizeof(linkpath), "%s/%s",
9725 PG_TBLSPC_DIR, de->d_name);
9727 }
9728 else
9729 {
9730 /* Skip any other file type that appears here. */
9731 continue;
9732 }
9733
9735 ti->oid = tsoid;
9736 ti->path = pstrdup(linkpath);
9737 ti->rpath = relpath;
9738 ti->size = -1;
9739
9740 if (tablespaces)
9741 *tablespaces = lappend(*tablespaces, ti);
9742 }
9744
9745 state->starttime = (pg_time_t) time(NULL);
9746 }
9748
9749 state->started_in_recovery = backup_started_in_recovery;
9750
9751 /*
9752 * Mark that the start phase has correctly finished for the backup.
9753 */
9755}
static bool backup_started_in_recovery
Definition basebackup.c:129
void RequestCheckpoint(int flags)
int errcode(int sqlerrcode)
Definition elog.c:875
int errhint(const char *fmt,...) pg_attribute_printf(1
int FreeDir(DIR *dir)
Definition fd.c:3009
DIR * AllocateDir(const char *dirname)
Definition fd.c:2891
struct dirent * ReadDir(DIR *dir, const char *dirname)
Definition fd.c:2957
#define palloc_object(type)
Definition fe_memutils.h:89
PGFileType get_dirent_type(const char *path, const struct dirent *de, bool look_through_symlinks, int elevel)
Definition file_utils.c:547
PGFileType
Definition file_utils.h:19
@ PGFILETYPE_LNK
Definition file_utils.h:24
@ PGFILETYPE_DIR
Definition file_utils.h:23
char * DataDir
Definition globals.c:73
#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
Definition ipc.h:47
#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
Definition ipc.h:52
List * lappend(List *list, void *datum)
Definition list.c:339
char * pstrdup(const char *in)
Definition mcxt.c:1910
#define MAXPGPATH
#define snprintf
Definition port.h:261
#define IS_DIR_SEP(ch)
Definition port.h:104
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition strlcpy.c:45
static Datum BoolGetDatum(bool X)
Definition postgres.h:112
#define EINVAL
Definition private.h:69
#define relpath(rlocator, forknum)
Definition relpath.h:150
#define PG_TBLSPC_DIR
Definition relpath.h:41
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition stringinfo.c:145
void appendStringInfoChar(StringInfo str, char ch)
Definition stringinfo.c:242
void initStringInfo(StringInfo str)
Definition stringinfo.c:97
Definition dirent.c:26
XLogRecPtr lastFpwDisableRecPtr
Definition xlog.c:557
XLogRecPtr lastBackupStart
Definition xlog.c:446
#define readlink(path, buf, size)
Definition win32_port.h:243
XLogRecPtr RequestXLogSwitch(bool mark_unimportant)
Definition xlog.c:8607
void do_pg_abort_backup(int code, Datum arg)
Definition xlog.c:10054
#define CHECKPOINT_WAIT
Definition xlog.h:157
#define CHECKPOINT_FAST
Definition xlog.h:153
#define XLogIsNeeded()
Definition xlog.h:112

References AllocateDir(), appendStringInfo(), appendStringInfoChar(), Assert, backup_started_in_recovery, BoolGetDatum(), ControlFileData::checkPoint, CHECKPOINT_FAST, CHECKPOINT_FORCE, CHECKPOINT_WAIT, ControlFileData::checkPointCopy, ControlFile, DataDir, do_pg_abort_backup(), EINVAL, ereport, errcode(), errhint(), errmsg, ERROR, fb(), FreeDir(), CheckPoint::fullPageWrites, get_dirent_type(), XLogCtlData::info_lck, initStringInfo(), XLogCtlData::Insert, IS_DIR_SEP, lappend(), XLogCtlInsert::lastBackupStart, XLogCtlData::lastFpwDisableRecPtr, LW_SHARED, LWLockAcquire(), LWLockRelease(), MAXPGPATH, palloc_object, pfree(), PG_END_ENSURE_ERROR_CLEANUP, PG_ENSURE_ERROR_CLEANUP, PG_TBLSPC_DIR, PGFILETYPE_DIR, PGFILETYPE_LNK, pstrdup(), ReadDir(), readlink, RecoveryInProgress(), CheckPoint::redo, relpath, RequestCheckpoint(), RequestXLogSwitch(), XLogCtlInsert::runningBackups, SESSION_BACKUP_RUNNING, sessionBackupState, snprintf, SpinLockAcquire(), SpinLockRelease(), strlcpy(), CheckPoint::ThisTimeLineID, WALInsertLockAcquireExclusive(), WALInsertLockRelease(), WARNING, XLogCtl, and XLogIsNeeded.

Referenced by perform_base_backup(), and pg_backup_start().

◆ do_pg_backup_stop()

void do_pg_backup_stop ( BackupState state,
bool  waitforarchive 
)
extern

Definition at line 9780 of file xlog.c.

9781{
9782 bool backup_stopped_in_recovery = false;
9783 char histfilepath[MAXPGPATH];
9787 FILE *fp;
9789 int waits = 0;
9790 bool reported_waiting = false;
9791
9792 Assert(state != NULL);
9793
9795
9796 /*
9797 * During recovery, we don't need to check WAL level. Because, if WAL
9798 * level is not sufficient, it's impossible to get here during recovery.
9799 */
9801 ereport(ERROR,
9803 errmsg("WAL level not sufficient for making an online backup"),
9804 errhint("\"wal_level\" must be set to \"replica\" or \"logical\" at server start.")));
9805
9806 /*
9807 * OK to update backup counter and session-level lock.
9808 *
9809 * Note that CHECK_FOR_INTERRUPTS() must not occur while updating them,
9810 * otherwise they can be updated inconsistently, which might cause
9811 * do_pg_abort_backup() to fail.
9812 */
9814
9815 /*
9816 * It is expected that each do_pg_backup_start() call is matched by
9817 * exactly one do_pg_backup_stop() call.
9818 */
9821
9822 /*
9823 * Clean up session-level lock.
9824 *
9825 * You might think that WALInsertLockRelease() can be called before
9826 * cleaning up session-level lock because session-level lock doesn't need
9827 * to be protected with WAL insertion lock. But since
9828 * CHECK_FOR_INTERRUPTS() can occur in it, session-level lock must be
9829 * cleaned up before it.
9830 */
9832
9834
9835 /*
9836 * If we are taking an online backup from the standby, we confirm that the
9837 * standby has not been promoted during the backup.
9838 */
9839 if (state->started_in_recovery && !backup_stopped_in_recovery)
9840 ereport(ERROR,
9842 errmsg("the standby was promoted during online backup"),
9843 errhint("This means that the backup being taken is corrupt "
9844 "and should not be used. "
9845 "Try taking another online backup.")));
9846
9847 /*
9848 * During recovery, we don't write an end-of-backup record. We assume that
9849 * pg_control was backed up last and its minimum recovery point can be
9850 * available as the backup end location. Since we don't have an
9851 * end-of-backup record, we use the pg_control value to check whether
9852 * we've reached the end of backup when starting recovery from this
9853 * backup. We have no way of checking if pg_control wasn't backed up last
9854 * however.
9855 *
9856 * We don't force a switch to new WAL file but it is still possible to
9857 * wait for all the required files to be archived if waitforarchive is
9858 * true. This is okay if we use the backup to start a standby and fetch
9859 * the missing WAL using streaming replication. But in the case of an
9860 * archive recovery, a user should set waitforarchive to true and wait for
9861 * them to be archived to ensure that all the required files are
9862 * available.
9863 *
9864 * We return the current minimum recovery point as the backup end
9865 * location. Note that it can be greater than the exact backup end
9866 * location if the minimum recovery point is updated after the backup of
9867 * pg_control. This is harmless for current uses.
9868 *
9869 * XXX currently a backup history file is for informational and debug
9870 * purposes only. It's not essential for an online backup. Furthermore,
9871 * even if it's created, it will not be archived during recovery because
9872 * an archiver is not invoked. So it doesn't seem worthwhile to write a
9873 * backup history file during recovery.
9874 */
9876 {
9878
9879 /*
9880 * Check to see if all WAL replayed during online backup contain
9881 * full-page writes.
9882 */
9886
9887 if (state->startpoint <= recptr)
9888 ereport(ERROR,
9890 errmsg("WAL generated with \"full_page_writes=off\" was replayed "
9891 "during online backup"),
9892 errhint("This means that the backup being taken on the standby "
9893 "is corrupt and should not be used. "
9894 "Enable \"full_page_writes\" and run CHECKPOINT on the primary, "
9895 "and then try an online backup again.")));
9896
9897
9899 state->stoppoint = ControlFile->minRecoveryPoint;
9902 }
9903 else
9904 {
9905 char *history_file;
9906
9907 /*
9908 * Write the backup-end xlog record
9909 */
9911 XLogRegisterData(&state->startpoint,
9912 sizeof(state->startpoint));
9914
9915 /*
9916 * Given that we're not in recovery, InsertTimeLineID is set and can't
9917 * change, so we can read it without a lock.
9918 */
9919 state->stoptli = XLogCtl->InsertTimeLineID;
9920
9921 /*
9922 * Force a switch to a new xlog segment file, so that the backup is
9923 * valid as soon as archiver moves out the current segment file.
9924 */
9925 RequestXLogSwitch(false);
9926
9927 state->stoptime = (pg_time_t) time(NULL);
9928
9929 /*
9930 * Write the backup history file
9931 */
9934 state->startpoint, wal_segment_size);
9935 fp = AllocateFile(histfilepath, "w");
9936 if (!fp)
9937 ereport(ERROR,
9939 errmsg("could not create file \"%s\": %m",
9940 histfilepath)));
9941
9942 /* Build and save the contents of the backup history file */
9944 fprintf(fp, "%s", history_file);
9946
9947 if (fflush(fp) || ferror(fp) || FreeFile(fp))
9948 ereport(ERROR,
9950 errmsg("could not write file \"%s\": %m",
9951 histfilepath)));
9952
9953 /*
9954 * Clean out any no-longer-needed history files. As a side effect,
9955 * this will post a .ready file for the newly created history file,
9956 * notifying the archiver that history file may be archived
9957 * immediately.
9958 */
9960 }
9961
9962 /*
9963 * If archiving is enabled, wait for all the required WAL files to be
9964 * archived before returning. If archiving isn't enabled, the required WAL
9965 * needs to be transported via streaming replication (hopefully with
9966 * wal_keep_size set high enough), or some more exotic mechanism like
9967 * polling and copying files from pg_wal with script. We have no knowledge
9968 * of those mechanisms, so it's up to the user to ensure that he gets all
9969 * the required WAL.
9970 *
9971 * We wait until both the last WAL file filled during backup and the
9972 * history file have been archived, and assume that the alphabetic sorting
9973 * property of the WAL files ensures any earlier WAL files are safely
9974 * archived as well.
9975 *
9976 * We wait forever, since archive_command is supposed to work and we
9977 * assume the admin wanted his backup to work completely. If you don't
9978 * wish to wait, then either waitforarchive should be passed in as false,
9979 * or you can set statement_timeout. Also, some notices are issued to
9980 * clue in anyone who might be doing this interactively.
9981 */
9982
9983 if (waitforarchive &&
9986 {
9990
9993 state->startpoint, wal_segment_size);
9994
9996 waits = 0;
9997
10000 {
10002
10003 if (!reported_waiting && waits > 5)
10004 {
10006 (errmsg("base backup done, waiting for required WAL segments to be archived")));
10007 reported_waiting = true;
10008 }
10009
10012 1000L,
10015
10016 if (++waits >= seconds_before_warning)
10017 {
10018 seconds_before_warning *= 2; /* This wraps in >10 years... */
10020 (errmsg("still waiting for all required WAL segments to be archived (%d seconds elapsed)",
10021 waits),
10022 errhint("Check that your \"archive_command\" is executing properly. "
10023 "You can safely cancel this backup, "
10024 "but the database backup will not be usable without all the WAL segments.")));
10025 }
10026 }
10027
10029 (errmsg("all required WAL segments have been archived")));
10030 }
10031 else if (waitforarchive)
10033 (errmsg("WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup")));
10034}
#define fprintf(file, fmt, msg)
Definition cubescan.l:21
#define NOTICE
Definition elog.h:36
int FreeFile(FILE *file)
Definition fd.c:2827
FILE * AllocateFile(const char *name, const char *mode)
Definition fd.c:2628
struct Latch * MyLatch
Definition globals.c:65
void ResetLatch(Latch *latch)
Definition latch.c:374
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
Definition latch.c:172
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:125
#define XLOG_BACKUP_END
Definition pg_control.h:77
#define WL_TIMEOUT
#define WL_EXIT_ON_PM_DEATH
#define WL_LATCH_SET
static void CleanupBackupHistory(void)
Definition xlog.c:4211
#define XLogArchivingActive()
Definition xlog.h:102
#define XLogArchivingAlways()
Definition xlog.h:105
#define XLByteToPrevSeg(xlrp, logSegNo, wal_segsz_bytes)
static void BackupHistoryFileName(char *fname, TimeLineID tli, XLogSegNo logSegNo, XLogRecPtr startpoint, int wal_segsz_bytes)
static void BackupHistoryFilePath(char *path, TimeLineID tli, XLogSegNo logSegNo, XLogRecPtr startpoint, int wal_segsz_bytes)
bool XLogArchiveIsBusy(const char *xlog)
char * build_backup_content(BackupState *state, bool ishistoryfile)
Definition xlogbackup.c:29

References AllocateFile(), Assert, BackupHistoryFileName(), BackupHistoryFilePath(), build_backup_content(), CHECK_FOR_INTERRUPTS, CleanupBackupHistory(), ControlFile, ereport, errcode(), errcode_for_file_access(), errhint(), errmsg, ERROR, fb(), fprintf, FreeFile(), XLogCtlData::info_lck, XLogCtlData::Insert, XLogCtlData::InsertTimeLineID, XLogCtlData::lastFpwDisableRecPtr, LW_SHARED, LWLockAcquire(), LWLockRelease(), MAXFNAMELEN, MAXPGPATH, ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, MyLatch, NOTICE, pfree(), RecoveryInProgress(), RequestXLogSwitch(), ResetLatch(), XLogCtlInsert::runningBackups, SESSION_BACKUP_NONE, sessionBackupState, SpinLockAcquire(), SpinLockRelease(), WaitLatch(), wal_segment_size, WALInsertLockAcquireExclusive(), WALInsertLockRelease(), WARNING, WL_EXIT_ON_PM_DEATH, WL_LATCH_SET, WL_TIMEOUT, XLByteToPrevSeg, XLByteToSeg, XLOG_BACKUP_END, XLogArchiveIsBusy(), XLogArchivingActive, XLogArchivingAlways, XLogBeginInsert(), XLogCtl, XLogFileName(), XLogInsert(), XLogIsNeeded, and XLogRegisterData().

Referenced by perform_base_backup(), and pg_backup_stop().

◆ get_backup_status()

SessionBackupState get_backup_status ( void  )
extern

Definition at line 9761 of file xlog.c.

9762{
9763 return sessionBackupState;
9764}

References sessionBackupState.

Referenced by pg_backup_start(), pg_backup_stop(), and SendBaseBackup().

◆ get_checksum_state_string()

const char * get_checksum_state_string ( uint32  state)
extern

Definition at line 59 of file xlogdesc.c.

60{
61 switch (state)
62 {
64 return "on";
66 return "inprogress-off";
68 return "inprogress-on";
70 return "off";
71 }
72
73 Assert(false);
74 return "?";
75}

References Assert, PG_DATA_CHECKSUM_INPROGRESS_OFF, PG_DATA_CHECKSUM_INPROGRESS_ON, PG_DATA_CHECKSUM_OFF, and PG_DATA_CHECKSUM_VERSION.

Referenced by show_data_checksums(), xlog2_desc(), and xlog_desc().

◆ GetActiveWalLevelOnStandby()

WalLevel GetActiveWalLevelOnStandby ( void  )
extern

Definition at line 5284 of file xlog.c.

5285{
5286 return ControlFile->wal_level;
5287}

References ControlFile, and ControlFileData::wal_level.

◆ GetDefaultCharSignedness()

bool GetDefaultCharSignedness ( void  )
extern

Definition at line 4991 of file xlog.c.

4992{
4994}
bool default_char_signedness
Definition pg_control.h:238

References ControlFile, and ControlFileData::default_char_signedness.

Referenced by CMPTRGM_CHOOSE(), and trigram_qsort().

◆ GetFakeLSNForUnloggedRel()

XLogRecPtr GetFakeLSNForUnloggedRel ( void  )
extern

Definition at line 5006 of file xlog.c.

5007{
5009}
static uint64 pg_atomic_fetch_add_u64(volatile pg_atomic_uint64 *ptr, int64 add_)
Definition atomics.h:527

References pg_atomic_fetch_add_u64(), XLogCtlData::unloggedLSN, and XLogCtl.

Referenced by XLogGetFakeLSN().

◆ GetFlushRecPtr()

◆ GetFullPageWriteInfo()

void GetFullPageWriteInfo ( XLogRecPtr RedoRecPtr_p,
bool doPageWrites_p 
)
extern

Definition at line 6968 of file xlog.c.

6969{
6972}
static bool doPageWrites
Definition xlog.c:293

References doPageWrites, fb(), and RedoRecPtr.

Referenced by XLogCheckBufferNeedsBackup(), and XLogInsert().

◆ GetInsertRecPtr()

XLogRecPtr GetInsertRecPtr ( void  )
extern

◆ GetLastImportantRecPtr()

XLogRecPtr GetLastImportantRecPtr ( void  )
extern

Definition at line 7057 of file xlog.c.

7058{
7060 int i;
7061
7062 for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++)
7063 {
7065
7066 /*
7067 * Need to take a lock to prevent torn reads of the LSN, which are
7068 * possible on some of the supported platforms. WAL insert locks only
7069 * support exclusive mode, so we have to use that.
7070 */
7073 LWLockRelease(&WALInsertLocks[i].l.lock);
7074
7075 if (res < last_important)
7076 res = last_important;
7077 }
7078
7079 return res;
7080}
int i
Definition isn.c:77
XLogRecPtr lastImportantAt
Definition xlog.c:378
WALInsertLock l
Definition xlog.c:390
static WALInsertLockPadded * WALInsertLocks
Definition xlog.c:578
#define NUM_XLOGINSERT_LOCKS
Definition xlog.c:157

References fb(), i, InvalidXLogRecPtr, WALInsertLockPadded::l, WALInsertLock::lastImportantAt, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), NUM_XLOGINSERT_LOCKS, and WALInsertLocks.

Referenced by BackgroundWriterMain(), CheckArchiveTimeout(), and CreateCheckPoint().

◆ GetMockAuthenticationNonce()

char * GetMockAuthenticationNonce ( void  )
extern

Definition at line 4652 of file xlog.c.

4653{
4656}
char mock_authentication_nonce[MOCK_AUTH_NONCE_LEN]
Definition pg_control.h:245

References Assert, ControlFile, fb(), and ControlFileData::mock_authentication_nonce.

Referenced by scram_mock_salt().

◆ GetRecoveryState()

RecoveryState GetRecoveryState ( void  )
extern

Definition at line 6871 of file xlog.c.

6872{
6873 RecoveryState retval;
6874
6876 retval = XLogCtl->SharedRecoveryState;
6878
6879 return retval;
6880}

References XLogCtlData::info_lck, XLogCtlData::SharedRecoveryState, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by XLogArchiveCheckDone().

◆ GetRedoRecPtr()

XLogRecPtr GetRedoRecPtr ( void  )
extern

Definition at line 6938 of file xlog.c.

6939{
6940 XLogRecPtr ptr;
6941
6942 /*
6943 * The possibly not up-to-date copy in XLogCtl is enough. Even if we
6944 * grabbed a WAL insertion lock to read the authoritative value in
6945 * Insert->RedoRecPtr, someone might update it just after we've released
6946 * the lock.
6947 */
6949 ptr = XLogCtl->RedoRecPtr;
6951
6952 if (RedoRecPtr < ptr)
6953 RedoRecPtr = ptr;
6954
6955 return RedoRecPtr;
6956}

References XLogCtlData::info_lck, RedoRecPtr, XLogCtlData::RedoRecPtr, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by CheckPointLogicalRewriteHeap(), CheckPointSnapBuild(), MaybeRemoveOldWalSummaries(), nextval_internal(), ReplicationSlotReserveWal(), reserve_wal_for_local_slot(), smgr_bulk_finish(), smgr_bulk_start_smgr(), XLogPageRead(), XLogSaveBufferForHint(), and XLogWrite().

◆ GetSystemIdentifier()

◆ GetWALAvailability()

WALAvailability GetWALAvailability ( XLogRecPtr  targetLSN)
extern

Definition at line 8414 of file xlog.c.

8415{
8416 XLogRecPtr currpos; /* current write LSN */
8417 XLogSegNo currSeg; /* segid of currpos */
8418 XLogSegNo targetSeg; /* segid of targetLSN */
8419 XLogSegNo oldestSeg; /* actual oldest segid */
8420 XLogSegNo oldestSegMaxWalSize; /* oldest segid kept by max_wal_size */
8421 XLogSegNo oldestSlotSeg; /* oldest segid kept by slot */
8423
8424 /*
8425 * slot does not reserve WAL. Either deactivated, or has never been active
8426 */
8428 return WALAVAIL_INVALID_LSN;
8429
8430 /*
8431 * Calculate the oldest segment currently reserved by all slots,
8432 * considering wal_keep_size and max_slot_wal_keep_size. Initialize
8433 * oldestSlotSeg to the current segment.
8434 */
8435 currpos = GetXLogWriteRecPtr();
8437 KeepLogSeg(currpos, &oldestSlotSeg);
8438
8439 /*
8440 * Find the oldest extant segment file. We get 1 until checkpoint removes
8441 * the first WAL segment file since startup, which causes the status being
8442 * wrong under certain abnormal conditions but that doesn't actually harm.
8443 */
8445
8446 /* calculate oldest segment by max_wal_size */
8449
8450 if (currSeg > keepSegs)
8452 else
8454
8455 /* the segment we care about */
8457
8458 /*
8459 * No point in returning reserved or extended status values if the
8460 * targetSeg is known to be lost.
8461 */
8462 if (targetSeg >= oldestSlotSeg)
8463 {
8464 /* show "reserved" when targetSeg is within max_wal_size */
8466 return WALAVAIL_RESERVED;
8467
8468 /* being retained by slots exceeding max_wal_size */
8469 return WALAVAIL_EXTENDED;
8470 }
8471
8472 /* WAL segments are no longer retained but haven't been removed yet */
8473 if (targetSeg >= oldestSeg)
8474 return WALAVAIL_UNRESERVED;
8475
8476 /* Definitely lost */
8477 return WALAVAIL_REMOVED;
8478}
XLogSegNo XLogGetLastRemovedSegno(void)
Definition xlog.c:3808
int max_wal_size_mb
Definition xlog.c:121
#define ConvertToXSegs(x, segsize)
Definition xlog.c:623
XLogRecPtr GetXLogWriteRecPtr(void)
Definition xlog.c:10127

References ConvertToXSegs, fb(), GetXLogWriteRecPtr(), KeepLogSeg(), max_wal_size_mb, wal_segment_size, WALAVAIL_EXTENDED, WALAVAIL_INVALID_LSN, WALAVAIL_REMOVED, WALAVAIL_RESERVED, WALAVAIL_UNRESERVED, XLByteToSeg, XLogGetLastRemovedSegno(), and XLogRecPtrIsValid.

Referenced by pg_get_replication_slots().

◆ GetWALInsertionTimeLine()

TimeLineID GetWALInsertionTimeLine ( void  )
extern

Definition at line 7021 of file xlog.c.

7022{
7024
7025 /* Since the value can't be changing, no lock is required. */
7026 return XLogCtl->InsertTimeLineID;
7027}

References Assert, XLogCtlData::InsertTimeLineID, RECOVERY_STATE_DONE, XLogCtlData::SharedRecoveryState, and XLogCtl.

Referenced by logical_read_xlog_page(), pg_walfile_name(), pg_walfile_name_offset(), ReadReplicationSlot(), WALReadFromBuffers(), and XLogSendPhysical().

◆ GetWALInsertionTimeLineIfSet()

TimeLineID GetWALInsertionTimeLineIfSet ( void  )
extern

◆ GetXLogInsertEndRecPtr()

XLogRecPtr GetXLogInsertEndRecPtr ( void  )
extern

Definition at line 10111 of file xlog.c.

10112{
10115
10116 SpinLockAcquire(&Insert->insertpos_lck);
10117 current_bytepos = Insert->CurrBytePos;
10118 SpinLockRelease(&Insert->insertpos_lck);
10119
10121}
static XLogRecPtr XLogBytePosToEndRecPtr(uint64 bytepos)
Definition xlog.c:1939

References fb(), XLogCtlData::Insert, Insert(), SpinLockAcquire(), SpinLockRelease(), XLogBytePosToEndRecPtr(), and XLogCtl.

Referenced by rebuild_relation_finish_concurrent(), WalSndWaitForWal(), and XLogGetFakeLSN().

◆ GetXLogInsertRecPtr()

XLogRecPtr GetXLogInsertRecPtr ( void  )
extern

◆ GetXLogWriteRecPtr()

XLogRecPtr GetXLogWriteRecPtr ( void  )
extern

◆ InitializeWalConsistencyChecking()

void InitializeWalConsistencyChecking ( void  )
extern

Definition at line 5188 of file xlog.c.

5189{
5191
5193 {
5194 struct config_generic *guc;
5195
5196 guc = find_option("wal_consistency_checking", false, false, ERROR);
5197
5199
5200 set_config_option_ext("wal_consistency_checking",
5202 guc->scontext, guc->source, guc->srole,
5203 GUC_ACTION_SET, true, ERROR, false);
5204
5205 /* checking should not be deferred again */
5207 }
5208}
int set_config_option_ext(const char *name, const char *value, GucContext context, GucSource source, Oid srole, GucAction action, bool changeVal, int elevel, bool is_reload)
Definition guc.c:3288
struct config_generic * find_option(const char *name, bool create_placeholders, bool skip_errors, int elevel)
Definition guc.c:1114
@ GUC_ACTION_SET
Definition guc.h:203
bool process_shared_preload_libraries_done
Definition miscinit.c:1789
char * wal_consistency_checking_string
Definition xlog.c:132
static bool check_wal_consistency_checking_deferred
Definition xlog.c:173

References Assert, check_wal_consistency_checking_deferred, ERROR, fb(), find_option(), GUC_ACTION_SET, process_shared_preload_libraries_done, set_config_option_ext(), and wal_consistency_checking_string.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

◆ InitLocalDataChecksumState()

void InitLocalDataChecksumState ( void  )
extern

◆ IsInstallXLogFileSegmentActive()

bool IsInstallXLogFileSegmentActive ( void  )
extern

Definition at line 10176 of file xlog.c.

10177{
10178 bool result;
10179
10183
10184 return result;
10185}
uint32 result
bool InstallXLogFileSegmentActive
Definition xlog.c:532

References fb(), XLogCtlData::InstallXLogFileSegmentActive, LW_SHARED, LWLockAcquire(), LWLockRelease(), result, and XLogCtl.

Referenced by XLogFileRead().

◆ issue_xlog_fsync()

void issue_xlog_fsync ( int  fd,
XLogSegNo  segno,
TimeLineID  tli 
)
extern

Definition at line 9361 of file xlog.c.

9362{
9363 char *msg = NULL;
9365
9366 Assert(tli != 0);
9367
9368 /*
9369 * Quick exit if fsync is disabled or write() has already synced the WAL
9370 * file.
9371 */
9372 if (!enableFsync ||
9375 return;
9376
9377 /*
9378 * Measure I/O timing to sync the WAL file for pg_stat_io.
9379 */
9381
9383 switch (wal_sync_method)
9384 {
9386 if (pg_fsync_no_writethrough(fd) != 0)
9387 msg = _("could not fsync file \"%s\": %m");
9388 break;
9389#ifdef HAVE_FSYNC_WRITETHROUGH
9391 if (pg_fsync_writethrough(fd) != 0)
9392 msg = _("could not fsync write-through file \"%s\": %m");
9393 break;
9394#endif
9396 if (pg_fdatasync(fd) != 0)
9397 msg = _("could not fdatasync file \"%s\": %m");
9398 break;
9401 /* not reachable */
9402 Assert(false);
9403 break;
9404 default:
9405 ereport(PANIC,
9407 errmsg_internal("unrecognized \"wal_sync_method\": %d", wal_sync_method));
9408 break;
9409 }
9410
9411 /* PANIC if failed to fsync */
9412 if (msg)
9413 {
9414 char xlogfname[MAXFNAMELEN];
9415 int save_errno = errno;
9416
9418 errno = save_errno;
9419 ereport(PANIC,
9421 errmsg(msg, xlogfname)));
9422 }
9423
9425
9427 start, 1, 0);
9428}
#define _(x)
Definition elog.c:96
int pg_fsync_no_writethrough(int fd)
Definition fd.c:442
int pg_fdatasync(int fd)
Definition fd.c:481
int pg_fsync_writethrough(int fd)
Definition fd.c:462
bool enableFsync
Definition globals.c:131
return str start
@ IOOBJECT_WAL
Definition pgstat.h:283
@ IOCONTEXT_NORMAL
Definition pgstat.h:293
@ IOOP_FSYNC
Definition pgstat.h:312
instr_time pgstat_prepare_io_time(bool track_io_guc)
Definition pgstat_io.c:91
void pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op, instr_time start_time, uint32 cnt, uint64 bytes)
Definition pgstat_io.c:122
int wal_sync_method
Definition xlog.c:137
bool track_wal_io_timing
Definition xlog.c:144

References _, Assert, enableFsync, ereport, errcode(), errcode_for_file_access(), errmsg, errmsg_internal(), fb(), fd(), IOCONTEXT_NORMAL, IOOBJECT_WAL, IOOP_FSYNC, MAXFNAMELEN, PANIC, pg_fdatasync(), pg_fsync_no_writethrough(), pg_fsync_writethrough(), pgstat_count_io_op_time(), pgstat_prepare_io_time(), pgstat_report_wait_end(), pgstat_report_wait_start(), start, track_wal_io_timing, wal_segment_size, wal_sync_method, WAL_SYNC_METHOD_FDATASYNC, WAL_SYNC_METHOD_FSYNC, WAL_SYNC_METHOD_FSYNC_WRITETHROUGH, WAL_SYNC_METHOD_OPEN, WAL_SYNC_METHOD_OPEN_DSYNC, and XLogFileName().

Referenced by XLogWalRcvFlush(), and XLogWrite().

◆ LocalProcessControlFile()

◆ ReachedEndOfBackup()

void ReachedEndOfBackup ( XLogRecPtr  EndRecPtr,
TimeLineID  tli 
)
extern

Definition at line 6748 of file xlog.c.

6749{
6750 /*
6751 * We have reached the end of base backup, as indicated by pg_control. The
6752 * data on disk is now consistent (unless minRecoveryPoint is further
6753 * ahead, which can happen if we crashed during previous recovery). Reset
6754 * backupStartPoint and backupEndPoint, and update minRecoveryPoint to
6755 * make sure we don't allow starting up at an earlier point even if
6756 * recovery is stopped and restarted soon after this.
6757 */
6759
6760 if (ControlFile->minRecoveryPoint < EndRecPtr)
6761 {
6762 ControlFile->minRecoveryPoint = EndRecPtr;
6764 }
6765
6770
6772}
XLogRecPtr backupStartPoint
Definition pg_control.h:178
XLogRecPtr backupEndPoint
Definition pg_control.h:179

References ControlFileData::backupEndPoint, ControlFileData::backupEndRequired, ControlFileData::backupStartPoint, ControlFile, fb(), InvalidXLogRecPtr, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, and UpdateControlFile().

Referenced by CheckRecoveryConsistency().

◆ RecoveryInProgress()

bool RecoveryInProgress ( void  )
extern

Definition at line 6835 of file xlog.c.

6836{
6837 /*
6838 * We check shared state each time only until we leave recovery mode. We
6839 * can't re-enter recovery, so there's no need to keep checking after the
6840 * shared variable has once been seen false.
6841 */
6843 return false;
6844 else
6845 {
6846 /*
6847 * use volatile pointer to make sure we make a fresh read of the
6848 * shared variable.
6849 */
6850 volatile XLogCtlData *xlogctl = XLogCtl;
6851
6852 LocalRecoveryInProgress = (xlogctl->SharedRecoveryState != RECOVERY_STATE_DONE);
6853
6854 /*
6855 * Note: We don't need a memory barrier when we're still in recovery.
6856 * We might exit recovery immediately after return, so the caller
6857 * can't rely on 'true' meaning that we're still in recovery anyway.
6858 */
6859
6861 }
6862}
static bool LocalRecoveryInProgress
Definition xlog.c:231

References fb(), LocalRecoveryInProgress, RECOVERY_STATE_DONE, and XLogCtl.

Referenced by AbsorbDataChecksumsBarrier(), amcheck_index_mainfork_expected(), attribute_statistics_update(), BackgroundWriterMain(), BeginReportingGUCOptions(), brin_desummarize_range(), brin_summarize_range(), CanInvalidateIdleSlot(), check_transaction_isolation(), check_transaction_read_only(), CheckArchiveTimeout(), CheckLogicalDecodingRequirements(), CheckpointerMain(), ComputeXidHorizons(), CreateCheckPoint(), CreateDecodingContext(), CreateEndOfRecoveryRecord(), CreateOverwriteContrecordRecord(), CreateRestartPoint(), DisableLogicalDecoding(), DisableLogicalDecodingIfNecessary(), do_pg_backup_start(), do_pg_backup_stop(), EnableLogicalDecoding(), EnsureLogicalDecodingEnabled(), error_commit_ts_disabled(), EventTriggerOnLogin(), ExecCheckpoint(), ExecWaitStmt(), extended_statistics_update(), get_relation_info(), GetCurrentLSN(), GetLatestLSN(), GetNewMultiXactId(), GetNewObjectId(), GetNewTransactionId(), GetOldestActiveTransactionId(), GetOldestSafeDecodingTransactionId(), GetRunningTransactionData(), GetSerializableTransactionSnapshot(), GetSerializableTransactionSnapshotInt(), GetSnapshotData(), GetStrictOldestNonRemovableTransactionId(), gin_clean_pending_list(), GlobalVisHorizonKindForRel(), heap_force_common(), heap_page_prune_opt(), IdentifySystem(), InitTempTableNamespace(), InitWalSender(), IsCheckpointOnSchedule(), LockAcquireExtended(), logical_read_xlog_page(), MaintainLatestCompletedXid(), MarkSharedBufferDirtyHint(), perform_base_backup(), pg_clear_attribute_stats(), pg_clear_extended_stats(), pg_create_restore_point(), pg_current_wal_flush_lsn(), pg_current_wal_insert_lsn(), pg_current_wal_lsn(), pg_get_sequence_data(), pg_get_wal_replay_pause_state(), pg_is_in_recovery(), pg_is_wal_replay_paused(), pg_log_standby_snapshot(), pg_logical_slot_get_changes_guts(), pg_promote(), pg_replication_slot_advance(), pg_sequence_last_value(), pg_stat_get_recovery(), pg_switch_wal(), pg_sync_replication_slots(), pg_wal_replay_pause(), pg_wal_replay_resume(), pg_walfile_name(), pg_walfile_name_offset(), pgstat_report_replslotsync(), PhysicalWakeupLogicalWalSnd(), PrepareRedoAdd(), PrepareRedoRemoveFull(), PreventCommandDuringRecovery(), ProcessStandbyPSRequestMessage(), ProcSleep(), read_local_xlog_page_guts(), ReadReplicationSlot(), recovery_create_dbdir(), relation_statistics_update(), ReplicationSlotAlter(), ReplicationSlotCreate(), ReplicationSlotDrop(), ReplicationSlotReserveWal(), replorigin_check_prerequisites(), ReportChangedGUCOptions(), sendDir(), SerialSetActiveSerXmin(), show_effective_wal_level(), show_in_hot_standby(), ShutdownXLOG(), SnapBuildWaitSnapshot(), StandbySlotsHaveCaughtup(), StartLogicalReplication(), StartReplication(), StartTransaction(), TransactionIdIsInProgress(), TruncateMultiXact(), UpdateFullPageWrites(), UpdateLogicalDecodingStatusEndOfRecovery(), verify_heapam(), WaitForLSN(), WALReadFromBuffers(), WalReceiverMain(), WalSndWaitForWal(), XLogBackgroundFlush(), XLogFlush(), XLogInsertAllowed(), and XLogSendPhysical().

◆ register_persistent_abort_backup_handler()

void register_persistent_abort_backup_handler ( void  )
extern

Definition at line 10081 of file xlog.c.

10082{
10083 static bool already_done = false;
10084
10085 if (already_done)
10086 return;
10088 already_done = true;
10089}
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:344

References before_shmem_exit(), BoolGetDatum(), do_pg_abort_backup(), and fb().

Referenced by pg_backup_start().

◆ RemoveNonParentXlogFiles()

void RemoveNonParentXlogFiles ( XLogRecPtr  switchpoint,
TimeLineID  newTLI 
)
extern

Definition at line 3990 of file xlog.c.

3991{
3992 DIR *xldir;
3993 struct dirent *xlde;
3994 char switchseg[MAXFNAMELEN];
3998
3999 /*
4000 * Initialize info about where to begin the work. This will recycle,
4001 * somewhat arbitrarily, 10 future segments.
4002 */
4006
4007 /*
4008 * Construct a filename of the last segment to be kept.
4009 */
4011
4012 elog(DEBUG2, "attempting to remove WAL segments newer than log file %s",
4013 switchseg);
4014
4016
4017 while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL)
4018 {
4019 /* Ignore files that are not XLOG segments */
4020 if (!IsXLogFileName(xlde->d_name))
4021 continue;
4022
4023 /*
4024 * Remove files that are on a timeline older than the new one we're
4025 * switching to, but with a segment number >= the first segment on the
4026 * new timeline.
4027 */
4028 if (strncmp(xlde->d_name, switchseg, 8) < 0 &&
4029 strcmp(xlde->d_name + 8, switchseg + 8) > 0)
4030 {
4031 /*
4032 * If the file has already been marked as .ready, however, don't
4033 * remove it yet. It should be OK to remove it - files that are
4034 * not part of our timeline history are not required for recovery
4035 * - but seems safer to let them be archived and removed later.
4036 */
4037 if (!XLogArchiveIsReady(xlde->d_name))
4039 }
4040 }
4041
4042 FreeDir(xldir);
4043}
static void RemoveXlogFile(const struct dirent *segment_de, XLogSegNo recycleSegNo, XLogSegNo *endlogSegNo, TimeLineID insertTLI)
Definition xlog.c:4059
static bool IsXLogFileName(const char *fname)
#define XLOGDIR
bool XLogArchiveIsReady(const char *xlog)

References AllocateDir(), DEBUG2, elog, fb(), FreeDir(), IsXLogFileName(), MAXFNAMELEN, ReadDir(), RemoveXlogFile(), wal_segment_size, XLByteToPrevSeg, XLByteToSeg, XLogArchiveIsReady(), XLOGDIR, and XLogFileName().

Referenced by ApplyWalRecord(), and CleanupAfterArchiveRecovery().

◆ ResetInstallXLogFileSegmentActive()

void ResetInstallXLogFileSegmentActive ( void  )
extern

◆ SetDataChecksumsOff()

void SetDataChecksumsOff ( void  )
extern

Definition at line 4865 of file xlog.c.

4866{
4868
4870
4871 /* If data checksums are already disabled there is nothing to do */
4873 {
4875 return;
4876 }
4877
4878 /*
4879 * If data checksums are currently enabled, or in the process of being
4880 * enabled, we first transition to the "inprogress-off" state during which
4881 * backends continue to write checksums without verifying them. When all
4882 * backends are in "inprogress-off" the next transition to "off" can be
4883 * performed, after which all data checksum processing is disabled.
4884 */
4887 {
4889
4892
4894
4898
4903
4905
4908
4911
4912 /*
4913 * At this point we know that no backends are verifying data checksums
4914 * during reading. Next, we can safely move to state "off" to also
4915 * stop writing checksums.
4916 */
4917 }
4918 else
4919 {
4920 /*
4921 * Ending up here implies that the checksums state is "inprogress-off"
4922 * and we can transition directly to "off" from there.
4923 */
4925 }
4926
4928 /* Ensure that we don't incur a checkpoint during disabling checksums */
4930
4932
4936
4941
4943
4946
4949}
static THREAD_BARRIER_T barrier
Definition pgbench.c:488
void WaitForProcSignalBarrier(uint64 generation)
Definition procsignal.c:436
uint64 EmitProcSignalBarrier(ProcSignalBarrierType type)
Definition procsignal.c:368
@ PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_OFF
Definition procsignal.h:55
@ PROCSIGNAL_BARRIER_CHECKSUM_OFF
Definition procsignal.h:53
PGPROC * MyProc
Definition proc.c:71
int delayChkptFlags
Definition proc.h:260
static void XLogChecksums(uint32 new_type)
Definition xlog.c:8733

References barrier, CHECKPOINT_FAST, CHECKPOINT_FORCE, CHECKPOINT_WAIT, ControlFile, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, DELAY_CHKPT_START, PGPROC::delayChkptFlags, EmitProcSignalBarrier(), END_CRIT_SECTION, fb(), XLogCtlData::info_lck, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), MyProc, PG_DATA_CHECKSUM_INPROGRESS_OFF, PG_DATA_CHECKSUM_INPROGRESS_ON, PG_DATA_CHECKSUM_OFF, PG_DATA_CHECKSUM_VERSION, PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_OFF, PROCSIGNAL_BARRIER_CHECKSUM_OFF, RequestCheckpoint(), SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, UpdateControlFile(), WaitForProcSignalBarrier(), XLogChecksums(), and XLogCtl.

Referenced by DataChecksumsWorkerLauncherMain(), launcher_exit(), ProcessAllDatabases(), and SetDataChecksumsOn().

◆ SetDataChecksumsOn()

void SetDataChecksumsOn ( void  )
extern

Definition at line 4801 of file xlog.c.

4802{
4804
4806
4807 /*
4808 * The only allowed state transition to "on" is from "inprogress-on" since
4809 * that state ensures that all pages will have data checksums written. Any
4810 * other attempted state transition is likely due to a programmer error.
4811 */
4813 {
4815 elog(WARNING,
4816 "cannot set data checksums to \"on\", current state is not \"inprogress-on\", disabling");
4818 return;
4819 }
4820
4822
4823 INJECTION_POINT("datachecksums-enable-checksums-delay", NULL);
4826
4828
4832
4833 /*
4834 * Update the controlfile before waiting since if we have an immediate
4835 * shutdown while waiting we want to come back up with checksums enabled.
4836 */
4841
4843
4846
4849}
@ PROCSIGNAL_BARRIER_CHECKSUM_ON
Definition procsignal.h:56
void SetDataChecksumsOff(void)
Definition xlog.c:4865

References barrier, CHECKPOINT_FAST, CHECKPOINT_FORCE, CHECKPOINT_WAIT, ControlFile, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, DELAY_CHKPT_START, PGPROC::delayChkptFlags, elog, EmitProcSignalBarrier(), END_CRIT_SECTION, fb(), XLogCtlData::info_lck, INJECTION_POINT, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), MyProc, PG_DATA_CHECKSUM_INPROGRESS_ON, PG_DATA_CHECKSUM_VERSION, PROCSIGNAL_BARRIER_CHECKSUM_ON, RequestCheckpoint(), SetDataChecksumsOff(), SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, UpdateControlFile(), WaitForProcSignalBarrier(), WARNING, XLogChecksums(), and XLogCtl.

Referenced by DataChecksumsWorkerLauncherMain().

◆ SetDataChecksumsOnInProgress()

void SetDataChecksumsOnInProgress ( void  )
extern

Definition at line 4748 of file xlog.c.

4749{
4751
4752 /*
4753 * The state transition is performed in a critical section with
4754 * checkpoints held off to provide crash safety.
4755 */
4758
4760
4764
4769
4771
4774
4776}
@ PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON
Definition procsignal.h:54

References barrier, ControlFile, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, DELAY_CHKPT_START, PGPROC::delayChkptFlags, EmitProcSignalBarrier(), END_CRIT_SECTION, fb(), XLogCtlData::info_lck, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), MyProc, PG_DATA_CHECKSUM_INPROGRESS_ON, PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON, SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, UpdateControlFile(), WaitForProcSignalBarrier(), XLogChecksums(), and XLogCtl.

Referenced by DataChecksumsWorkerLauncherMain().

◆ SetInstallXLogFileSegmentActive()

void SetInstallXLogFileSegmentActive ( void  )
extern

◆ SetLocalDataChecksumState()

void SetLocalDataChecksumState ( uint32  data_checksum_version)
extern

Definition at line 4969 of file xlog.c.

4970{
4971 LocalDataChecksumState = data_checksum_version;
4972
4973 data_checksums = data_checksum_version;
4974}
int data_checksums
Definition xlog.c:683

References data_checksums, and LocalDataChecksumState.

Referenced by AbsorbDataChecksumsBarrier(), InitLocalDataChecksumState(), LocalProcessControlFile(), StartupXLOG(), xlog_redo(), and XLOGShmemInit().

◆ SetWalWriterSleeping()

void SetWalWriterSleeping ( bool  sleeping)
extern

◆ show_data_checksums()

const char * show_data_checksums ( void  )
extern

Definition at line 4978 of file xlog.c.

4979{
4981}
const char * get_checksum_state_string(uint32 state)
Definition xlogdesc.c:59

References get_checksum_state_string(), and LocalDataChecksumState.

◆ ShutdownXLOG()

void ShutdownXLOG ( int  code,
Datum  arg 
)
extern

Definition at line 7103 of file xlog.c.

7104{
7105 /*
7106 * We should have an aux process resource owner to use, and we should not
7107 * be in a transaction that's installed some other resowner.
7108 */
7113
7114 /* Don't be chatty in standalone mode */
7116 (errmsg("shutting down")));
7117
7118 /*
7119 * Signal walsenders to move to stopping state.
7120 */
7122
7123 /*
7124 * Wait for WAL senders to be in stopping state. This prevents commands
7125 * from writing new WAL.
7126 */
7128
7129 if (RecoveryInProgress())
7131 else
7132 {
7133 /*
7134 * If archiving is enabled, rotate the last XLOG file so that all the
7135 * remaining records are archived (postmaster wakes up the archiver
7136 * process one more time at the end of shutdown). The checkpoint
7137 * record will go to the next XLOG file and won't be archived (yet).
7138 */
7139 if (XLogArchivingActive())
7140 RequestXLogSwitch(false);
7141
7143 }
7144}
bool IsPostmasterEnvironment
Definition globals.c:121
ResourceOwner CurrentResourceOwner
Definition resowner.c:173
ResourceOwner AuxProcessResourceOwner
Definition resowner.c:176
void WalSndInitStopping(void)
Definition walsender.c:4119
void WalSndWaitStopping(void)
Definition walsender.c:4145
bool CreateRestartPoint(int flags)
Definition xlog.c:8129
bool CreateCheckPoint(int flags)
Definition xlog.c:7400

References Assert, AuxProcessResourceOwner, CHECKPOINT_FAST, CHECKPOINT_IS_SHUTDOWN, CreateCheckPoint(), CreateRestartPoint(), CurrentResourceOwner, ereport, errmsg, fb(), IsPostmasterEnvironment, LOG, NOTICE, RecoveryInProgress(), RequestXLogSwitch(), WalSndInitStopping(), WalSndWaitStopping(), and XLogArchivingActive.

Referenced by CheckpointerMain(), and InitPostgres().

◆ StartupXLOG()

void StartupXLOG ( void  )
extern

Definition at line 5845 of file xlog.c.

5846{
5848 CheckPoint checkPoint;
5849 bool wasShutdown;
5850 bool didCrash;
5851 bool haveTblspcMap;
5852 bool haveBackupLabel;
5861 bool promoted = false;
5862 char timebuf[128];
5863
5864 /*
5865 * We should have an aux process resource owner to use, and we should not
5866 * be in a transaction that's installed some other resowner.
5867 */
5872
5873 /*
5874 * Check that contents look valid.
5875 */
5877 ereport(FATAL,
5879 errmsg("control file contains invalid checkpoint location")));
5880
5881 switch (ControlFile->state)
5882 {
5883 case DB_SHUTDOWNED:
5884
5885 /*
5886 * This is the expected case, so don't be chatty in standalone
5887 * mode
5888 */
5890 (errmsg("database system was shut down at %s",
5891 str_time(ControlFile->time,
5892 timebuf, sizeof(timebuf)))));
5893 break;
5894
5896 ereport(LOG,
5897 (errmsg("database system was shut down in recovery at %s",
5899 timebuf, sizeof(timebuf)))));
5900 break;
5901
5902 case DB_SHUTDOWNING:
5903 ereport(LOG,
5904 (errmsg("database system shutdown was interrupted; last known up at %s",
5906 timebuf, sizeof(timebuf)))));
5907 break;
5908
5910 ereport(LOG,
5911 (errmsg("database system was interrupted while in recovery at %s",
5913 timebuf, sizeof(timebuf))),
5914 errhint("This probably means that some data is corrupted and"
5915 " you will have to use the last backup for recovery.")));
5916 break;
5917
5919 ereport(LOG,
5920 (errmsg("database system was interrupted while in recovery at log time %s",
5922 timebuf, sizeof(timebuf))),
5923 errhint("If this has occurred more than once some data might be corrupted"
5924 " and you might need to choose an earlier recovery target.")));
5925 break;
5926
5927 case DB_IN_PRODUCTION:
5928 ereport(LOG,
5929 (errmsg("database system was interrupted; last known up at %s",
5931 timebuf, sizeof(timebuf)))));
5932 break;
5933
5934 default:
5935 ereport(FATAL,
5937 errmsg("control file contains invalid database cluster state")));
5938 }
5939
5940 /* This is just to allow attaching to startup process with a debugger */
5941#ifdef XLOG_REPLAY_DELAY
5943 pg_usleep(60000000L);
5944#endif
5945
5946 /*
5947 * Verify that pg_wal, pg_wal/archive_status, and pg_wal/summaries exist.
5948 * In cases where someone has performed a copy for PITR, these directories
5949 * may have been excluded and need to be re-created.
5950 */
5952
5953 /* Set up timeout handler needed to report startup progress. */
5957
5958 /*----------
5959 * If we previously crashed, perform a couple of actions:
5960 *
5961 * - The pg_wal directory may still include some temporary WAL segments
5962 * used when creating a new segment, so perform some clean up to not
5963 * bloat this path. This is done first as there is no point to sync
5964 * this temporary data.
5965 *
5966 * - There might be data which we had written, intending to fsync it, but
5967 * which we had not actually fsync'd yet. Therefore, a power failure in
5968 * the near future might cause earlier unflushed writes to be lost, even
5969 * though more recent data written to disk from here on would be
5970 * persisted. To avoid that, fsync the entire data directory.
5971 */
5974 {
5977 didCrash = true;
5978 }
5979 else
5980 didCrash = false;
5981
5982 /*
5983 * Prepare for WAL recovery if needed.
5984 *
5985 * InitWalRecovery analyzes the control file and the backup label file, if
5986 * any. It updates the in-memory ControlFile buffer according to the
5987 * starting checkpoint, and sets InRecovery and ArchiveRecoveryRequested.
5988 * It also applies the tablespace map file, if any.
5989 */
5992 checkPoint = ControlFile->checkPointCopy;
5993
5994 /* initialize shared memory variables from the checkpoint record */
5995 TransamVariables->nextXid = checkPoint.nextXid;
5996 TransamVariables->nextOid = checkPoint.nextOid;
5998 MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset);
5999 AdvanceOldestClogXid(checkPoint.oldestXid);
6000 SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB);
6001 SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB);
6003 checkPoint.newestCommitTsXid);
6004
6005 /*
6006 * Clear out any old relcache cache files. This is *necessary* if we do
6007 * any WAL replay, since that would probably result in the cache files
6008 * being out of sync with database reality. In theory we could leave them
6009 * in place if the database had been cleanly shut down, but it seems
6010 * safest to just remove them always and let them be rebuilt during the
6011 * first backend startup. These files needs to be removed from all
6012 * directories including pg_tblspc, however the symlinks are created only
6013 * after reading tablespace_map file in case of archive recovery from
6014 * backup, so needs to clear old relcache files here after creating
6015 * symlinks.
6016 */
6018
6019 /*
6020 * Initialize replication slots, before there's a chance to remove
6021 * required resources.
6022 */
6024
6025 /*
6026 * Startup the logical decoding status with the last status stored in the
6027 * checkpoint record.
6028 */
6030
6031 /*
6032 * Startup logical state, needs to be setup now so we have proper data
6033 * during crash recovery.
6034 */
6036
6037 /*
6038 * Startup CLOG. This must be done after TransamVariables->nextXid has
6039 * been initialized and before we accept connections or begin WAL replay.
6040 */
6041 StartupCLOG();
6042
6043 /*
6044 * Startup MultiXact. We need to do this early to be able to replay
6045 * truncations.
6046 */
6048
6049 /*
6050 * Ditto for commit timestamps. Activate the facility if the setting is
6051 * enabled in the control file, as there should be no tracking of commit
6052 * timestamps done when the setting was disabled. This facility can be
6053 * started or stopped when replaying a XLOG_PARAMETER_CHANGE record.
6054 */
6057
6058 /*
6059 * Recover knowledge about replay progress of known replication partners.
6060 */
6062
6063 /*
6064 * Initialize unlogged LSN. On a clean shutdown, it's restored from the
6065 * control file. On recovery, all unlogged relations are blown away, so
6066 * the unlogged LSN counter can be reset too.
6067 */
6071 else
6074
6075 /*
6076 * Copy any missing timeline history files between 'now' and the recovery
6077 * target timeline from archive to pg_wal. While we don't need those files
6078 * ourselves - the history file of the recovery target timeline covers all
6079 * the previous timelines in the history too - a cascading standby server
6080 * might be interested in them. Or, if you archive the WAL from this
6081 * server to a different archive than the primary, it'd be good for all
6082 * the history files to get archived there after failover, so that you can
6083 * use one of the old timelines as a PITR target. Timeline history files
6084 * are small, so it's better to copy them unnecessarily than not copy them
6085 * and regret later.
6086 */
6088
6089 /*
6090 * Before running in recovery, scan pg_twophase and fill in its status to
6091 * be able to work on entries generated by redo. Doing a scan before
6092 * taking any recovery action has the merit to discard any 2PC files that
6093 * are newer than the first record to replay, saving from any conflicts at
6094 * replay. This avoids as well any subsequent scans when doing recovery
6095 * of the on-disk two-phase data.
6096 */
6098
6099 /*
6100 * When starting with crash recovery, reset pgstat data - it might not be
6101 * valid. Otherwise restore pgstat data. It's safe to do this here,
6102 * because postmaster will not yet have started any other processes.
6103 *
6104 * NB: Restoring replication slot stats relies on slot state to have
6105 * already been restored from disk.
6106 *
6107 * TODO: With a bit of extra work we could just start with a pgstat file
6108 * associated with the checkpoint redo location we're starting from.
6109 */
6110 if (didCrash)
6112 else
6114
6116
6119
6120 /* REDO */
6121 if (InRecovery)
6122 {
6123 /* Initialize state for RecoveryInProgress() */
6127 else
6130
6131 /*
6132 * Update pg_control to show that we are recovering and to show the
6133 * selected checkpoint as the place we are starting from. We also mark
6134 * pg_control with any minimum recovery stop point obtained from a
6135 * backup history file.
6136 *
6137 * No need to hold ControlFileLock yet, we aren't up far enough.
6138 */
6140
6141 /*
6142 * If there was a backup label file, it's done its job and the info
6143 * has now been propagated into pg_control. We must get rid of the
6144 * label file so that if we crash during recovery, we'll pick up at
6145 * the latest recovery restartpoint instead of going all the way back
6146 * to the backup start point. It seems prudent though to just rename
6147 * the file out of the way rather than delete it completely.
6148 */
6149 if (haveBackupLabel)
6150 {
6153 }
6154
6155 /*
6156 * If there was a tablespace_map file, it's done its job and the
6157 * symlinks have been created. We must get rid of the map file so
6158 * that if we crash during recovery, we don't create symlinks again.
6159 * It seems prudent though to just rename the file out of the way
6160 * rather than delete it completely.
6161 */
6162 if (haveTblspcMap)
6163 {
6166 }
6167
6168 /*
6169 * Initialize our local copy of minRecoveryPoint. When doing crash
6170 * recovery we want to replay up to the end of WAL. Particularly, in
6171 * the case of a promoted standby minRecoveryPoint value in the
6172 * control file is only updated after the first checkpoint. However,
6173 * if the instance crashes before the first post-recovery checkpoint
6174 * is completed then recovery will use a stale location causing the
6175 * startup process to think that there are still invalid page
6176 * references when checking for data consistency.
6177 */
6179 {
6182 }
6183 else
6184 {
6187 }
6188
6189 /* Check that the GUCs used to generate the WAL allow recovery */
6191
6192 /*
6193 * We're in recovery, so unlogged relations may be trashed and must be
6194 * reset. This should be done BEFORE allowing Hot Standby
6195 * connections, so that read-only backends don't try to read whatever
6196 * garbage is left over from before.
6197 */
6199
6200 /*
6201 * Likewise, delete any saved transaction snapshot files that got left
6202 * behind by crashed backends.
6203 */
6205
6206 /*
6207 * Initialize for Hot Standby, if enabled. We won't let backends in
6208 * yet, not until we've reached the min recovery point specified in
6209 * control file and we've established a recovery snapshot from a
6210 * running-xacts WAL record.
6211 */
6213 {
6214 TransactionId *xids;
6215 int nxids;
6216
6218 (errmsg_internal("initializing for hot standby")));
6219
6221
6222 if (wasShutdown)
6224 else
6225 oldestActiveXID = checkPoint.oldestActiveXid;
6227
6228 /* Tell procarray about the range of xids it has to deal with */
6230
6231 /*
6232 * Startup subtrans only. CLOG, MultiXact and commit timestamp
6233 * have already been started up and other SLRUs are not maintained
6234 * during recovery and need not be started yet.
6235 */
6237
6238 /*
6239 * If we're beginning at a shutdown checkpoint, we know that
6240 * nothing was running on the primary at this point. So fake-up an
6241 * empty running-xacts record and use that here and now. Recover
6242 * additional standby state for prepared transactions.
6243 */
6244 if (wasShutdown)
6245 {
6247 TransactionId latestCompletedXid;
6248
6249 /* Update pg_subtrans entries for any prepared transactions */
6251
6252 /*
6253 * Construct a RunningTransactions snapshot representing a
6254 * shut down server, with only prepared transactions still
6255 * alive. We're never overflowed at this point because all
6256 * subxids are listed with their parent prepared transactions.
6257 */
6258 running.xcnt = nxids;
6259 running.subxcnt = 0;
6261 running.nextXid = XidFromFullTransactionId(checkPoint.nextXid);
6263 latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid);
6264 TransactionIdRetreat(latestCompletedXid);
6265 Assert(TransactionIdIsNormal(latestCompletedXid));
6266 running.latestCompletedXid = latestCompletedXid;
6267 running.xids = xids;
6268
6270 }
6271 }
6272
6273 /*
6274 * We're all set for replaying the WAL now. Do it.
6275 */
6277 performedWalRecovery = true;
6278 }
6279 else
6280 performedWalRecovery = false;
6281
6282 /*
6283 * Finish WAL recovery.
6284 */
6286 EndOfLog = endOfRecoveryInfo->endOfLog;
6287 EndOfLogTLI = endOfRecoveryInfo->endOfLogTLI;
6288 abortedRecPtr = endOfRecoveryInfo->abortedRecPtr;
6289 missingContrecPtr = endOfRecoveryInfo->missingContrecPtr;
6290
6291 /*
6292 * Reset ps status display, so as no information related to recovery shows
6293 * up.
6294 */
6295 set_ps_display("");
6296
6297 /*
6298 * When recovering from a backup (we are in recovery, and archive recovery
6299 * was requested), complain if we did not roll forward far enough to reach
6300 * the point where the database is consistent. For regular online
6301 * backup-from-primary, that means reaching the end-of-backup WAL record
6302 * (at which point we reset backupStartPoint to be Invalid), for
6303 * backup-from-replica (which can't inject records into the WAL stream),
6304 * that point is when we reach the minRecoveryPoint in pg_control (which
6305 * we purposefully copy last when backing up from a replica). For
6306 * pg_rewind (which creates a backup_label with a method of "pg_rewind")
6307 * or snapshot-style backups (which don't), backupEndRequired will be set
6308 * to false.
6309 *
6310 * Note: it is indeed okay to look at the local variable
6311 * LocalMinRecoveryPoint here, even though ControlFile->minRecoveryPoint
6312 * might be further ahead --- ControlFile->minRecoveryPoint cannot have
6313 * been advanced beyond the WAL we processed.
6314 */
6315 if (InRecovery &&
6318 {
6319 /*
6320 * Ran off end of WAL before reaching end-of-backup WAL record, or
6321 * minRecoveryPoint. That's a bad sign, indicating that you tried to
6322 * recover from an online backup but never called pg_backup_stop(), or
6323 * you didn't archive all the WAL needed.
6324 */
6326 {
6328 ereport(FATAL,
6330 errmsg("WAL ends before end of online backup"),
6331 errhint("All WAL generated while online backup was taken must be available at recovery.")));
6332 else
6333 ereport(FATAL,
6335 errmsg("WAL ends before consistent recovery point")));
6336 }
6337 }
6338
6339 /*
6340 * Reset unlogged relations to the contents of their INIT fork. This is
6341 * done AFTER recovery is complete so as to include any unlogged relations
6342 * created during recovery, but BEFORE recovery is marked as having
6343 * completed successfully. Otherwise we'd not retry if any of the post
6344 * end-of-recovery steps fail.
6345 */
6346 if (InRecovery)
6348
6349 /*
6350 * Pre-scan prepared transactions to find out the range of XIDs present.
6351 * This information is not quite needed yet, but it is positioned here so
6352 * as potential problems are detected before any on-disk change is done.
6353 */
6355
6356 /*
6357 * Allow ordinary WAL segment creation before possibly switching to a new
6358 * timeline, which creates a new segment, and after the last ReadRecord().
6359 */
6361
6362 /*
6363 * Consider whether we need to assign a new timeline ID.
6364 *
6365 * If we did archive recovery, we always assign a new ID. This handles a
6366 * couple of issues. If we stopped short of the end of WAL during
6367 * recovery, then we are clearly generating a new timeline and must assign
6368 * it a unique new ID. Even if we ran to the end, modifying the current
6369 * last segment is problematic because it may result in trying to
6370 * overwrite an already-archived copy of that segment, and we encourage
6371 * DBAs to make their archive_commands reject that. We can dodge the
6372 * problem by making the new active segment have a new timeline ID.
6373 *
6374 * In a normal crash recovery, we can just extend the timeline we were in.
6375 */
6376 newTLI = endOfRecoveryInfo->lastRecTLI;
6378 {
6380 ereport(LOG,
6381 (errmsg("selected new timeline ID: %u", newTLI)));
6382
6383 /*
6384 * Make a writable copy of the last WAL segment. (Note that we also
6385 * have a copy of the last block of the old WAL in
6386 * endOfRecovery->lastPage; we will use that below.)
6387 */
6389
6390 /*
6391 * Remove the signal files out of the way, so that we don't
6392 * accidentally re-enter archive recovery mode in a subsequent crash.
6393 */
6394 if (endOfRecoveryInfo->standby_signal_file_found)
6396
6397 if (endOfRecoveryInfo->recovery_signal_file_found)
6399
6400 /*
6401 * Write the timeline history file, and have it archived. After this
6402 * point (or rather, as soon as the file is archived), the timeline
6403 * will appear as "taken" in the WAL archive and to any standby
6404 * servers. If we crash before actually switching to the new
6405 * timeline, standby servers will nevertheless think that we switched
6406 * to the new timeline, and will try to connect to the new timeline.
6407 * To minimize the window for that, try to do as little as possible
6408 * between here and writing the end-of-recovery record.
6409 */
6411 EndOfLog, endOfRecoveryInfo->recoveryStopReason);
6412
6413 ereport(LOG,
6414 (errmsg("archive recovery complete")));
6415 }
6416
6417 /* Save the selected TimeLineID in shared memory, too */
6422
6423 /*
6424 * Actually, if WAL ended in an incomplete record, skip the parts that
6425 * made it through and start writing after the portion that persisted.
6426 * (It's critical to first write an OVERWRITE_CONTRECORD message, which
6427 * we'll do as soon as we're open for writing new WAL.)
6428 */
6430 {
6431 /*
6432 * We should only have a missingContrecPtr if we're not switching to a
6433 * new timeline. When a timeline switch occurs, WAL is copied from the
6434 * old timeline to the new only up to the end of the last complete
6435 * record, so there can't be an incomplete WAL record that we need to
6436 * disregard.
6437 */
6438 Assert(newTLI == endOfRecoveryInfo->lastRecTLI);
6441 }
6442
6443 /*
6444 * Prepare to write WAL starting at EndOfLog location, and init xlog
6445 * buffer cache using the block containing the last record from the
6446 * previous incarnation.
6447 */
6448 Insert = &XLogCtl->Insert;
6450 Insert->CurrBytePos = XLogRecPtrToBytePos(EndOfLog);
6451
6452 /*
6453 * Tricky point here: lastPage contains the *last* block that the LastRec
6454 * record spans, not the one it starts in. The last block is indeed the
6455 * one we want to use.
6456 */
6457 if (EndOfLog % XLOG_BLCKSZ != 0)
6458 {
6459 char *page;
6460 int len;
6461 int firstIdx;
6462
6464 len = EndOfLog - endOfRecoveryInfo->lastPageBeginPtr;
6466
6467 /* Copy the valid part of the last block, and zero the rest */
6468 page = &XLogCtl->pages[firstIdx * XLOG_BLCKSZ];
6469 memcpy(page, endOfRecoveryInfo->lastPage, len);
6470 memset(page + len, 0, XLOG_BLCKSZ - len);
6471
6474 }
6475 else
6476 {
6477 /*
6478 * There is no partial block to copy. Just set InitializedUpTo, and
6479 * let the first attempt to insert a log record to initialize the next
6480 * buffer.
6481 */
6483 }
6484
6485 /*
6486 * Update local and shared status. This is OK to do without any locks
6487 * because no other process can be reading or writing WAL yet.
6488 */
6495
6496 /*
6497 * Preallocate additional log files, if wanted.
6498 */
6500
6501 /*
6502 * Okay, we're officially UP.
6503 */
6504 InRecovery = false;
6505
6506 /* start the archive_timeout timer and LSN running */
6509
6510 /* also initialize latestCompletedXid, to nextXid - 1 */
6515
6516 /*
6517 * Start up subtrans, if not already done for hot standby. (commit
6518 * timestamps are started below, if necessary.)
6519 */
6522
6523 /*
6524 * Perform end of recovery actions for any SLRUs that need it.
6525 */
6526 TrimCLOG();
6527 TrimMultiXact();
6528
6529 /*
6530 * Reload shared-memory state for prepared transactions. This needs to
6531 * happen before renaming the last partial segment of the old timeline as
6532 * it may be possible that we have to recover some transactions from it.
6533 */
6535
6536 /* Shut down xlogreader */
6538
6539 /* Enable WAL writes for this backend only. */
6541
6542 /* If necessary, write overwrite-contrecord before doing anything else */
6544 {
6547 }
6548
6549 /*
6550 * Update full_page_writes in shared memory and write an XLOG_FPW_CHANGE
6551 * record before resource manager writes cleanup WAL records or checkpoint
6552 * record is written.
6553 */
6554 Insert->fullPageWrites = lastFullPageWrites;
6556
6557 /*
6558 * Emit checkpoint or end-of-recovery record in XLOG, if required.
6559 */
6562
6563 /*
6564 * If any of the critical GUCs have changed, log them before we allow
6565 * backends to write WAL.
6566 */
6568
6569 /* If this is archive recovery, perform post-recovery cleanup actions. */
6572
6573 INJECTION_POINT("promotion-after-wal-segment-cleanup", NULL);
6574
6575 /*
6576 * Local WAL inserts enabled, so it's time to finish initialization of
6577 * commit timestamp.
6578 */
6580
6581 /*
6582 * Update logical decoding status in shared memory and write an
6583 * XLOG_LOGICAL_DECODING_STATUS_CHANGE, if necessary.
6584 */
6586
6587 /* Clean up EndOfWalRecoveryInfo data to appease Valgrind leak checking */
6588 if (endOfRecoveryInfo->lastPage)
6589 pfree(endOfRecoveryInfo->lastPage);
6590 pfree(endOfRecoveryInfo->recoveryStopReason);
6592
6593 /*
6594 * If we reach this point with checksums in the state inprogress-on, it
6595 * means that data checksums were in the process of being enabled when the
6596 * cluster shut down. Since processing didn't finish, the operation will
6597 * have to be restarted from scratch since there is no capability to
6598 * continue where it was when the cluster shut down. Thus, revert the
6599 * state back to off, and inform the user with a warning message. Being
6600 * able to restart processing is a TODO, but it wouldn't be possible to
6601 * restart here since we cannot launch a dynamic background worker
6602 * directly from here (it has to be from a regular backend).
6603 */
6605 {
6607
6612
6615 errmsg("enabling data checksums was interrupted"),
6616 errhint("Data checksum processing must be manually restarted for checksums to be enabled."));
6617 }
6618
6619 /*
6620 * If data checksums were being disabled when the cluster was shut down,
6621 * we know that we have a state where all backends have stopped validating
6622 * checksums and we can move to off instead of prompting the user to
6623 * perform any action.
6624 */
6626 {
6628
6633
6635 }
6636
6637 /*
6638 * All done with end-of-recovery actions.
6639 *
6640 * Now allow backends to write WAL and update the control file status in
6641 * consequence. SharedRecoveryState, that controls if backends can write
6642 * WAL, is updated while holding ControlFileLock to prevent other backends
6643 * to look at an inconsistent state of the control file in shared memory.
6644 * There is still a small window during which backends can write WAL and
6645 * the control file is still referring to a system not in DB_IN_PRODUCTION
6646 * state while looking at the on-disk control file.
6647 *
6648 * Also, we use info_lck to update SharedRecoveryState to ensure that
6649 * there are no race conditions concerning visibility of other recent
6650 * updates to shared memory.
6651 */
6654
6659
6662
6663 /*
6664 * Wake up the checkpointer process as there might be a request to disable
6665 * logical decoding by concurrent slot drop.
6666 */
6668
6669 /*
6670 * Wake up all waiters. They need to report an error that recovery was
6671 * ended before reaching the target LSN.
6672 */
6676
6677 /*
6678 * Shutdown the recovery environment. This must occur after
6679 * RecoverPreparedTransactions() (see notes in lock_twophase_recover())
6680 * and after switching SharedRecoveryState to RECOVERY_STATE_DONE so as
6681 * any session building a snapshot will not rely on KnownAssignedXids as
6682 * RecoveryInProgress() would return false at this stage. This is
6683 * particularly critical for prepared 2PC transactions, that would still
6684 * need to be included in snapshots once recovery has ended.
6685 */
6688
6689 /*
6690 * If there were cascading standby servers connected to us, nudge any wal
6691 * sender processes to notice that we've been promoted.
6692 */
6693 WalSndWakeup(true, true);
6694
6695 /*
6696 * If this was a promotion, request an (online) checkpoint now. This isn't
6697 * required for consistency, but the last restartpoint might be far back,
6698 * and in case of a crash, recovering from it might take a longer than is
6699 * appropriate now that we're not in standby mode anymore.
6700 */
6701 if (promoted)
6703}
static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition atomics.h:480
static void pg_atomic_write_membarrier_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition atomics.h:499
void writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI, XLogRecPtr switchpoint, const char *reason)
Definition timeline.c:305
TimeLineID findNewestTimeLine(TimeLineID startTLI)
Definition timeline.c:265
void restoreTimeLineHistoryFiles(TimeLineID begin, TimeLineID end)
Definition timeline.c:51
void startup_progress_timeout_handler(void)
Definition startup.c:302
uint32 TransactionId
Definition c.h:795
void WakeupCheckpointer(void)
void StartupCLOG(void)
Definition clog.c:861
void TrimCLOG(void)
Definition clog.c:876
void StartupCommitTs(void)
Definition commit_ts.c:613
void CompleteCommitTsInitialization(void)
Definition commit_ts.c:623
void EmitAndWaitDataChecksumsBarrier(uint32 state)
#define FATAL
Definition elog.h:42
int durable_rename(const char *oldfile, const char *newfile, int elevel)
Definition fd.c:783
int durable_unlink(const char *fname, int elevel)
Definition fd.c:873
void SyncDataDirectory(void)
Definition fd.c:3592
void UpdateLogicalDecodingStatusEndOfRecovery(void)
Definition logicalctl.c:558
void StartupLogicalDecodingStatus(bool last_status)
Definition logicalctl.c:144
#define IsBootstrapProcessingMode()
Definition miscadmin.h:486
void TrimMultiXact(void)
Definition multixact.c:1904
void StartupMultiXact(void)
Definition multixact.c:1879
void StartupReplicationOrigin(void)
Definition origin.c:740
#define ERRCODE_DATA_CORRUPTED
@ DB_IN_PRODUCTION
Definition pg_control.h:105
@ DB_IN_CRASH_RECOVERY
Definition pg_control.h:103
const void size_t len
void pgstat_restore_stats(void)
Definition pgstat.c:525
void pgstat_discard_stats(void)
Definition pgstat.c:537
void ProcArrayApplyRecoveryInfo(RunningTransactions running)
Definition procarray.c:1045
void ProcArrayInitRecovery(TransactionId initializedUptoXID)
Definition procarray.c:1014
static void set_ps_display(const char *activity)
Definition ps_status.h:40
void ResetUnloggedRelations(int op)
Definition reinit.c:47
#define UNLOGGED_RELATION_INIT
Definition reinit.h:28
#define UNLOGGED_RELATION_CLEANUP
Definition reinit.h:27
void RelationCacheInitFileRemove(void)
Definition relcache.c:6935
void StartupReorderBuffer(void)
void StartupReplicationSlots(void)
Definition slot.c:2398
void DeleteAllExportedSnapshotFiles(void)
Definition snapmgr.c:1586
void InitRecoveryTransactionEnvironment(void)
Definition standby.c:96
void ShutdownRecoveryTransactionEnvironment(void)
Definition standby.c:162
@ SUBXIDS_IN_SUBTRANS
Definition standby.h:123
bool track_commit_timestamp
Definition pg_control.h:193
TransactionId oldestRunningXid
Definition standby.h:133
TransactionId nextXid
Definition standby.h:132
TransactionId latestCompletedXid
Definition standby.h:136
subxids_array_status subxid_status
Definition standby.h:131
TransactionId * xids
Definition standby.h:138
FullTransactionId latestCompletedXid
Definition transam.h:238
XLogRecPtr InitializedUpTo
Definition xlog.c:491
char * pages
Definition xlog.c:498
pg_time_t lastSegSwitchTime
Definition xlog.c:473
XLogRecPtr lastSegSwitchLSN
Definition xlog.c:474
pg_atomic_uint64 * xlblocks
Definition xlog.c:499
pg_atomic_uint64 logWriteResult
Definition xlog.c:478
pg_atomic_uint64 logFlushResult
Definition xlog.c:479
pg_atomic_uint64 logInsertResult
Definition xlog.c:477
uint64 PrevBytePos
Definition xlog.c:415
XLogRecPtr Flush
Definition xlog.c:329
void StartupSUBTRANS(TransactionId oldestActiveXID)
Definition subtrans.c:302
TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
Definition timeout.c:505
@ STARTUP_PROGRESS_TIMEOUT
Definition timeout.h:38
#define TransactionIdRetreat(dest)
Definition transam.h:141
static void FullTransactionIdRetreat(FullTransactionId *dest)
Definition transam.h:103
#define XidFromFullTransactionId(x)
Definition transam.h:48
#define TransactionIdIsValid(xid)
Definition transam.h:41
#define TransactionIdIsNormal(xid)
Definition transam.h:42
void RecoverPreparedTransactions(void)
Definition twophase.c:2089
void restoreTwoPhaseData(void)
Definition twophase.c:1910
TransactionId PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p)
Definition twophase.c:1972
void StandbyRecoverPreparedTransactions(void)
Definition twophase.c:2051
void WalSndWakeup(bool physical, bool logical)
Definition walsender.c:4040
void UpdateFullPageWrites(void)
Definition xlog.c:8755
static void ValidateXLOGDirectoryStructure(void)
Definition xlog.c:4149
static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr, TimeLineID newTLI)
Definition xlog.c:7979
static void XLogReportParameters(void)
Definition xlog.c:8674
static bool PerformRecoveryXLogAction(void)
Definition xlog.c:6785
static void CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, XLogRecPtr EndOfLog, TimeLineID newTLI)
Definition xlog.c:5705
static bool lastFullPageWrites
Definition xlog.c:224
static uint64 XLogRecPtrToBytePos(XLogRecPtr ptr)
Definition xlog.c:1982
static void XLogInitNewTimeline(TimeLineID endTLI, XLogRecPtr endOfLog, TimeLineID newTLI)
Definition xlog.c:5630
static void CheckRequiredParameterValues(void)
Definition xlog.c:5801
#define XLogRecPtrToBufIdx(recptr)
Definition xlog.c:611
static void RemoveTempXlogFiles(void)
Definition xlog.c:3882
static char * str_time(pg_time_t tnow, char *buf, size_t bufsize)
Definition xlog.c:5617
#define TABLESPACE_MAP_OLD
Definition xlog.h:338
#define TABLESPACE_MAP
Definition xlog.h:337
#define STANDBY_SIGNAL_FILE
Definition xlog.h:333
#define BACKUP_LABEL_OLD
Definition xlog.h:335
#define BACKUP_LABEL_FILE
Definition xlog.h:334
#define RECOVERY_SIGNAL_FILE
Definition xlog.h:332
#define XRecOffIsValid(xlrp)
#define FirstNormalUnloggedLSN
Definition xlogdefs.h:37
void ShutdownWalRecovery(void)
bool ArchiveRecoveryRequested
bool InArchiveRecovery
void PerformWalRecovery(void)
static XLogRecPtr missingContrecPtr
static XLogRecPtr abortedRecPtr
EndOfWalRecoveryInfo * FinishWalRecovery(void)
void InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, bool *haveBackupLabel_ptr, bool *haveTblspcMap_ptr)
TimeLineID recoveryTargetTLI
HotStandbyState standbyState
Definition xlogutils.c:53
bool InRecovery
Definition xlogutils.c:50
@ STANDBY_DISABLED
Definition xlogutils.h:52
void WaitLSNWakeup(WaitLSNType lsnType, XLogRecPtr currentLSN)
Definition xlogwait.c:344
@ WAIT_LSN_TYPE_STANDBY_REPLAY
Definition xlogwait.h:39
@ WAIT_LSN_TYPE_STANDBY_FLUSH
Definition xlogwait.h:41
@ WAIT_LSN_TYPE_STANDBY_WRITE
Definition xlogwait.h:40

References abortedRecPtr, AdvanceOldestClogXid(), ArchiveRecoveryRequested, Assert, AuxProcessResourceOwner, BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, ControlFileData::backupEndRequired, ControlFileData::backupStartPoint, ControlFileData::checkPoint, CHECKPOINT_FORCE, ControlFileData::checkPointCopy, CheckRequiredParameterValues(), CleanupAfterArchiveRecovery(), CompleteCommitTsInitialization(), ControlFile, CreateOverwriteContrecordRecord(), CurrentResourceOwner, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, DB_IN_ARCHIVE_RECOVERY, DB_IN_CRASH_RECOVERY, DB_IN_PRODUCTION, DB_SHUTDOWNED, DB_SHUTDOWNED_IN_RECOVERY, DB_SHUTDOWNING, DEBUG1, DeleteAllExportedSnapshotFiles(), doPageWrites, durable_rename(), durable_unlink(), EmitAndWaitDataChecksumsBarrier(), EnableHotStandby, ereport, errcode(), ERRCODE_DATA_CORRUPTED, errhint(), errmsg, errmsg_internal(), FATAL, fb(), findNewestTimeLine(), FinishWalRecovery(), FirstNormalUnloggedLSN, XLogwrtRqst::Flush, XLogwrtResult::Flush, CheckPoint::fullPageWrites, FullTransactionIdRetreat(), InArchiveRecovery, XLogCtlData::info_lck, XLogCtlData::InitializedUpTo, InitRecoveryTransactionEnvironment(), InitWalRecovery(), INJECTION_POINT, InRecovery, XLogCtlData::Insert, Insert(), XLogCtlData::InsertTimeLineID, InvalidXLogRecPtr, IsBootstrapProcessingMode, IsPostmasterEnvironment, lastFullPageWrites, XLogCtlData::lastSegSwitchLSN, XLogCtlData::lastSegSwitchTime, TransamVariablesData::latestCompletedXid, RunningTransactionsData::latestCompletedXid, len, LocalMinRecoveryPoint, LocalMinRecoveryPointTLI, LocalSetXLogInsertAllowed(), LOG, XLogCtlData::logFlushResult, CheckPoint::logicalDecodingEnabled, XLogCtlData::logInsertResult, XLogCtlData::logWriteResult, LogwrtResult, XLogCtlData::LogwrtRqst, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), memcpy(), ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, missingContrecPtr, MultiXactSetNextMXact(), CheckPoint::newestCommitTsXid, CheckPoint::nextMulti, CheckPoint::nextMultiOffset, TransamVariablesData::nextOid, CheckPoint::nextOid, TransamVariablesData::nextXid, CheckPoint::nextXid, RunningTransactionsData::nextXid, NOTICE, TransamVariablesData::oidCount, CheckPoint::oldestActiveXid, CheckPoint::oldestCommitTsXid, CheckPoint::oldestMulti, CheckPoint::oldestMultiDB, RunningTransactionsData::oldestRunningXid, CheckPoint::oldestXid, CheckPoint::oldestXidDB, XLogCtlData::pages, PerformRecoveryXLogAction(), PerformWalRecovery(), pfree(), pg_atomic_write_membarrier_u64(), pg_atomic_write_u64(), PG_DATA_CHECKSUM_INPROGRESS_OFF, PG_DATA_CHECKSUM_INPROGRESS_ON, PG_DATA_CHECKSUM_OFF, pg_usleep(), pgstat_discard_stats(), pgstat_restore_stats(), PreallocXlogFiles(), PrescanPreparedTransactions(), XLogCtlInsert::PrevBytePos, XLogCtlData::PrevTimeLineID, ProcArrayApplyRecoveryInfo(), ProcArrayInitRecovery(), RecoverPreparedTransactions(), RECOVERY_SIGNAL_FILE, RECOVERY_STATE_ARCHIVE, RECOVERY_STATE_CRASH, RECOVERY_STATE_DONE, recoveryTargetTLI, CheckPoint::redo, RedoRecPtr, XLogCtlInsert::RedoRecPtr, XLogCtlData::RedoRecPtr, RegisterTimeout(), RelationCacheInitFileRemove(), RemoveTempXlogFiles(), RequestCheckpoint(), ResetUnloggedRelations(), restoreTimeLineHistoryFiles(), restoreTwoPhaseData(), set_ps_display(), SetCommitTsLimit(), SetInstallXLogFileSegmentActive(), SetLocalDataChecksumState(), SetMultiXactIdLimit(), SetTransactionIdLimit(), XLogCtlData::SharedRecoveryState, ShutdownRecoveryTransactionEnvironment(), ShutdownWalRecovery(), SpinLockAcquire(), SpinLockRelease(), STANDBY_DISABLED, STANDBY_SIGNAL_FILE, StandbyRecoverPreparedTransactions(), standbyState, STARTUP_PROGRESS_TIMEOUT, startup_progress_timeout_handler(), StartupCLOG(), StartupCommitTs(), StartupLogicalDecodingStatus(), StartupMultiXact(), StartupReorderBuffer(), StartupReplicationOrigin(), StartupReplicationSlots(), StartupSUBTRANS(), ControlFileData::state, str_time(), RunningTransactionsData::subxcnt, RunningTransactionsData::subxid_status, SUBXIDS_IN_SUBTRANS, SyncDataDirectory(), TABLESPACE_MAP, TABLESPACE_MAP_OLD, CheckPoint::ThisTimeLineID, CheckPoint::time, ControlFileData::time, ControlFileData::track_commit_timestamp, TransactionIdIsNormal, TransactionIdIsValid, TransactionIdRetreat, TransamVariables, TrimCLOG(), TrimMultiXact(), UNLOGGED_RELATION_CLEANUP, UNLOGGED_RELATION_INIT, XLogCtlData::unloggedLSN, ControlFileData::unloggedLSN, UpdateControlFile(), UpdateFullPageWrites(), UpdateLogicalDecodingStatusEndOfRecovery(), ValidateXLOGDirectoryStructure(), WAIT_LSN_TYPE_STANDBY_FLUSH, WAIT_LSN_TYPE_STANDBY_REPLAY, WAIT_LSN_TYPE_STANDBY_WRITE, WaitLSNWakeup(), WakeupCheckpointer(), WalSndWakeup(), WARNING, XLogwrtRqst::Write, XLogwrtResult::Write, writeTimeLineHistory(), RunningTransactionsData::xcnt, XidFromFullTransactionId, RunningTransactionsData::xids, XLogCtlData::xlblocks, XLogChecksums(), XLogCtl, XLogInitNewTimeline(), XLogRecPtrIsValid, XLogRecPtrToBufIdx, XLogRecPtrToBytePos(), XLogReportParameters(), and XRecOffIsValid.

Referenced by InitPostgres(), and StartupProcessMain().

◆ SwitchIntoArchiveRecovery()

void SwitchIntoArchiveRecovery ( XLogRecPtr  EndRecPtr,
TimeLineID  replayTLI 
)
extern

Definition at line 6710 of file xlog.c.

6711{
6712 /* initialize minRecoveryPoint to this record */
6715 if (ControlFile->minRecoveryPoint < EndRecPtr)
6716 {
6717 ControlFile->minRecoveryPoint = EndRecPtr;
6718 ControlFile->minRecoveryPointTLI = replayTLI;
6719 }
6720 /* update local copy */
6723
6724 /*
6725 * The startup process can update its local copy of minRecoveryPoint from
6726 * this point.
6727 */
6729
6731
6732 /*
6733 * We update SharedRecoveryState while holding the lock on ControlFileLock
6734 * so both states are consistent in shared memory.
6735 */
6739
6741}
static bool updateMinRecoveryPoint
Definition xlog.c:668

References ControlFile, DB_IN_ARCHIVE_RECOVERY, fb(), XLogCtlData::info_lck, LocalMinRecoveryPoint, LocalMinRecoveryPointTLI, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, RECOVERY_STATE_ARCHIVE, XLogCtlData::SharedRecoveryState, SpinLockAcquire(), SpinLockRelease(), ControlFileData::state, UpdateControlFile(), updateMinRecoveryPoint, and XLogCtl.

Referenced by ReadRecord().

◆ UpdateFullPageWrites()

void UpdateFullPageWrites ( void  )
extern

Definition at line 8755 of file xlog.c.

8756{
8758 bool recoveryInProgress;
8759
8760 /*
8761 * Do nothing if full_page_writes has not been changed.
8762 *
8763 * It's safe to check the shared full_page_writes without the lock,
8764 * because we assume that there is no concurrently running process which
8765 * can update it.
8766 */
8767 if (fullPageWrites == Insert->fullPageWrites)
8768 return;
8769
8770 /*
8771 * Perform this outside critical section so that the WAL insert
8772 * initialization done by RecoveryInProgress() doesn't trigger an
8773 * assertion failure.
8774 */
8776
8778
8779 /*
8780 * It's always safe to take full page images, even when not strictly
8781 * required, but not the other round. So if we're setting full_page_writes
8782 * to true, first set it true and then write the WAL record. If we're
8783 * setting it to false, first write the WAL record and then set the global
8784 * flag.
8785 */
8786 if (fullPageWrites)
8787 {
8789 Insert->fullPageWrites = true;
8791 }
8792
8793 /*
8794 * Write an XLOG_FPW_CHANGE record. This allows us to keep track of
8795 * full_page_writes during archive recovery, if required.
8796 */
8798 {
8800 XLogRegisterData(&fullPageWrites, sizeof(bool));
8801
8803 }
8804
8805 if (!fullPageWrites)
8806 {
8808 Insert->fullPageWrites = false;
8810 }
8812}
#define XLOG_FPW_CHANGE
Definition pg_control.h:80

References END_CRIT_SECTION, fb(), fullPageWrites, XLogCtlData::Insert, Insert(), RecoveryInProgress(), START_CRIT_SECTION, WALInsertLockAcquireExclusive(), WALInsertLockRelease(), XLOG_FPW_CHANGE, XLogBeginInsert(), XLogCtl, XLogInsert(), XLogRegisterData(), and XLogStandbyInfoActive.

Referenced by StartupXLOG(), and UpdateSharedMemoryConfig().

◆ WakeupCheckpointer()

void WakeupCheckpointer ( void  )
extern

Definition at line 1536 of file checkpointer.c.

1537{
1539
1540 if (checkpointerProc != INVALID_PROC_NUMBER)
1541 SetLatch(&GetPGProcByNumber(checkpointerProc)->procLatch);
1542}
static uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
Definition atomics.h:232
void SetLatch(Latch *latch)
Definition latch.c:290
#define GetPGProcByNumber(n)
Definition proc.h:506
#define INVALID_PROC_NUMBER
Definition procnumber.h:26
int ProcNumber
Definition procnumber.h:24
PROC_HDR * ProcGlobal
Definition proc.c:74
pg_atomic_uint32 checkpointerProc
Definition proc.h:489

References PROC_HDR::checkpointerProc, GetPGProcByNumber, INVALID_PROC_NUMBER, pg_atomic_read_u32(), ProcGlobal, and SetLatch().

Referenced by RequestDisableLogicalDecoding(), and StartupXLOG().

◆ WALReadFromBuffers()

Size WALReadFromBuffers ( char dstbuf,
XLogRecPtr  startptr,
Size  count,
TimeLineID  tli 
)
extern

Definition at line 1789 of file xlog.c.

1791{
1792 char *pdst = dstbuf;
1793 XLogRecPtr recptr = startptr;
1795 Size nbytes = count;
1796
1798 return 0;
1799
1800 Assert(XLogRecPtrIsValid(startptr));
1801
1802 /*
1803 * Caller should ensure that the requested data has been inserted into WAL
1804 * buffers before we try to read it.
1805 */
1807 if (startptr + count > inserted)
1808 ereport(ERROR,
1809 errmsg("cannot read past end of generated WAL: requested %X/%08X, current position %X/%08X",
1810 LSN_FORMAT_ARGS(startptr + count),
1812
1813 /*
1814 * Loop through the buffers without a lock. For each buffer, atomically
1815 * read and verify the end pointer, then copy the data out, and finally
1816 * re-read and re-verify the end pointer.
1817 *
1818 * Once a page is evicted, it never returns to the WAL buffers, so if the
1819 * end pointer matches the expected end pointer before and after we copy
1820 * the data, then the right page must have been present during the data
1821 * copy. Read barriers are necessary to ensure that the data copy actually
1822 * happens between the two verification steps.
1823 *
1824 * If either verification fails, we simply terminate the loop and return
1825 * with the data that had been already copied out successfully.
1826 */
1827 while (nbytes > 0)
1828 {
1829 uint32 offset = recptr % XLOG_BLCKSZ;
1832 XLogRecPtr endptr;
1833 const char *page;
1834 const char *psrc;
1836
1837 /*
1838 * Calculate the end pointer we expect in the xlblocks array if the
1839 * correct page is present.
1840 */
1841 expectedEndPtr = recptr + (XLOG_BLCKSZ - offset);
1842
1843 /*
1844 * First verification step: check that the correct page is present in
1845 * the WAL buffers.
1846 */
1848 if (expectedEndPtr != endptr)
1849 break;
1850
1851 /*
1852 * The correct page is present (or was at the time the endptr was
1853 * read; must re-verify later). Calculate pointer to source data and
1854 * determine how much data to read from this page.
1855 */
1856 page = XLogCtl->pages + idx * (Size) XLOG_BLCKSZ;
1857 psrc = page + offset;
1858 npagebytes = Min(nbytes, XLOG_BLCKSZ - offset);
1859
1860 /*
1861 * Ensure that the data copy and the first verification step are not
1862 * reordered.
1863 */
1865
1866 /* data copy */
1868
1869 /*
1870 * Ensure that the data copy and the second verification step are not
1871 * reordered.
1872 */
1874
1875 /*
1876 * Second verification step: check that the page we read from wasn't
1877 * evicted while we were copying the data.
1878 */
1880 if (expectedEndPtr != endptr)
1881 break;
1882
1883 pdst += npagebytes;
1884 recptr += npagebytes;
1885 nbytes -= npagebytes;
1886 }
1887
1888 Assert(pdst - dstbuf <= count);
1889
1890 return pdst - dstbuf;
1891}
Datum idx(PG_FUNCTION_ARGS)
Definition _int_op.c:263
#define pg_read_barrier()
Definition atomics.h:154
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
Definition atomics.h:462
#define Min(x, y)
Definition c.h:1150
TimeLineID GetWALInsertionTimeLine(void)
Definition xlog.c:7021

References Assert, ereport, errmsg, ERROR, fb(), GetWALInsertionTimeLine(), idx(), XLogCtlData::logInsertResult, LSN_FORMAT_ARGS, memcpy(), Min, XLogCtlData::pages, pg_atomic_read_u64(), pg_read_barrier, RecoveryInProgress(), XLogCtlData::xlblocks, XLogCtl, XLogRecPtrIsValid, and XLogRecPtrToBufIdx.

Referenced by XLogSendPhysical().

◆ xlog2_desc()

void xlog2_desc ( StringInfo  buf,
struct XLogReaderState record 
)
extern

Definition at line 78 of file xlogdesc.c.

79{
80 char *rec = XLogRecGetData(record);
81 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
82
83 if (info == XLOG2_CHECKSUMS)
84 {
86
87 memcpy(&xlrec, rec, sizeof(xl_checksum_state));
89 }
90}
#define XLOG2_CHECKSUMS
Definition pg_control.h:90
void appendStringInfoString(StringInfo str, const char *s)
Definition stringinfo.c:230
#define XLogRecGetInfo(decoder)
Definition xlogreader.h:410
#define XLogRecGetData(decoder)
Definition xlogreader.h:415

References appendStringInfoString(), buf, fb(), get_checksum_state_string(), memcpy(), XLOG2_CHECKSUMS, XLogRecGetData, and XLogRecGetInfo.

◆ xlog2_identify()

const char * xlog2_identify ( uint8  info)
extern

Definition at line 284 of file xlogdesc.c.

285{
286 const char *id = NULL;
287
288 switch (info & ~XLR_INFO_MASK)
289 {
290 case XLOG2_CHECKSUMS:
291 id = "CHECKSUMS";
292 break;
293 }
294
295 return id;
296}
#define XLR_INFO_MASK
Definition xlogrecord.h:62

References fb(), XLOG2_CHECKSUMS, and XLR_INFO_MASK.

◆ xlog2_redo()

void xlog2_redo ( struct XLogReaderState record)
extern

Definition at line 9238 of file xlog.c.

9239{
9240 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
9241
9242 if (info == XLOG2_CHECKSUMS)
9243 {
9245
9246 memcpy(&state, XLogRecGetData(record), sizeof(xl_checksum_state));
9247
9249 XLogCtl->data_checksum_version = state.new_checksum_state;
9251
9253 ControlFile->data_checksum_version = state.new_checksum_state;
9256
9257 /*
9258 * Block on a procsignalbarrier to await all processes having seen the
9259 * change to checksum status. Once the barrier has been passed we can
9260 * initiate the corresponding processing.
9261 */
9262 EmitAndWaitDataChecksumsBarrier(state.new_checksum_state);
9263 }
9264}

References ControlFile, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, EmitAndWaitDataChecksumsBarrier(), fb(), XLogCtlData::info_lck, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), memcpy(), SpinLockAcquire(), SpinLockRelease(), UpdateControlFile(), XLOG2_CHECKSUMS, XLogCtl, XLogRecGetData, and XLogRecGetInfo.

◆ xlog_desc()

void xlog_desc ( StringInfo  buf,
struct XLogReaderState record 
)
extern

Definition at line 93 of file xlogdesc.c.

94{
95 char *rec = XLogRecGetData(record);
96 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
97
98 if (info == XLOG_CHECKPOINT_SHUTDOWN ||
100 {
102
103 appendStringInfo(buf, "redo %X/%08X; "
104 "tli %u; prev tli %u; fpw %s; wal_level %s; logical decoding %s; xid %u:%u; oid %u; multi %u; offset %" PRIu64 "; "
105 "oldest xid %u in DB %u; oldest multi %u in DB %u; "
106 "oldest/newest commit timestamp xid: %u/%u; "
107 "oldest running xid %u; "
108 "checksums %s; %s",
110 checkpoint->ThisTimeLineID,
111 checkpoint->PrevTimeLineID,
112 checkpoint->fullPageWrites ? "true" : "false",
114 checkpoint->logicalDecodingEnabled ? "true" : "false",
117 checkpoint->nextOid,
118 checkpoint->nextMulti,
119 checkpoint->nextMultiOffset,
120 checkpoint->oldestXid,
121 checkpoint->oldestXidDB,
122 checkpoint->oldestMulti,
123 checkpoint->oldestMultiDB,
124 checkpoint->oldestCommitTsXid,
125 checkpoint->newestCommitTsXid,
126 checkpoint->oldestActiveXid,
127 get_checksum_state_string(checkpoint->dataChecksumState),
128 (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online");
129 }
130 else if (info == XLOG_NEXTOID)
131 {
132 Oid nextOid;
133
134 memcpy(&nextOid, rec, sizeof(Oid));
135 appendStringInfo(buf, "%u", nextOid);
136 }
137 else if (info == XLOG_RESTORE_POINT)
138 {
140
142 }
143 else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
144 {
145 /* no further information to print */
146 }
147 else if (info == XLOG_BACKUP_END)
148 {
149 XLogRecPtr startpoint;
150
151 memcpy(&startpoint, rec, sizeof(XLogRecPtr));
152 appendStringInfo(buf, "%X/%08X", LSN_FORMAT_ARGS(startpoint));
153 }
154 else if (info == XLOG_PARAMETER_CHANGE)
155 {
157 const char *wal_level_str;
158
159 memcpy(&xlrec, rec, sizeof(xl_parameter_change));
161
162 appendStringInfo(buf, "max_connections=%d max_worker_processes=%d "
163 "max_wal_senders=%d max_prepared_xacts=%d "
164 "max_locks_per_xact=%d wal_level=%s "
165 "wal_log_hints=%s track_commit_timestamp=%s",
166 xlrec.MaxConnections,
167 xlrec.max_worker_processes,
168 xlrec.max_wal_senders,
169 xlrec.max_prepared_xacts,
170 xlrec.max_locks_per_xact,
172 xlrec.wal_log_hints ? "on" : "off",
173 xlrec.track_commit_timestamp ? "on" : "off");
174 }
175 else if (info == XLOG_FPW_CHANGE)
176 {
177 bool fpw;
178
179 memcpy(&fpw, rec, sizeof(bool));
180 appendStringInfoString(buf, fpw ? "true" : "false");
181 }
182 else if (info == XLOG_END_OF_RECOVERY)
183 {
185
186 memcpy(&xlrec, rec, sizeof(xl_end_of_recovery));
187 appendStringInfo(buf, "tli %u; prev tli %u; time %s; wal_level %s",
188 xlrec.ThisTimeLineID, xlrec.PrevTimeLineID,
189 timestamptz_to_str(xlrec.end_time),
190 get_wal_level_string(xlrec.wal_level));
191 }
192 else if (info == XLOG_OVERWRITE_CONTRECORD)
193 {
195
196 memcpy(&xlrec, rec, sizeof(xl_overwrite_contrecord));
197 appendStringInfo(buf, "lsn %X/%08X; time %s",
198 LSN_FORMAT_ARGS(xlrec.overwritten_lsn),
199 timestamptz_to_str(xlrec.overwrite_time));
200 }
201 else if (info == XLOG_CHECKPOINT_REDO)
202 {
204
205 memcpy(&xlrec, rec, sizeof(xl_checkpoint_redo));
206 appendStringInfo(buf, "wal_level %s; checksums %s",
207 get_wal_level_string(xlrec.wal_level),
208 get_checksum_state_string(xlrec.data_checksum_version));
209 }
211 {
212 bool enabled;
213
214 memcpy(&enabled, rec, sizeof(bool));
215 appendStringInfoString(buf, enabled ? "true" : "false");
216 }
217 else if (info == XLOG_ASSIGN_LSN)
218 {
219 /* no further information to print */
220 }
221}
static const char * wal_level_str(WalLevel wal_level)
bool track_commit_timestamp
Definition commit_ts.c:121
#define XLOG_RESTORE_POINT
Definition pg_control.h:79
#define XLOG_OVERWRITE_CONTRECORD
Definition pg_control.h:85
#define XLOG_ASSIGN_LSN
Definition pg_control.h:84
#define XLOG_FPI
Definition pg_control.h:83
#define XLOG_FPI_FOR_HINT
Definition pg_control.h:82
#define XLOG_NEXTOID
Definition pg_control.h:75
#define XLOG_PARAMETER_CHANGE
Definition pg_control.h:78
#define XLOG_LOGICAL_DECODING_STATUS_CHANGE
Definition pg_control.h:87
#define XLOG_END_OF_RECOVERY
Definition pg_control.h:81
#define EpochFromFullTransactionId(x)
Definition transam.h:47
static const char * get_wal_level_string(int wal_level)
Definition xlogdesc.c:41

References appendStringInfo(), appendStringInfoString(), buf, EpochFromFullTransactionId, fb(), get_checksum_state_string(), get_wal_level_string(), LSN_FORMAT_ARGS, memcpy(), timestamptz_to_str(), wal_level_str(), XidFromFullTransactionId, XLOG_ASSIGN_LSN, XLOG_BACKUP_END, XLOG_CHECKPOINT_ONLINE, XLOG_CHECKPOINT_REDO, XLOG_CHECKPOINT_SHUTDOWN, XLOG_END_OF_RECOVERY, XLOG_FPI, XLOG_FPI_FOR_HINT, XLOG_FPW_CHANGE, XLOG_LOGICAL_DECODING_STATUS_CHANGE, XLOG_NEXTOID, XLOG_OVERWRITE_CONTRECORD, XLOG_PARAMETER_CHANGE, XLOG_RESTORE_POINT, XLogRecGetData, and XLogRecGetInfo.

◆ xlog_identify()

const char * xlog_identify ( uint8  info)
extern

Definition at line 224 of file xlogdesc.c.

225{
226 const char *id = NULL;
227
228 switch (info & ~XLR_INFO_MASK)
229 {
231 id = "CHECKPOINT_SHUTDOWN";
232 break;
234 id = "CHECKPOINT_ONLINE";
235 break;
236 case XLOG_NOOP:
237 id = "NOOP";
238 break;
239 case XLOG_NEXTOID:
240 id = "NEXTOID";
241 break;
242 case XLOG_SWITCH:
243 id = "SWITCH";
244 break;
245 case XLOG_BACKUP_END:
246 id = "BACKUP_END";
247 break;
249 id = "PARAMETER_CHANGE";
250 break;
252 id = "RESTORE_POINT";
253 break;
254 case XLOG_FPW_CHANGE:
255 id = "FPW_CHANGE";
256 break;
258 id = "END_OF_RECOVERY";
259 break;
261 id = "OVERWRITE_CONTRECORD";
262 break;
263 case XLOG_FPI:
264 id = "FPI";
265 break;
267 id = "FPI_FOR_HINT";
268 break;
270 id = "CHECKPOINT_REDO";
271 break;
273 id = "LOGICAL_DECODING_STATUS_CHANGE";
274 break;
275 case XLOG_ASSIGN_LSN:
276 id = "ASSIGN_LSN";
277 break;
278 }
279
280 return id;
281}
#define XLOG_NOOP
Definition pg_control.h:74
#define XLOG_SWITCH
Definition pg_control.h:76

References fb(), XLOG_ASSIGN_LSN, XLOG_BACKUP_END, XLOG_CHECKPOINT_ONLINE, XLOG_CHECKPOINT_REDO, XLOG_CHECKPOINT_SHUTDOWN, XLOG_END_OF_RECOVERY, XLOG_FPI, XLOG_FPI_FOR_HINT, XLOG_FPW_CHANGE, XLOG_LOGICAL_DECODING_STATUS_CHANGE, XLOG_NEXTOID, XLOG_NOOP, XLOG_OVERWRITE_CONTRECORD, XLOG_PARAMETER_CHANGE, XLOG_RESTORE_POINT, XLOG_SWITCH, and XLR_INFO_MASK.

◆ xlog_redo()

void xlog_redo ( struct XLogReaderState record)
extern

Definition at line 8824 of file xlog.c.

8825{
8826 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
8827 XLogRecPtr lsn = record->EndRecPtr;
8828
8829 /*
8830 * In XLOG rmgr, backup blocks are only used by XLOG_FPI and
8831 * XLOG_FPI_FOR_HINT records.
8832 */
8833 Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT ||
8834 !XLogRecHasAnyBlockRefs(record));
8835
8836 if (info == XLOG_NEXTOID)
8837 {
8838 Oid nextOid;
8839
8840 /*
8841 * We used to try to take the maximum of TransamVariables->nextOid and
8842 * the recorded nextOid, but that fails if the OID counter wraps
8843 * around. Since no OID allocation should be happening during replay
8844 * anyway, better to just believe the record exactly. We still take
8845 * OidGenLock while setting the variable, just in case.
8846 */
8847 memcpy(&nextOid, XLogRecGetData(record), sizeof(Oid));
8849 TransamVariables->nextOid = nextOid;
8852 }
8853 else if (info == XLOG_CHECKPOINT_SHUTDOWN)
8854 {
8855 CheckPoint checkPoint;
8856 TimeLineID replayTLI;
8857
8858 memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
8859 /* In a SHUTDOWN checkpoint, believe the counters exactly */
8861 TransamVariables->nextXid = checkPoint.nextXid;
8864 TransamVariables->nextOid = checkPoint.nextOid;
8868 checkPoint.nextMultiOffset);
8869
8871 checkPoint.oldestMultiDB);
8872
8873 /*
8874 * No need to set oldestClogXid here as well; it'll be set when we
8875 * redo an xl_clog_truncate if it changed since initialization.
8876 */
8877 SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB);
8878
8879 /*
8880 * If we see a shutdown checkpoint while waiting for an end-of-backup
8881 * record, the backup was canceled and the end-of-backup record will
8882 * never arrive.
8883 */
8887 ereport(PANIC,
8888 (errmsg("online backup was canceled, recovery cannot continue")));
8889
8890 /*
8891 * If we see a shutdown checkpoint, we know that nothing was running
8892 * on the primary at this point. So fake-up an empty running-xacts
8893 * record and use that here and now. Recover additional standby state
8894 * for prepared transactions.
8895 */
8897 {
8898 TransactionId *xids;
8899 int nxids;
8901 TransactionId latestCompletedXid;
8903
8905
8906 /* Update pg_subtrans entries for any prepared transactions */
8908
8909 /*
8910 * Construct a RunningTransactions snapshot representing a shut
8911 * down server, with only prepared transactions still alive. We're
8912 * never overflowed at this point because all subxids are listed
8913 * with their parent prepared transactions.
8914 */
8915 running.xcnt = nxids;
8916 running.subxcnt = 0;
8918 running.nextXid = XidFromFullTransactionId(checkPoint.nextXid);
8920 latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid);
8921 TransactionIdRetreat(latestCompletedXid);
8922 Assert(TransactionIdIsNormal(latestCompletedXid));
8923 running.latestCompletedXid = latestCompletedXid;
8924 running.xids = xids;
8925
8927 }
8928
8929 /* ControlFile->checkPointCopy always tracks the latest ckpt XID */
8933
8936
8937 /*
8938 * We should've already switched to the new TLI before replaying this
8939 * record.
8940 */
8941 (void) GetCurrentReplayRecPtr(&replayTLI);
8942 if (checkPoint.ThisTimeLineID != replayTLI)
8943 ereport(PANIC,
8944 (errmsg("unexpected timeline ID %u (should be %u) in shutdown checkpoint record",
8945 checkPoint.ThisTimeLineID, replayTLI)));
8946
8947 RecoveryRestartPoint(&checkPoint, record);
8948
8949 /*
8950 * After replaying a checkpoint record, free all smgr objects.
8951 * Otherwise we would never do so for dropped relations, as the
8952 * startup does not process shared invalidation messages or call
8953 * AtEOXact_SMgr().
8954 */
8956 }
8957 else if (info == XLOG_CHECKPOINT_ONLINE)
8958 {
8959 CheckPoint checkPoint;
8960 TimeLineID replayTLI;
8961
8962 memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
8963 /* In an ONLINE checkpoint, treat the XID counter as a minimum */
8966 checkPoint.nextXid))
8967 TransamVariables->nextXid = checkPoint.nextXid;
8969
8970 /*
8971 * We ignore the nextOid counter in an ONLINE checkpoint, preferring
8972 * to track OID assignment through XLOG_NEXTOID records. The nextOid
8973 * counter is from the start of the checkpoint and might well be stale
8974 * compared to later XLOG_NEXTOID records. We could try to take the
8975 * maximum of the nextOid counter and our latest value, but since
8976 * there's no particular guarantee about the speed with which the OID
8977 * counter wraps around, that's a risky thing to do. In any case,
8978 * users of the nextOid counter are required to avoid assignment of
8979 * duplicates, so that a somewhat out-of-date value should be safe.
8980 */
8981
8982 /* Handle multixact */
8984 checkPoint.nextMultiOffset);
8985
8986 /*
8987 * NB: This may perform multixact truncation when replaying WAL
8988 * generated by an older primary.
8989 */
8991 checkPoint.oldestMultiDB);
8993 checkPoint.oldestXid))
8995 checkPoint.oldestXidDB);
8996 /* ControlFile->checkPointCopy always tracks the latest ckpt XID */
9000
9001 /* TLI should not change in an on-line checkpoint */
9002 (void) GetCurrentReplayRecPtr(&replayTLI);
9003 if (checkPoint.ThisTimeLineID != replayTLI)
9004 ereport(PANIC,
9005 (errmsg("unexpected timeline ID %u (should be %u) in online checkpoint record",
9006 checkPoint.ThisTimeLineID, replayTLI)));
9007
9008 RecoveryRestartPoint(&checkPoint, record);
9009
9010 /*
9011 * After replaying a checkpoint record, free all smgr objects.
9012 * Otherwise we would never do so for dropped relations, as the
9013 * startup does not process shared invalidation messages or call
9014 * AtEOXact_SMgr().
9015 */
9017 }
9018 else if (info == XLOG_OVERWRITE_CONTRECORD)
9019 {
9020 /* nothing to do here, handled in xlogrecovery_redo() */
9021 }
9022 else if (info == XLOG_END_OF_RECOVERY)
9023 {
9025 TimeLineID replayTLI;
9026
9027 memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_end_of_recovery));
9028
9029 /*
9030 * For Hot Standby, we could treat this like a Shutdown Checkpoint,
9031 * but this case is rarer and harder to test, so the benefit doesn't
9032 * outweigh the potential extra cost of maintenance.
9033 */
9034
9035 /*
9036 * We should've already switched to the new TLI before replaying this
9037 * record.
9038 */
9039 (void) GetCurrentReplayRecPtr(&replayTLI);
9040 if (xlrec.ThisTimeLineID != replayTLI)
9041 ereport(PANIC,
9042 (errmsg("unexpected timeline ID %u (should be %u) in end-of-recovery record",
9043 xlrec.ThisTimeLineID, replayTLI)));
9044 }
9045 else if (info == XLOG_NOOP)
9046 {
9047 /* nothing to do here */
9048 }
9049 else if (info == XLOG_SWITCH)
9050 {
9051 /* nothing to do here */
9052 }
9053 else if (info == XLOG_RESTORE_POINT)
9054 {
9055 /* nothing to do here, handled in xlogrecovery.c */
9056 }
9057 else if (info == XLOG_ASSIGN_LSN)
9058 {
9059 /* nothing to do here, see XLogGetFakeLSN() */
9060 }
9061 else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
9062 {
9063 /*
9064 * XLOG_FPI records contain nothing else but one or more block
9065 * references. Every block reference must include a full-page image
9066 * even if full_page_writes was disabled when the record was generated
9067 * - otherwise there would be no point in this record.
9068 *
9069 * XLOG_FPI_FOR_HINT records are generated when a page needs to be
9070 * WAL-logged because of a hint bit update. They are only generated
9071 * when checksums and/or wal_log_hints are enabled. They may include
9072 * no full-page images if full_page_writes was disabled when they were
9073 * generated. In this case there is nothing to do here.
9074 *
9075 * No recovery conflicts are generated by these generic records - if a
9076 * resource manager needs to generate conflicts, it has to define a
9077 * separate WAL record type and redo routine.
9078 */
9079 for (uint8 block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
9080 {
9081 Buffer buffer;
9082
9083 if (!XLogRecHasBlockImage(record, block_id))
9084 {
9085 if (info == XLOG_FPI)
9086 elog(ERROR, "XLOG_FPI record did not contain a full-page image");
9087 continue;
9088 }
9089
9090 if (XLogReadBufferForRedo(record, block_id, &buffer) != BLK_RESTORED)
9091 elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block");
9092 UnlockReleaseBuffer(buffer);
9093 }
9094 }
9095 else if (info == XLOG_BACKUP_END)
9096 {
9097 /* nothing to do here, handled in xlogrecovery_redo() */
9098 }
9099 else if (info == XLOG_PARAMETER_CHANGE)
9100 {
9102
9103 /* Update our copy of the parameters in pg_control */
9104 memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_parameter_change));
9105
9107 ControlFile->MaxConnections = xlrec.MaxConnections;
9108 ControlFile->max_worker_processes = xlrec.max_worker_processes;
9109 ControlFile->max_wal_senders = xlrec.max_wal_senders;
9110 ControlFile->max_prepared_xacts = xlrec.max_prepared_xacts;
9111 ControlFile->max_locks_per_xact = xlrec.max_locks_per_xact;
9112 ControlFile->wal_level = xlrec.wal_level;
9113 ControlFile->wal_log_hints = xlrec.wal_log_hints;
9114
9115 /*
9116 * Update minRecoveryPoint to ensure that if recovery is aborted, we
9117 * recover back up to this point before allowing hot standby again.
9118 * This is important if the max_* settings are decreased, to ensure
9119 * you don't run queries against the WAL preceding the change. The
9120 * local copies cannot be updated as long as crash recovery is
9121 * happening and we expect all the WAL to be replayed.
9122 */
9124 {
9127 }
9129 {
9130 TimeLineID replayTLI;
9131
9132 (void) GetCurrentReplayRecPtr(&replayTLI);
9134 ControlFile->minRecoveryPointTLI = replayTLI;
9135 }
9136
9137 CommitTsParameterChange(xlrec.track_commit_timestamp,
9139 ControlFile->track_commit_timestamp = xlrec.track_commit_timestamp;
9140
9143
9144 /* Check to see if any parameter change gives a problem on recovery */
9146 }
9147 else if (info == XLOG_FPW_CHANGE)
9148 {
9149 bool fpw;
9150
9151 memcpy(&fpw, XLogRecGetData(record), sizeof(bool));
9152
9153 /*
9154 * Update the LSN of the last replayed XLOG_FPW_CHANGE record so that
9155 * do_pg_backup_start() and do_pg_backup_stop() can check whether
9156 * full_page_writes has been disabled during online backup.
9157 */
9158 if (!fpw)
9159 {
9164 }
9165
9166 /* Keep track of full_page_writes */
9168 }
9169 else if (info == XLOG_CHECKPOINT_REDO)
9170 {
9172 bool new_state = false;
9173
9175
9177 XLogCtl->data_checksum_version = redo_rec.data_checksum_version;
9178 SetLocalDataChecksumState(redo_rec.data_checksum_version);
9179 if (redo_rec.data_checksum_version != ControlFile->data_checksum_version)
9180 new_state = true;
9182
9183 if (new_state)
9184 EmitAndWaitDataChecksumsBarrier(redo_rec.data_checksum_version);
9185 }
9186 else if (info == XLOG_LOGICAL_DECODING_STATUS_CHANGE)
9187 {
9188 bool status;
9189
9190 memcpy(&status, XLogRecGetData(record), sizeof(bool));
9191
9192 /*
9193 * We need to toggle the logical decoding status and update the
9194 * XLogLogicalInfo cache of processes synchronously because
9195 * XLogLogicalInfoActive() is used even during read-only queries
9196 * (e.g., via RelationIsAccessibleInLogicalDecoding()). In the
9197 * 'disable' case, it is safe to invalidate existing slots after
9198 * disabling logical decoding because logical decoding cannot process
9199 * subsequent WAL records, which may not contain logical information.
9200 */
9201 if (status)
9203 else
9205
9206 elog(DEBUG1, "update logical decoding status to %d during recovery",
9207 status);
9208
9209 if (InRecovery && InHotStandby)
9210 {
9211 if (!status)
9212 {
9213 /*
9214 * Invalidate logical slots if we are in hot standby and the
9215 * primary disabled logical decoding.
9216 */
9218 0, InvalidOid,
9220 }
9221 else if (sync_replication_slots)
9222 {
9223 /*
9224 * Signal the postmaster to launch the slotsync worker.
9225 *
9226 * XXX: For simplicity, we keep the slotsync worker running
9227 * even after logical decoding is disabled. A future
9228 * improvement can consider starting and stopping the worker
9229 * based on logical decoding status change.
9230 */
9232 }
9233 }
9234 }
9235}
int Buffer
Definition buf.h:23
void UnlockReleaseBuffer(Buffer buffer)
Definition bufmgr.c:5626
void CommitTsParameterChange(bool newvalue, bool oldvalue)
Definition commit_ts.c:645
pid_t PostmasterPid
Definition globals.c:108
void DisableLogicalDecoding(void)
Definition logicalctl.c:481
void EnableLogicalDecoding(void)
Definition logicalctl.c:324
void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB)
Definition multixact.c:2266
void MultiXactAdvanceNextMXact(MultiXactId minMulti, MultiXactOffset minMultiOffset)
Definition multixact.c:2239
@ RS_INVAL_WAL_LEVEL
Definition slot.h:66
bool sync_replication_slots
Definition slotsync.c:132
void smgrdestroyall(void)
Definition smgr.c:386
XLogRecPtr ReadRecPtr
Definition xlogreader.h:205
#define FullTransactionIdPrecedes(a, b)
Definition transam.h:51
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
Definition transam.h:263
#define kill(pid, sig)
Definition win32_port.h:507
#define SIGUSR1
Definition win32_port.h:170
static void RecoveryRestartPoint(const CheckPoint *checkPoint, XLogReaderState *record)
Definition xlog.c:8089
#define XLogRecMaxBlockId(decoder)
Definition xlogreader.h:418
#define XLogRecHasBlockImage(decoder, block_id)
Definition xlogreader.h:423
#define XLogRecHasAnyBlockRefs(decoder)
Definition xlogreader.h:417
XLogRecPtr GetCurrentReplayRecPtr(TimeLineID *replayEndTLI)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
Definition xlogutils.c:303
@ STANDBY_INITIALIZED
Definition xlogutils.h:53
#define InHotStandby
Definition xlogutils.h:60
@ BLK_RESTORED
Definition xlogutils.h:76

References ArchiveRecoveryRequested, Assert, ControlFileData::backupEndPoint, ControlFileData::backupStartPoint, BLK_RESTORED, ControlFileData::checkPointCopy, CheckRequiredParameterValues(), CommitTsParameterChange(), ControlFile, XLogCtlData::data_checksum_version, ControlFileData::data_checksum_version, CheckPoint::dataChecksumState, DEBUG1, DisableLogicalDecoding(), elog, EmitAndWaitDataChecksumsBarrier(), EnableLogicalDecoding(), XLogReaderState::EndRecPtr, ereport, errmsg, ERROR, fb(), FullTransactionIdPrecedes, GetCurrentReplayRecPtr(), InArchiveRecovery, XLogCtlData::info_lck, InHotStandby, InRecovery, InvalidateObsoleteReplicationSlots(), InvalidOid, InvalidTransactionId, kill, XLogCtlData::lastFpwDisableRecPtr, lastFullPageWrites, RunningTransactionsData::latestCompletedXid, LocalMinRecoveryPoint, LocalMinRecoveryPointTLI, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), ControlFileData::max_locks_per_xact, ControlFileData::max_prepared_xacts, ControlFileData::max_wal_senders, ControlFileData::max_worker_processes, ControlFileData::MaxConnections, memcpy(), ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, MultiXactAdvanceNextMXact(), MultiXactAdvanceOldest(), MultiXactSetNextMXact(), CheckPoint::nextMulti, CheckPoint::nextMultiOffset, TransamVariablesData::nextOid, CheckPoint::nextOid, TransamVariablesData::nextXid, CheckPoint::nextXid, RunningTransactionsData::nextXid, TransamVariablesData::oidCount, CheckPoint::oldestMulti, CheckPoint::oldestMultiDB, RunningTransactionsData::oldestRunningXid, TransamVariablesData::oldestXid, CheckPoint::oldestXid, CheckPoint::oldestXidDB, PANIC, PostmasterPid, PrescanPreparedTransactions(), ProcArrayApplyRecoveryInfo(), XLogReaderState::ReadRecPtr, RecoveryRestartPoint(), RS_INVAL_WAL_LEVEL, SetLocalDataChecksumState(), SetTransactionIdLimit(), SIGUSR1, smgrdestroyall(), SpinLockAcquire(), SpinLockRelease(), STANDBY_INITIALIZED, StandbyRecoverPreparedTransactions(), standbyState, RunningTransactionsData::subxcnt, RunningTransactionsData::subxid_status, SUBXIDS_IN_SUBTRANS, sync_replication_slots, CheckPoint::ThisTimeLineID, ControlFileData::track_commit_timestamp, TransactionIdIsNormal, TransactionIdPrecedes(), TransactionIdRetreat, TransamVariables, UnlockReleaseBuffer(), UpdateControlFile(), ControlFileData::wal_level, ControlFileData::wal_log_hints, RunningTransactionsData::xcnt, XidFromFullTransactionId, RunningTransactionsData::xids, XLOG_ASSIGN_LSN, XLOG_BACKUP_END, XLOG_CHECKPOINT_ONLINE, XLOG_CHECKPOINT_REDO, XLOG_CHECKPOINT_SHUTDOWN, XLOG_END_OF_RECOVERY, XLOG_FPI, XLOG_FPI_FOR_HINT, XLOG_FPW_CHANGE, XLOG_LOGICAL_DECODING_STATUS_CHANGE, XLOG_NEXTOID, XLOG_NOOP, XLOG_OVERWRITE_CONTRECORD, XLOG_PARAMETER_CHANGE, XLOG_RESTORE_POINT, XLOG_SWITCH, XLogCtl, XLogReadBufferForRedo(), XLogRecGetData, XLogRecGetInfo, XLogRecHasAnyBlockRefs, XLogRecHasBlockImage, XLogRecMaxBlockId, and XLogRecPtrIsValid.

◆ XLogAssignLSN()

XLogRecPtr XLogAssignLSN ( void  )
extern

Definition at line 8655 of file xlog.c.

8656{
8657 int dummy = 0;
8658
8659 /*
8660 * Records other than XLOG_SWITCH must have content. We use an integer 0
8661 * to satisfy this restriction.
8662 */
8665 XLogRegisterData(&dummy, sizeof(dummy));
8667}
#define XLOG_MARK_UNIMPORTANT
Definition xlog.h:167
void XLogSetRecordFlags(uint8 flags)
Definition xloginsert.c:464

References fb(), XLOG_ASSIGN_LSN, XLOG_MARK_UNIMPORTANT, XLogBeginInsert(), XLogInsert(), XLogRegisterData(), and XLogSetRecordFlags().

Referenced by XLogGetFakeLSN().

◆ XLogBackgroundFlush()

bool XLogBackgroundFlush ( void  )
extern

Definition at line 3003 of file xlog.c.

3004{
3006 bool flexible = true;
3007 static TimestampTz lastflush;
3009 int flushblocks;
3011
3012 /* XLOG doesn't need flushing during recovery */
3013 if (RecoveryInProgress())
3014 return false;
3015
3016 /*
3017 * Since we're not in recovery, InsertTimeLineID is set and can't change,
3018 * so we can read it without a lock.
3019 */
3021
3022 /* read updated LogwrtRqst */
3026
3027 /* back off to last completed page boundary */
3028 WriteRqst.Write -= WriteRqst.Write % XLOG_BLCKSZ;
3029
3030 /* if we have already flushed that far, consider async commit records */
3032 if (WriteRqst.Write <= LogwrtResult.Flush)
3033 {
3037 flexible = false; /* ensure it all gets written */
3038 }
3039
3040 /*
3041 * If already known flushed, we're done. Just need to check if we are
3042 * holding an open file handle to a logfile that's no longer in use,
3043 * preventing the file from being deleted.
3044 */
3045 if (WriteRqst.Write <= LogwrtResult.Flush)
3046 {
3047 if (openLogFile >= 0)
3048 {
3051 {
3052 XLogFileClose();
3053 }
3054 }
3055 return false;
3056 }
3057
3058 /*
3059 * Determine how far to flush WAL, based on the wal_writer_delay and
3060 * wal_writer_flush_after GUCs.
3061 *
3062 * Note that XLogSetAsyncXactLSN() performs similar calculation based on
3063 * wal_writer_flush_after, to decide when to wake us up. Make sure the
3064 * logic is the same in both places if you change this.
3065 */
3067 flushblocks =
3069
3070 if (WalWriterFlushAfter == 0 || lastflush == 0)
3071 {
3072 /* first call, or block based limits disabled */
3073 WriteRqst.Flush = WriteRqst.Write;
3074 lastflush = now;
3075 }
3077 {
3078 /*
3079 * Flush the writes at least every WalWriterDelay ms. This is
3080 * important to bound the amount of time it takes for an asynchronous
3081 * commit to hit disk.
3082 */
3083 WriteRqst.Flush = WriteRqst.Write;
3084 lastflush = now;
3085 }
3086 else if (flushblocks >= WalWriterFlushAfter)
3087 {
3088 /* exceeded wal_writer_flush_after blocks, flush */
3089 WriteRqst.Flush = WriteRqst.Write;
3090 lastflush = now;
3091 }
3092 else
3093 {
3094 /* no flushing, this time round */
3096 }
3097
3098#ifdef WAL_DEBUG
3099 if (XLOG_DEBUG)
3100 elog(LOG, "xlog bg flush request write %X/%08X; flush: %X/%08X, current is write %X/%08X; flush %X/%08X",
3105#endif
3106
3108
3109 /* now wait for any in-progress insertions to finish and get write lock */
3113 if (WriteRqst.Write > LogwrtResult.Write ||
3115 {
3117 }
3119
3121
3122 /* wake up walsenders now that we've released heavily contended locks */
3124
3125 /*
3126 * Wake up processes waiting for primary flush LSN to reach current flush
3127 * position.
3128 */
3130
3131 /*
3132 * Great, done. To take some work off the critical path, try to initialize
3133 * as many of the no-longer-needed WAL buffers for future use as we can.
3134 */
3136
3137 /*
3138 * If we determined that we need to write data, but somebody else
3139 * wrote/flushed already, it should be considered as being active, to
3140 * avoid hibernating too early.
3141 */
3142 return true;
3143}
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
Definition timestamp.c:1789
Datum now(PG_FUNCTION_ARGS)
Definition timestamp.c:1613
XLogRecPtr asyncXactLSN
Definition xlog.c:464
static void WalSndWakeupProcessRequests(bool physical, bool logical)
Definition walsender.h:64
int WalWriterFlushAfter
Definition walwriter.c:72
int WalWriterDelay
Definition walwriter.c:71
static XLogRecPtr WaitXLogInsertionsToFinish(XLogRecPtr upto)
Definition xlog.c:1545
static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic)
Definition xlog.c:2026
static void XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
Definition xlog.c:2325
static void XLogFileClose(void)
Definition xlog.c:3689
static XLogSegNo openLogSegNo
Definition xlog.c:656
#define XLByteInPrevSeg(xlrp, logSegNo, wal_segsz_bytes)
@ WAIT_LSN_TYPE_PRIMARY_FLUSH
Definition xlogwait.h:44

References AdvanceXLInsertBuffer(), XLogCtlData::asyncXactLSN, elog, END_CRIT_SECTION, fb(), XLogwrtResult::Flush, GetCurrentTimestamp(), XLogCtlData::info_lck, XLogCtlData::InsertTimeLineID, InvalidXLogRecPtr, LOG, LogwrtResult, XLogCtlData::LogwrtRqst, LSN_FORMAT_ARGS, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), now(), openLogFile, openLogSegNo, RecoveryInProgress(), RefreshXLogWriteResult, SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, TimestampDifferenceExceeds(), WAIT_LSN_TYPE_PRIMARY_FLUSH, WaitLSNWakeup(), WaitXLogInsertionsToFinish(), wal_segment_size, WalSndWakeupProcessRequests(), WalWriterDelay, WalWriterFlushAfter, XLogwrtResult::Write, XLByteInPrevSeg, XLogCtl, XLogFileClose(), and XLogWrite().

Referenced by WalWriterMain().

◆ XLogCheckpointNeeded()

bool XLogCheckpointNeeded ( XLogSegNo  new_segno)
extern

Definition at line 2301 of file xlog.c.

2302{
2304
2306
2308 return true;
2309 return false;
2310}
int CheckPointSegments
Definition xlog.c:163

References CheckPointSegments, fb(), RedoRecPtr, wal_segment_size, and XLByteToSeg.

Referenced by XLogPageRead(), and XLogWrite().

◆ XLogFileInit()

int XLogFileInit ( XLogSegNo  logsegno,
TimeLineID  logtli 
)
extern

Definition at line 3430 of file xlog.c.

3431{
3432 bool ignore_added;
3433 char path[MAXPGPATH];
3434 int fd;
3435
3436 Assert(logtli != 0);
3437
3439 if (fd >= 0)
3440 return fd;
3441
3442 /* Now open original target segment (might not be file I just made) */
3445 if (fd < 0)
3446 ereport(ERROR,
3448 errmsg("could not open file \"%s\": %m", path)));
3449 return fd;
3450}
#define PG_BINARY
Definition c.h:1445
int BasicOpenFile(const char *fileName, int fileFlags)
Definition fd.c:1090
#define O_CLOEXEC
Definition win32_port.h:361
static int get_sync_bit(int method)
Definition xlog.c:9271
static int XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli, bool *added, char *path)
Definition xlog.c:3242

References Assert, BasicOpenFile(), ereport, errcode_for_file_access(), errmsg, ERROR, fb(), fd(), get_sync_bit(), MAXPGPATH, O_CLOEXEC, PG_BINARY, wal_sync_method, and XLogFileInitInternal().

Referenced by BootStrapXLOG(), XLogInitNewTimeline(), XLogWalRcvWrite(), and XLogWrite().

◆ XLogFileOpen()

int XLogFileOpen ( XLogSegNo  segno,
TimeLineID  tli 
)
extern

Definition at line 3668 of file xlog.c.

3669{
3670 char path[MAXPGPATH];
3671 int fd;
3672
3673 XLogFilePath(path, tli, segno, wal_segment_size);
3674
3677 if (fd < 0)
3678 ereport(PANIC,
3680 errmsg("could not open file \"%s\": %m", path)));
3681
3682 return fd;
3683}
static void XLogFilePath(char *path, TimeLineID tli, XLogSegNo logSegNo, int wal_segsz_bytes)

References BasicOpenFile(), ereport, errcode_for_file_access(), errmsg, fb(), fd(), get_sync_bit(), MAXPGPATH, O_CLOEXEC, PANIC, PG_BINARY, wal_segment_size, wal_sync_method, and XLogFilePath().

Referenced by XLogWrite().

◆ XLogFlush()

void XLogFlush ( XLogRecPtr  record)
extern

Definition at line 2800 of file xlog.c.

2801{
2805
2806 /*
2807 * During REDO, we are reading not writing WAL. Therefore, instead of
2808 * trying to flush the WAL, we should update minRecoveryPoint instead. We
2809 * test XLogInsertAllowed(), not InRecovery, because we need checkpointer
2810 * to act this way too, and because when it tries to write the
2811 * end-of-recovery checkpoint, it should indeed flush.
2812 */
2813 if (!XLogInsertAllowed())
2814 {
2815 UpdateMinRecoveryPoint(record, false);
2816 return;
2817 }
2818
2819 /* Quick exit if already known flushed */
2820 if (record <= LogwrtResult.Flush)
2821 return;
2822
2823#ifdef WAL_DEBUG
2824 if (XLOG_DEBUG)
2825 elog(LOG, "xlog flush request %X/%08X; write %X/%08X; flush %X/%08X",
2826 LSN_FORMAT_ARGS(record),
2829#endif
2830
2832
2833 /*
2834 * Since fsync is usually a horribly expensive operation, we try to
2835 * piggyback as much data as we can on each fsync: if we see any more data
2836 * entered into the xlog buffer, we'll write and fsync that too, so that
2837 * the final value of LogwrtResult.Flush is as large as possible. This
2838 * gives us some chance of avoiding another fsync immediately after.
2839 */
2840
2841 /* initialize to given target; may increase below */
2842 WriteRqstPtr = record;
2843
2844 /*
2845 * Now wait until we get the write lock, or someone else does the flush
2846 * for us.
2847 */
2848 for (;;)
2849 {
2851
2852 /* done already? */
2854 if (record <= LogwrtResult.Flush)
2855 break;
2856
2857 /*
2858 * Before actually performing the write, wait for all in-flight
2859 * insertions to the pages we're about to write to finish.
2860 */
2862 if (WriteRqstPtr < XLogCtl->LogwrtRqst.Write)
2866
2867 /*
2868 * Try to get the write lock. If we can't get it immediately, wait
2869 * until it's released, and recheck if we still need to do the flush
2870 * or if the backend that held the lock did it for us already. This
2871 * helps to maintain a good rate of group committing when the system
2872 * is bottlenecked by the speed of fsyncing.
2873 */
2875 {
2876 /*
2877 * The lock is now free, but we didn't acquire it yet. Before we
2878 * do, loop back to check if someone else flushed the record for
2879 * us already.
2880 */
2881 continue;
2882 }
2883
2884 /* Got the lock; recheck whether request is satisfied */
2886 if (record <= LogwrtResult.Flush)
2887 {
2889 break;
2890 }
2891
2892 /*
2893 * Sleep before flush! By adding a delay here, we may give further
2894 * backends the opportunity to join the backlog of group commit
2895 * followers; this can significantly improve transaction throughput,
2896 * at the risk of increasing transaction latency.
2897 *
2898 * We do not sleep if enableFsync is not turned on, nor if there are
2899 * fewer than CommitSiblings other backends with active transactions.
2900 */
2901 if (CommitDelay > 0 && enableFsync &&
2903 {
2907
2908 /*
2909 * Re-check how far we can now flush the WAL. It's generally not
2910 * safe to call WaitXLogInsertionsToFinish while holding
2911 * WALWriteLock, because an in-progress insertion might need to
2912 * also grab WALWriteLock to make progress. But we know that all
2913 * the insertions up to insertpos have already finished, because
2914 * that's what the earlier WaitXLogInsertionsToFinish() returned.
2915 * We're only calling it again to allow insertpos to be moved
2916 * further forward, not to actually wait for anyone.
2917 */
2919 }
2920
2921 /* try to write/flush later additions to XLOG as well */
2922 WriteRqst.Write = insertpos;
2923 WriteRqst.Flush = insertpos;
2924
2925 XLogWrite(WriteRqst, insertTLI, false);
2926
2928 /* done */
2929 break;
2930 }
2931
2933
2934 /* wake up walsenders now that we've released heavily contended locks */
2936
2937 /*
2938 * Wake up processes waiting for primary flush LSN to reach current flush
2939 * position.
2940 */
2942
2943 /*
2944 * If we still haven't flushed to the request point then we have a
2945 * problem; most likely, the requested flush point is past end of XLOG.
2946 * This has been seen to occur when a disk page has a corrupted LSN.
2947 *
2948 * Formerly we treated this as a PANIC condition, but that hurts the
2949 * system's robustness rather than helping it: we do not want to take down
2950 * the whole system due to corruption on one data page. In particular, if
2951 * the bad page is encountered again during recovery then we would be
2952 * unable to restart the database at all! (This scenario actually
2953 * happened in the field several times with 7.1 releases.) As of 8.4, bad
2954 * LSNs encountered during recovery are UpdateMinRecoveryPoint's problem;
2955 * the only time we can reach here during recovery is while flushing the
2956 * end-of-recovery checkpoint record, and we don't expect that to have a
2957 * bad LSN.
2958 *
2959 * Note that for calls from xact.c, the ERROR will be promoted to PANIC
2960 * since xact.c calls this routine inside a critical section. However,
2961 * calls from bufmgr.c are not within critical sections and so we will not
2962 * force a restart for a bad LSN on a data page.
2963 */
2964 if (LogwrtResult.Flush < record)
2965 elog(ERROR,
2966 "xlog flush request %X/%08X is not satisfied --- flushed only to %X/%08X",
2967 LSN_FORMAT_ARGS(record),
2969
2970 /*
2971 * Cross-check XLogNeedsFlush(). Some of the checks of XLogFlush() and
2972 * XLogNeedsFlush() are duplicated, and this assertion ensures that these
2973 * remain consistent.
2974 */
2975 Assert(!XLogNeedsFlush(record));
2976}
bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
Definition lwlock.c:1378
bool MinimumActiveBackends(int min)
Definition procarray.c:3576
int CommitDelay
Definition xlog.c:139
int CommitSiblings
Definition xlog.c:140
bool XLogNeedsFlush(XLogRecPtr record)
Definition xlog.c:3158
bool XLogInsertAllowed(void)
Definition xlog.c:6890

References Assert, CommitDelay, CommitSiblings, elog, enableFsync, END_CRIT_SECTION, ERROR, fb(), XLogwrtResult::Flush, XLogCtlData::info_lck, XLogCtlData::InsertTimeLineID, LOG, LogwrtResult, XLogCtlData::LogwrtRqst, LSN_FORMAT_ARGS, LW_EXCLUSIVE, LWLockAcquireOrWait(), LWLockRelease(), MinimumActiveBackends(), pg_usleep(), pgstat_report_wait_end(), pgstat_report_wait_start(), RecoveryInProgress(), RefreshXLogWriteResult, SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, UpdateMinRecoveryPoint(), WAIT_LSN_TYPE_PRIMARY_FLUSH, WaitLSNWakeup(), WaitXLogInsertionsToFinish(), WalSndWakeupProcessRequests(), XLogwrtRqst::Write, XLogwrtResult::Write, XLogCtl, XLogInsertAllowed(), XLogNeedsFlush(), and XLogWrite().

Referenced by CheckPointReplicationOrigin(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), CreateOverwriteContrecordRecord(), dropdb(), EndPrepare(), FinishSyncWorker(), FlushBuffer(), LogLogicalMessage(), pg_truncate_visibility_map(), rebuild_relation_finish_concurrent(), RecordTransactionAbortPrepared(), RecordTransactionCommit(), RecordTransactionCommitPrepared(), RelationTruncate(), ReplicationSlotReserveWal(), replorigin_get_progress(), replorigin_session_get_progress(), SlruPhysicalWritePage(), smgr_redo(), WalSndWaitForWal(), write_logical_decoding_status_update_record(), write_relmap_file(), WriteMTruncateXlogRec(), WriteTruncateXlogRec(), xact_redo_abort(), xact_redo_commit(), XLogChecksums(), XLogInsertRecord(), and XLogReportParameters().

◆ XLogGetLastRemovedSegno()

XLogSegNo XLogGetLastRemovedSegno ( void  )
extern

Definition at line 3808 of file xlog.c.

3809{
3810 XLogSegNo lastRemovedSegNo;
3811
3813 lastRemovedSegNo = XLogCtl->lastRemovedSegNo;
3815
3816 return lastRemovedSegNo;
3817}

References XLogCtlData::info_lck, XLogCtlData::lastRemovedSegNo, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by copy_replication_slot(), GetWALAvailability(), ReplicationSlotReserveWal(), and reserve_wal_for_local_slot().

◆ XLogGetOldestSegno()

XLogSegNo XLogGetOldestSegno ( TimeLineID  tli)
extern

Definition at line 3824 of file xlog.c.

3825{
3826 DIR *xldir;
3827 struct dirent *xlde;
3829
3831 while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL)
3832 {
3835
3836 /* Ignore files that are not XLOG segments. */
3837 if (!IsXLogFileName(xlde->d_name))
3838 continue;
3839
3840 /* Parse filename to get TLI and segno. */
3843
3844 /* Ignore anything that's not from the TLI of interest. */
3845 if (tli != file_tli)
3846 continue;
3847
3848 /* If it's the oldest so far, update oldest_segno. */
3849 if (oldest_segno == 0 || file_segno < oldest_segno)
3851 }
3852
3853 FreeDir(xldir);
3854 return oldest_segno;
3855}
static void XLogFromFileName(const char *fname, TimeLineID *tli, XLogSegNo *logSegNo, int wal_segsz_bytes)

References AllocateDir(), fb(), FreeDir(), IsXLogFileName(), ReadDir(), wal_segment_size, XLOGDIR, and XLogFromFileName().

Referenced by GetOldestUnsummarizedLSN(), and MaybeRemoveOldWalSummaries().

◆ XLogGetReplicationSlotMinimumLSN()

XLogRecPtr XLogGetReplicationSlotMinimumLSN ( void  )
extern

Definition at line 2699 of file xlog.c.

2700{
2701 XLogRecPtr retval;
2702
2706
2707 return retval;
2708}
XLogRecPtr replicationSlotMinLSN
Definition xlog.c:465

References XLogCtlData::info_lck, XLogCtlData::replicationSlotMinLSN, SpinLockAcquire(), SpinLockRelease(), and XLogCtl.

Referenced by KeepLogSeg(), and reserve_wal_for_local_slot().

◆ XLogInsertAllowed()

bool XLogInsertAllowed ( void  )
extern

Definition at line 6890 of file xlog.c.

6891{
6892 /*
6893 * If value is "unconditionally true" or "unconditionally false", just
6894 * return it. This provides the normal fast path once recovery is known
6895 * done.
6896 */
6897 if (LocalXLogInsertAllowed >= 0)
6898 return (bool) LocalXLogInsertAllowed;
6899
6900 /*
6901 * Else, must check to see if we're still in recovery.
6902 */
6903 if (RecoveryInProgress())
6904 return false;
6905
6906 /*
6907 * On exit from recovery, reset to "unconditionally true", since there is
6908 * no need to keep checking.
6909 */
6911 return true;
6912}

References LocalXLogInsertAllowed, and RecoveryInProgress().

Referenced by XLogBeginInsert(), XLogFlush(), XLogInsertRecord(), and XLogNeedsFlush().

◆ XLogInsertRecord()

XLogRecPtr XLogInsertRecord ( struct XLogRecData rdata,
XLogRecPtr  fpw_lsn,
uint8  flags,
int  num_fpi,
uint64  fpi_bytes,
bool  topxid_included 
)
extern

Definition at line 784 of file xlog.c.

790{
793 bool inserted;
794 XLogRecord *rechdr = (XLogRecord *) rdata->data;
795 uint8 info = rechdr->xl_info & ~XLR_INFO_MASK;
801
802 /* Does this record type require special handling? */
803 if (unlikely(rechdr->xl_rmid == RM_XLOG_ID))
804 {
805 if (info == XLOG_SWITCH)
807 else if (info == XLOG_CHECKPOINT_REDO)
809 }
810
811 /* we assume that all of the record header is in the first chunk */
813
814 /* cross-check on whether we should be here or not */
815 if (!XLogInsertAllowed())
816 elog(ERROR, "cannot make new WAL entries during recovery");
817
818 /*
819 * Given that we're not in recovery, InsertTimeLineID is set and can't
820 * change, so we can read it without a lock.
821 */
823
824 /*----------
825 *
826 * We have now done all the preparatory work we can without holding a
827 * lock or modifying shared state. From here on, inserting the new WAL
828 * record to the shared WAL buffer cache is a two-step process:
829 *
830 * 1. Reserve the right amount of space from the WAL. The current head of
831 * reserved space is kept in Insert->CurrBytePos, and is protected by
832 * insertpos_lck.
833 *
834 * 2. Copy the record to the reserved WAL space. This involves finding the
835 * correct WAL buffer containing the reserved space, and copying the
836 * record in place. This can be done concurrently in multiple processes.
837 *
838 * To keep track of which insertions are still in-progress, each concurrent
839 * inserter acquires an insertion lock. In addition to just indicating that
840 * an insertion is in progress, the lock tells others how far the inserter
841 * has progressed. There is a small fixed number of insertion locks,
842 * determined by NUM_XLOGINSERT_LOCKS. When an inserter crosses a page
843 * boundary, it updates the value stored in the lock to the how far it has
844 * inserted, to allow the previous buffer to be flushed.
845 *
846 * Holding onto an insertion lock also protects RedoRecPtr and
847 * fullPageWrites from changing until the insertion is finished.
848 *
849 * Step 2 can usually be done completely in parallel. If the required WAL
850 * page is not initialized yet, you have to grab WALBufMappingLock to
851 * initialize it, but the WAL writer tries to do that ahead of insertions
852 * to avoid that from happening in the critical path.
853 *
854 *----------
855 */
857
858 if (likely(class == WALINSERT_NORMAL))
859 {
861
862 /*
863 * Check to see if my copy of RedoRecPtr is out of date. If so, may
864 * have to go back and have the caller recompute everything. This can
865 * only happen just after a checkpoint, so it's better to be slow in
866 * this case and fast otherwise.
867 *
868 * Also check to see if fullPageWrites was just turned on or there's a
869 * running backup (which forces full-page writes); if we weren't
870 * already doing full-page writes then go back and recompute.
871 *
872 * If we aren't doing full-page writes then RedoRecPtr doesn't
873 * actually affect the contents of the XLOG record, so we'll update
874 * our local copy but not force a recomputation. (If doPageWrites was
875 * just turned off, we could recompute the record without full pages,
876 * but we choose not to bother.)
877 */
878 if (RedoRecPtr != Insert->RedoRecPtr)
879 {
881 RedoRecPtr = Insert->RedoRecPtr;
882 }
883 doPageWrites = (Insert->fullPageWrites || Insert->runningBackups > 0);
884
885 if (doPageWrites &&
888 {
889 /*
890 * Oops, some buffer now needs to be backed up that the caller
891 * didn't back up. Start over.
892 */
895 return InvalidXLogRecPtr;
896 }
897
898 /*
899 * Reserve space for the record in the WAL. This also sets the xl_prev
900 * pointer.
901 */
903 &rechdr->xl_prev);
904
905 /* Normal records are always inserted. */
906 inserted = true;
907 }
908 else if (class == WALINSERT_SPECIAL_SWITCH)
909 {
910 /*
911 * In order to insert an XLOG_SWITCH record, we need to hold all of
912 * the WAL insertion locks, not just one, so that no one else can
913 * begin inserting a record until we've figured out how much space
914 * remains in the current WAL segment and claimed all of it.
915 *
916 * Nonetheless, this case is simpler than the normal cases handled
917 * below, which must check for changes in doPageWrites and RedoRecPtr.
918 * Those checks are only needed for records that can contain buffer
919 * references, and an XLOG_SWITCH record never does.
920 */
924 }
925 else
926 {
928
929 /*
930 * We need to update both the local and shared copies of RedoRecPtr,
931 * which means that we need to hold all the WAL insertion locks.
932 * However, there can't be any buffer references, so as above, we need
933 * not check RedoRecPtr before inserting the record; we just need to
934 * update it afterwards.
935 */
939 &rechdr->xl_prev);
940 RedoRecPtr = Insert->RedoRecPtr = StartPos;
941 inserted = true;
942 }
943
944 if (inserted)
945 {
946 /*
947 * Now that xl_prev has been filled in, calculate CRC of the record
948 * header.
949 */
950 rdata_crc = rechdr->xl_crc;
953 rechdr->xl_crc = rdata_crc;
954
955 /*
956 * All the record data, including the header, is now ready to be
957 * inserted. Copy the record in the space reserved.
958 */
959 CopyXLogRecordToWAL(rechdr->xl_tot_len,
962
963 /*
964 * Unless record is flagged as not important, update LSN of last
965 * important record in the current slot. When holding all locks, just
966 * update the first one.
967 */
968 if ((flags & XLOG_MARK_UNIMPORTANT) == 0)
969 {
970 int lockno = holdingAllLocks ? 0 : MyLockNo;
971
973 }
974 }
975 else
976 {
977 /*
978 * This was an xlog-switch record, but the current insert location was
979 * already exactly at the beginning of a segment, so there was no need
980 * to do anything.
981 */
982 }
983
984 /*
985 * Done! Let others know that we're finished.
986 */
988
990
992
993 /*
994 * Mark top transaction id is logged (if needed) so that we should not try
995 * to log it again with the next WAL record in the current subtransaction.
996 */
997 if (topxid_included)
999
1000 /*
1001 * Update shared LogwrtRqst.Write, if we crossed page boundary.
1002 */
1004 {
1006 /* advance global request to include new block(s) */
1011 }
1012
1013 /*
1014 * If this was an XLOG_SWITCH record, flush the record and the empty
1015 * padding space that fills the rest of the segment, and perform
1016 * end-of-segment actions (eg, notifying archiver).
1017 */
1018 if (class == WALINSERT_SPECIAL_SWITCH)
1019 {
1022
1023 /*
1024 * Even though we reserved the rest of the segment for us, which is
1025 * reflected in EndPos, we return a pointer to just the end of the
1026 * xlog-switch record.
1027 */
1028 if (inserted)
1029 {
1032 {
1034
1035 if (offset == EndPos % XLOG_BLCKSZ)
1037 else
1039 }
1040 }
1041 }
1042
1043#ifdef WAL_DEBUG
1044 if (XLOG_DEBUG)
1045 {
1047 XLogRecord *record;
1051 char *errormsg = NULL;
1053
1055
1057 appendStringInfo(&buf, "INSERT @ %X/%08X: ", LSN_FORMAT_ARGS(EndPos));
1058
1059 /*
1060 * We have to piece together the WAL record data from the XLogRecData
1061 * entries, so that we can pass it to the rm_desc function as one
1062 * contiguous chunk.
1063 */
1065 for (; rdata != NULL; rdata = rdata->next)
1067
1068 /* We also need temporary space to decode the record. */
1069 record = (XLogRecord *) recordBuf.data;
1072
1073 if (!debug_reader)
1075 XL_ROUTINE(.page_read = NULL,
1076 .segment_open = NULL,
1077 .segment_close = NULL),
1078 NULL);
1079 if (!debug_reader)
1080 {
1081 appendStringInfoString(&buf, "error decoding record: out of memory while allocating a WAL reading processor");
1082 }
1084 decoded,
1085 record,
1086 EndPos,
1087 &errormsg))
1088 {
1089 appendStringInfo(&buf, "error decoding record: %s",
1090 errormsg ? errormsg : "no error message");
1091 }
1092 else
1093 {
1094 appendStringInfoString(&buf, " - ");
1095
1096 debug_reader->record = decoded;
1098 debug_reader->record = NULL;
1099 }
1100 elog(LOG, "%s", buf.data);
1101
1102 pfree(decoded);
1103 pfree(buf.data);
1104 pfree(recordBuf.data);
1106 }
1107#endif
1108
1109 /*
1110 * Update our global variables
1111 */
1114
1115 /* Report WAL traffic to the instrumentation. */
1116 if (inserted)
1117 {
1118 pgWalUsage.wal_bytes += rechdr->xl_tot_len;
1122
1123 /* Required for the flush of pending stats WAL data */
1124 pgstat_report_fixed = true;
1125 }
1126
1127 return EndPos;
1128}
#define likely(x)
Definition c.h:496
#define unlikely(x)
Definition c.h:497
WalUsage pgWalUsage
Definition instrument.c:27
void * palloc(Size size)
Definition mcxt.c:1390
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:138
bool pgstat_report_fixed
Definition pgstat.c:219
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
Definition stringinfo.c:281
uint64 wal_bytes
Definition instrument.h:55
int64 wal_fpi
Definition instrument.h:54
uint64 wal_fpi_bytes
Definition instrument.h:56
int64 wal_records
Definition instrument.h:53
void MarkSubxactTopXidLogged(void)
Definition xact.c:593
void MarkCurrentTransactionIdLoggedIfAny(void)
Definition xact.c:543
XLogRecPtr XactLastRecEnd
Definition xlog.c:261
static void ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr)
Definition xlog.c:1149
static void CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, XLogRecPtr StartPos, XLogRecPtr EndPos, TimeLineID tli)
Definition xlog.c:1266
static bool holdingAllLocks
Definition xlog.c:687
static int MyLockNo
Definition xlog.c:686
WalInsertClass
Definition xlog.c:569
@ WALINSERT_SPECIAL_SWITCH
Definition xlog.c:571
@ WALINSERT_NORMAL
Definition xlog.c:570
@ WALINSERT_SPECIAL_CHECKPOINT
Definition xlog.c:572
static bool ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr)
Definition xlog.c:1205
XLogReaderState * XLogReaderAllocate(int wal_segment_size, const char *waldir, XLogReaderRoutine *routine, void *private_data)
Definition xlogreader.c:108
bool DecodeXLogRecord(XLogReaderState *state, DecodedXLogRecord *decoded, XLogRecord *record, XLogRecPtr lsn, char **errormsg)
size_t DecodeXLogRecordRequiredSpace(size_t xl_tot_len)
#define XL_ROUTINE(...)
Definition xlogreader.h:117
void xlog_outdesc(StringInfo buf, XLogReaderState *record)

References appendBinaryStringInfo(), appendStringInfo(), appendStringInfoString(), Assert, buf, COMP_CRC32C, CopyXLogRecordToWAL(), DecodeXLogRecord(), DecodeXLogRecordRequiredSpace(), doPageWrites, elog, END_CRIT_SECTION, ERROR, fb(), FIN_CRC32C, holdingAllLocks, XLogCtlData::info_lck, initStringInfo(), XLogCtlData::Insert, Insert(), XLogCtlData::InsertTimeLineID, InvalidXLogRecPtr, WALInsertLockPadded::l, WALInsertLock::lastImportantAt, likely, LOG, LogwrtResult, XLogCtlData::LogwrtRqst, LSN_FORMAT_ARGS, MarkCurrentTransactionIdLoggedIfAny(), MarkSubxactTopXidLogged(), MemoryContextSwitchTo(), MyLockNo, palloc(), pfree(), pgstat_report_fixed, pgWalUsage, ProcLastRecPtr, RedoRecPtr, RefreshXLogWriteResult, ReserveXLogInsertLocation(), ReserveXLogSwitch(), SizeOfXLogLongPHD, SizeOfXLogRecord, SizeOfXLogShortPHD, SpinLockAcquire(), SpinLockRelease(), START_CRIT_SECTION, unlikely, WalUsage::wal_bytes, WalUsage::wal_fpi, WalUsage::wal_fpi_bytes, WalUsage::wal_records, wal_segment_size, WALINSERT_NORMAL, WALINSERT_SPECIAL_CHECKPOINT, WALINSERT_SPECIAL_SWITCH, WALInsertLockAcquire(), WALInsertLockAcquireExclusive(), WALInsertLockRelease(), WALInsertLocks, XLogwrtRqst::Write, XactLastRecEnd, XL_ROUTINE, XLogRecord::xl_tot_len, XLOG_CHECKPOINT_REDO, XLOG_MARK_UNIMPORTANT, xlog_outdesc(), XLOG_SWITCH, XLogCtl, XLogFlush(), XLogInsertAllowed(), XLogReaderAllocate(), XLogRecPtrIsValid, and XLogSegmentOffset.

Referenced by XLogInsert().

◆ XLogNeedsFlush()

bool XLogNeedsFlush ( XLogRecPtr  record)
extern

Definition at line 3158 of file xlog.c.

3159{
3160 /*
3161 * During recovery, we don't flush WAL but update minRecoveryPoint
3162 * instead. So "needs flush" is taken to mean whether minRecoveryPoint
3163 * would need to be updated.
3164 *
3165 * Using XLogInsertAllowed() rather than RecoveryInProgress() matters for
3166 * the case of an end-of-recovery checkpoint, where WAL data is flushed.
3167 * This check should be consistent with the one in XLogFlush().
3168 */
3169 if (!XLogInsertAllowed())
3170 {
3171 /* Quick exit if already known to be updated or cannot be updated */
3173 return false;
3174
3175 /*
3176 * An invalid minRecoveryPoint means that we need to recover all the
3177 * WAL, i.e., we're doing crash recovery. We never modify the control
3178 * file's value in that case, so we can short-circuit future checks
3179 * here too. This triggers a quick exit path for the startup process,
3180 * which cannot update its local copy of minRecoveryPoint as long as
3181 * it has not replayed all WAL available when doing crash recovery.
3182 */
3184 {
3185 updateMinRecoveryPoint = false;
3186 return false;
3187 }
3188
3189 /*
3190 * Update local copy of minRecoveryPoint. But if the lock is busy,
3191 * just return a conservative guess.
3192 */
3194 return true;
3198
3199 /*
3200 * Check minRecoveryPoint for any other process than the startup
3201 * process doing crash recovery, which should not update the control
3202 * file value if crash recovery is still running.
3203 */
3205 updateMinRecoveryPoint = false;
3206
3207 /* check again */
3209 return false;
3210 else
3211 return true;
3212 }
3213
3214 /* Quick exit if already known flushed */
3215 if (record <= LogwrtResult.Flush)
3216 return false;
3217
3218 /* read LogwrtResult and update local state */
3220
3221 /* check again */
3222 if (record <= LogwrtResult.Flush)
3223 return false;
3224
3225 return true;
3226}
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
Definition lwlock.c:1321

References ControlFile, fb(), XLogwrtResult::Flush, InRecovery, LocalMinRecoveryPoint, LocalMinRecoveryPointTLI, LogwrtResult, LW_SHARED, LWLockConditionalAcquire(), LWLockRelease(), ControlFileData::minRecoveryPoint, ControlFileData::minRecoveryPointTLI, RefreshXLogWriteResult, updateMinRecoveryPoint, XLogInsertAllowed(), and XLogRecPtrIsValid.

Referenced by GetVictimBuffer(), SetHintBitsExt(), and XLogFlush().

◆ XLogPutNextOid()

void XLogPutNextOid ( Oid  nextOid)
extern

Definition at line 8570 of file xlog.c.

8571{
8573 XLogRegisterData(&nextOid, sizeof(Oid));
8575
8576 /*
8577 * We need not flush the NEXTOID record immediately, because any of the
8578 * just-allocated OIDs could only reach disk as part of a tuple insert or
8579 * update that would have its own XLOG record that must follow the NEXTOID
8580 * record. Therefore, the standard buffer LSN interlock applied to those
8581 * records will ensure no such OID reaches disk before the NEXTOID record
8582 * does.
8583 *
8584 * Note, however, that the above statement only covers state "within" the
8585 * database. When we use a generated OID as a file or directory name, we
8586 * are in a sense violating the basic WAL rule, because that filesystem
8587 * change may reach disk before the NEXTOID WAL record does. The impact
8588 * of this is that if a database crash occurs immediately afterward, we
8589 * might after restart re-generate the same OID and find that it conflicts
8590 * with the leftover file or directory. But since for safety's sake we
8591 * always loop until finding a nonconflicting filename, this poses no real
8592 * problem in practice. See pgsql-hackers discussion 27-Sep-2006.
8593 */
8594}

References fb(), XLOG_NEXTOID, XLogBeginInsert(), XLogInsert(), and XLogRegisterData().

Referenced by GetNewObjectId().

◆ XLogRestorePoint()

XLogRecPtr XLogRestorePoint ( const char rpName)
extern

Definition at line 8625 of file xlog.c.

8626{
8629
8631 strlcpy(xlrec.rp_name, rpName, MAXFNAMELEN);
8632
8635
8637
8638 ereport(LOG,
8639 errmsg("restore point \"%s\" created at %X/%08X",
8641
8642 return RecPtr;
8643}
TimestampTz rp_time

References ereport, errmsg, fb(), GetCurrentTimestamp(), LOG, LSN_FORMAT_ARGS, MAXFNAMELEN, xl_restore_point::rp_time, strlcpy(), XLOG_RESTORE_POINT, XLogBeginInsert(), XLogInsert(), and XLogRegisterData().

Referenced by pg_create_restore_point().

◆ XLogSetAsyncXactLSN()

void XLogSetAsyncXactLSN ( XLogRecPtr  asyncXactLSN)
extern

Definition at line 2630 of file xlog.c.

2631{
2632 XLogRecPtr WriteRqstPtr = asyncXactLSN;
2633 bool sleeping;
2634 bool wakeup = false;
2636
2640 if (XLogCtl->asyncXactLSN < asyncXactLSN)
2641 XLogCtl->asyncXactLSN = asyncXactLSN;
2643
2644 /*
2645 * If somebody else already called this function with a more aggressive
2646 * LSN, they will have done what we needed (and perhaps more).
2647 */
2648 if (asyncXactLSN <= prevAsyncXactLSN)
2649 return;
2650
2651 /*
2652 * If the WALWriter is sleeping, kick it to make it come out of low-power
2653 * mode, so that this async commit will reach disk within the expected
2654 * amount of time. Otherwise, determine whether it has enough WAL
2655 * available to flush, the same way that XLogBackgroundFlush() does.
2656 */
2657 if (sleeping)
2658 wakeup = true;
2659 else
2660 {
2661 int flushblocks;
2662
2664
2665 flushblocks =
2667
2669 wakeup = true;
2670 }
2671
2672 if (wakeup)
2673 {
2675
2676 if (walwriterProc != INVALID_PROC_NUMBER)
2677 SetLatch(&GetPGProcByNumber(walwriterProc)->procLatch);
2678 }
2679}
pg_atomic_uint32 walwriterProc
Definition proc.h:488
static TimestampTz wakeup[NUM_WALRCV_WAKEUPS]

References XLogCtlData::asyncXactLSN, fb(), XLogwrtResult::Flush, GetPGProcByNumber, XLogCtlData::info_lck, INVALID_PROC_NUMBER, LogwrtResult, pg_atomic_read_u32(), ProcGlobal, RefreshXLogWriteResult, SetLatch(), SpinLockAcquire(), SpinLockRelease(), wakeup, WalWriterFlushAfter, PROC_HDR::walwriterProc, XLogCtlData::WalWriterSleeping, and XLogCtl.

Referenced by AbortTransaction(), LogCurrentRunningXacts(), RecordTransactionAbort(), and RecordTransactionCommit().

◆ XLogSetReplicationSlotMinimumLSN()

void XLogSetReplicationSlotMinimumLSN ( XLogRecPtr  lsn)
extern

◆ XLogShutdownWalRcv()

void XLogShutdownWalRcv ( void  )
extern

Definition at line 10149 of file xlog.c.

10150{
10152
10155}
#define AmStartupProcess()
Definition miscadmin.h:396
void ShutdownWalRcv(void)
void ResetInstallXLogFileSegmentActive(void)
Definition xlog.c:10168

References AmStartupProcess, Assert, IsUnderPostmaster, ResetInstallXLogFileSegmentActive(), and ShutdownWalRcv().

Referenced by FinishWalRecovery(), and WaitForWALToBecomeAvailable().

Variable Documentation

◆ CheckPointSegments

PGDLLIMPORT int CheckPointSegments
extern

◆ CheckpointStats

◆ CommitDelay

PGDLLIMPORT int CommitDelay
extern

Definition at line 139 of file xlog.c.

Referenced by XLogFlush().

◆ CommitSiblings

PGDLLIMPORT int CommitSiblings
extern

Definition at line 140 of file xlog.c.

Referenced by XLogFlush().

◆ data_checksums

PGDLLIMPORT int data_checksums
extern

Definition at line 683 of file xlog.c.

Referenced by AbsorbDataChecksumsBarrier(), and SetLocalDataChecksumState().

◆ EnableHotStandby

◆ fullPageWrites

PGDLLIMPORT bool fullPageWrites
extern

Definition at line 129 of file xlog.c.

Referenced by BootStrapXLOG(), and UpdateFullPageWrites().

◆ log_checkpoints

PGDLLIMPORT bool log_checkpoints
extern

◆ max_slot_wal_keep_size_mb

PGDLLIMPORT int max_slot_wal_keep_size_mb
extern

Definition at line 142 of file xlog.c.

Referenced by KeepLogSeg(), and pg_get_replication_slots().

◆ max_wal_size_mb

PGDLLIMPORT int max_wal_size_mb
extern

◆ min_wal_size_mb

PGDLLIMPORT int min_wal_size_mb
extern

Definition at line 122 of file xlog.c.

Referenced by ReadControlFile(), and XLOGfileslop().

◆ ProcLastRecPtr

PGDLLIMPORT XLogRecPtr ProcLastRecPtr
extern

◆ track_wal_io_timing

◆ wal_compression

PGDLLIMPORT int wal_compression
extern

Definition at line 131 of file xlog.c.

Referenced by XLogCompressBackupBlock(), and XLogRecordAssemble().

◆ wal_consistency_checking

PGDLLIMPORT bool* wal_consistency_checking
extern

Definition at line 133 of file xlog.c.

Referenced by assign_wal_consistency_checking(), and XLogRecordAssemble().

◆ wal_consistency_checking_string

PGDLLIMPORT char* wal_consistency_checking_string
extern

Definition at line 132 of file xlog.c.

Referenced by InitializeWalConsistencyChecking().

◆ wal_decode_buffer_size

PGDLLIMPORT int wal_decode_buffer_size
extern

Definition at line 143 of file xlog.c.

Referenced by InitWalRecovery().

◆ wal_init_zero

PGDLLIMPORT bool wal_init_zero
extern

Definition at line 134 of file xlog.c.

Referenced by XLogFileInitInternal().

◆ wal_keep_size_mb

PGDLLIMPORT int wal_keep_size_mb
extern

Definition at line 123 of file xlog.c.

Referenced by KeepLogSeg(), and pg_get_replication_slots().

◆ wal_level

◆ wal_log_hints

PGDLLIMPORT bool wal_log_hints
extern

Definition at line 130 of file xlog.c.

Referenced by InitControlFile(), and XLogReportParameters().

◆ wal_recycle

PGDLLIMPORT bool wal_recycle
extern

Definition at line 135 of file xlog.c.

Referenced by RemoveXlogFile().

◆ wal_retrieve_retry_interval

PGDLLIMPORT int wal_retrieve_retry_interval
extern

Definition at line 141 of file xlog.c.

Referenced by ApplyLauncherMain(), launch_sync_worker(), and WaitForWALToBecomeAvailable().

◆ wal_segment_size

PGDLLIMPORT int wal_segment_size
extern

Definition at line 150 of file xlog.c.

Referenced by AdvanceXLInsertBuffer(), assign_wal_sync_method(), BootStrapXLOG(), build_backup_content(), CalculateCheckpointSegments(), CheckArchiveTimeout(), CheckXLogRemoved(), CleanupAfterArchiveRecovery(), copy_replication_slot(), CopyXLogRecordToWAL(), CreateCheckPoint(), CreateOverwriteContrecordRecord(), CreateRestartPoint(), decode_concurrent_changes(), do_pg_backup_stop(), ExecuteRecoveryCommand(), FinishWalRecovery(), GetOldestUnsummarizedLSN(), GetWALAvailability(), GetXLogBuffer(), InitWalRecovery(), InitXLogReaderState(), InstallXLogFileSegment(), InvalidateObsoleteReplicationSlots(), IsCheckpointOnSchedule(), issue_xlog_fsync(), KeepLogSeg(), LogicalConfirmReceivedLocation(), MaybeRemoveOldWalSummaries(), perform_base_backup(), pg_control_checkpoint(), pg_get_replication_slots(), pg_split_walfile_name(), pg_walfile_name(), pg_walfile_name_offset(), PreallocXlogFiles(), ReadControlFile(), ReadRecord(), RemoveNonParentXlogFiles(), RemoveOldXlogFiles(), ReorderBufferRestoreChanges(), ReorderBufferRestoreCleanup(), ReorderBufferSerializedPath(), ReorderBufferSerializeTXN(), repack_setup_logical_decoding(), ReplicationSlotReserveWal(), RequestXLogStreaming(), reserve_wal_for_local_slot(), ReserveXLogSwitch(), RestoreArchivedFile(), StartReplication(), StartupDecodingContext(), SummarizeWAL(), UpdateLastRemovedPtr(), WALReadRaiseError(), WalReceiverMain(), WalSndSegmentOpen(), WriteControlFile(), XLogArchiveNotifySeg(), XLogBackgroundFlush(), XLogBytePosToEndRecPtr(), XLogBytePosToRecPtr(), XLogCheckpointNeeded(), XLOGChooseNumBuffers(), XLogFileClose(), XLogFileCopy(), XLogFileInitInternal(), XLogFileOpen(), XLogFileRead(), XLogFileReadAnyTLI(), XLOGfileslop(), XLogGetOldestSegno(), XLogInitNewTimeline(), XLogInsertRecord(), XLogPageRead(), XLogReaderAllocate(), XlogReadTwoPhaseData(), XLogRecPtrToBytePos(), XLogWalRcvClose(), XLogWalRcvWrite(), and XLogWrite().

◆ wal_sync_method

◆ XactLastCommitEnd

◆ XactLastRecEnd

◆ XLogArchiveCommand

◆ XLogArchiveMode

◆ XLogArchiveTimeout

PGDLLIMPORT int XLogArchiveTimeout
extern

Definition at line 125 of file xlog.c.

Referenced by CheckArchiveTimeout(), and CheckpointerMain().

◆ XLOGbuffers

PGDLLIMPORT int XLOGbuffers
extern

Definition at line 124 of file xlog.c.

Referenced by check_wal_buffers(), XLOGShmemInit(), and XLOGShmemRequest().

◆ XLogLogicalInfo

PGDLLIMPORT bool XLogLogicalInfo
extern

Definition at line 115 of file logicalctl.c.

Referenced by update_xlog_logical_info().