19 #ifndef XLOG_INTERNAL_H 20 #define XLOG_INTERNAL_H 34 #define XLOG_PAGE_MAGIC 0xD10A 52 #define SizeOfXLogShortPHD MAXALIGN(sizeof(XLogPageHeaderData)) 69 #define SizeOfXLogLongPHD MAXALIGN(sizeof(XLogLongPageHeaderData)) 74 #define XLP_FIRST_IS_CONTRECORD 0x0001 76 #define XLP_LONG_HEADER 0x0002 78 #define XLP_BKP_REMOVABLE 0x0004 80 #define XLP_ALL_FLAGS 0x0007 82 #define XLogPageHeaderSize(hdr) \ 83 (((hdr)->xlp_info & XLP_LONG_HEADER) ? SizeOfXLogLongPHD : SizeOfXLogShortPHD) 86 #define WalSegMinSize 1024 * 1024 87 #define WalSegMaxSize 1024 * 1024 * 1024 89 #define DEFAULT_MIN_WAL_SEGS 5 90 #define DEFAULT_MAX_WAL_SEGS 64 93 #define IsPowerOf2(x) (x > 0 && ((x) & ((x)-1)) == 0) 94 #define IsValidWalSegSize(size) \ 95 (IsPowerOf2(size) && \ 96 ((size) >= WalSegMinSize && (size) <= WalSegMaxSize)) 98 #define XLogSegmentsPerXLogId(wal_segsz_bytes) \ 99 (UINT64CONST(0x100000000) / (wal_segsz_bytes)) 101 #define XLogSegNoOffsetToRecPtr(segno, offset, wal_segsz_bytes, dest) \ 102 (dest) = (segno) * (wal_segsz_bytes) + (offset) 104 #define XLogSegmentOffset(xlogptr, wal_segsz_bytes) \ 105 ((xlogptr) & ((wal_segsz_bytes) - 1)) 115 #define XLByteToSeg(xlrp, logSegNo, wal_segsz_bytes) \ 116 logSegNo = (xlrp) / (wal_segsz_bytes) 118 #define XLByteToPrevSeg(xlrp, logSegNo, wal_segsz_bytes) \ 119 logSegNo = ((xlrp) - 1) / (wal_segsz_bytes) 125 #define XLogMBVarToSegs(mbvar, wal_segsz_bytes) \ 126 ((mbvar) / ((wal_segsz_bytes) / (1024 * 1024))) 134 #define XLByteInSeg(xlrp, logSegNo, wal_segsz_bytes) \ 135 (((xlrp) / (wal_segsz_bytes)) == (logSegNo)) 137 #define XLByteInPrevSeg(xlrp, logSegNo, wal_segsz_bytes) \ 138 ((((xlrp) - 1) / (wal_segsz_bytes)) == (logSegNo)) 141 #define XRecOffIsValid(xlrp) \ 142 ((xlrp) % XLOG_BLCKSZ >= SizeOfXLogShortPHD) 147 #define XLOGDIR "pg_wal" 148 #define XLOG_CONTROL_FILE "global/pg_control" 154 #define MAXFNAMELEN 64 157 #define XLOG_FNAME_LEN 24 163 #define XLogFileName(fname, tli, logSegNo, wal_segsz_bytes) \ 164 snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, \ 165 (uint32) ((logSegNo) / XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 166 (uint32) ((logSegNo) % XLogSegmentsPerXLogId(wal_segsz_bytes))) 168 #define XLogFileNameById(fname, tli, log, seg) \ 169 snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg) 171 #define IsXLogFileName(fname) \ 172 (strlen(fname) == XLOG_FNAME_LEN && \ 173 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN) 180 #define IsPartialXLogFileName(fname) \ 181 (strlen(fname) == XLOG_FNAME_LEN + strlen(".partial") && \ 182 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \ 183 strcmp((fname) + XLOG_FNAME_LEN, ".partial") == 0) 185 #define XLogFromFileName(fname, tli, logSegNo, wal_segsz_bytes) \ 189 sscanf(fname, "%08X%08X%08X", tli, &log, &seg); \ 190 *logSegNo = (uint64) log * XLogSegmentsPerXLogId(wal_segsz_bytes) + seg; \ 193 #define XLogFilePath(path, tli, logSegNo, wal_segsz_bytes) \ 194 snprintf(path, MAXPGPATH, XLOGDIR "/%08X%08X%08X", tli, \ 195 (uint32) ((logSegNo) / XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 196 (uint32) ((logSegNo) % XLogSegmentsPerXLogId(wal_segsz_bytes))) 198 #define TLHistoryFileName(fname, tli) \ 199 snprintf(fname, MAXFNAMELEN, "%08X.history", tli) 201 #define IsTLHistoryFileName(fname) \ 202 (strlen(fname) == 8 + strlen(".history") && \ 203 strspn(fname, "0123456789ABCDEF") == 8 && \ 204 strcmp((fname) + 8, ".history") == 0) 206 #define TLHistoryFilePath(path, tli) \ 207 snprintf(path, MAXPGPATH, XLOGDIR "/%08X.history", tli) 209 #define StatusFilePath(path, xlog, suffix) \ 210 snprintf(path, MAXPGPATH, XLOGDIR "/archive_status/%s%s", xlog, suffix) 212 #define BackupHistoryFileName(fname, tli, logSegNo, startpoint, wal_segsz_bytes) \ 213 snprintf(fname, MAXFNAMELEN, "%08X%08X%08X.%08X.backup", tli, \ 214 (uint32) ((logSegNo) / XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 215 (uint32) ((logSegNo) % XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 216 (uint32) (XLogSegmentOffset(startpoint, wal_segsz_bytes))) 218 #define IsBackupHistoryFileName(fname) \ 219 (strlen(fname) > XLOG_FNAME_LEN && \ 220 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \ 221 strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0) 223 #define BackupHistoryFilePath(path, tli, logSegNo, startpoint, wal_segsz_bytes) \ 224 snprintf(path, MAXPGPATH, XLOGDIR "/%08X%08X%08X.%08X.backup", tli, \ 225 (uint32) ((logSegNo) / XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 226 (uint32) ((logSegNo) % XLogSegmentsPerXLogId(wal_segsz_bytes)), \ 227 (uint32) (XLogSegmentOffset((startpoint), wal_segsz_bytes))) 302 const char *(*rm_identify) (
uint8 info);
303 void (*rm_startup) (void);
304 void (*rm_cleanup) (void);
struct XLogLongPageHeaderData XLogLongPageHeaderData
struct xl_end_of_recovery xl_end_of_recovery
TimeLineID PrevTimeLineID
struct xl_parameter_change xl_parameter_change
XLogRecPtr RequestXLogSwitch(bool mark_unimportant)
pg_time_t GetLastSegSwitchData(XLogRecPtr *lastSwitchLSN)
XLogPageHeaderData * XLogPageHeader
XLogLongPageHeaderData * XLogLongPageHeader
char * recoveryRestoreCommand
struct XLogRecData XLogRecData
bool ArchiveRecoveryRequested
bool track_commit_timestamp
struct xl_restore_point xl_restore_point
const RmgrData RmgrTable[]
struct XLogRecData * next
TimeLineID ThisTimeLineID
void GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli)
struct XLogPageHeaderData XLogPageHeaderData