43 #define MAX_ERRORMSG_LEN 1000
158 uint32 newSize = reclength;
160 newSize += XLOG_BLCKSZ - (newSize % XLOG_BLCKSZ);
161 newSize =
Max(newSize, 5 *
Max(BLCKSZ, XLOG_BLCKSZ));
247 targetPagePtr = RecPtr - (RecPtr % XLOG_BLCKSZ);
248 targetRecOff = RecPtr % XLOG_BLCKSZ;
266 if (targetRecOff == 0)
271 RecPtr += pageHeaderSize;
272 targetRecOff = pageHeaderSize;
274 else if (targetRecOff < pageHeaderSize)
282 targetRecOff == pageHeaderSize)
290 Assert(pageHeaderSize <= readOff);
325 "invalid record length at %X/%X: wanted %u, got %u",
346 len = XLOG_BLCKSZ - RecPtr % XLOG_BLCKSZ;
357 state->
readBuf + RecPtr % XLOG_BLCKSZ, len);
364 targetPagePtr += XLOG_BLCKSZ;
378 if (!(pageHeader->
xlp_info & XLP_FIRST_IS_CONTRECORD))
381 "there is no contrecord flag at %X/%X",
394 "invalid contrecord length %u at %X/%X",
403 if (readOff < pageHeaderSize)
407 Assert(pageHeaderSize <= readOff);
409 contdata = (
char *) state->
readBuf + pageHeaderSize;
410 len = XLOG_BLCKSZ - pageHeaderSize;
414 if (readOff < pageHeaderSize + len)
416 pageHeaderSize + len);
418 memcpy(buffer, (
char *) contdata, len);
431 }
while (gotlen < total_len);
441 state->
EndRecPtr = targetPagePtr + pageHeaderSize
448 Min(targetRecOff + total_len, XLOG_BLCKSZ));
509 Assert((pageptr % XLOG_BLCKSZ) == 0);
516 reqLen < state->readLen)
531 if (targetSegNo != state->
readSegNo && targetPageOff != 0)
534 XLogRecPtr targetSegmentPtr = pageptr - targetPageOff;
536 readLen = state->
read_page(state, targetSegmentPtr, XLOG_BLCKSZ,
543 Assert(readLen == XLOG_BLCKSZ);
561 Assert(readLen <= XLOG_BLCKSZ);
567 Assert(readLen >= reqLen);
589 state->
readOff = targetPageOff;
624 "invalid record length at %X/%X: wanted %u, got %u",
632 "invalid resource manager ID %u at %X/%X",
643 if (!(record->
xl_prev < RecPtr))
646 "record with incorrect prev-link %X/%X at %X/%X",
660 if (record->
xl_prev != PrevRecPtr)
663 "record with incorrect prev-link %X/%X at %X/%X",
700 "incorrect resource manager data checksum in record at %X/%X",
719 Assert((recptr % XLOG_BLCKSZ) == 0);
733 "invalid magic number %04X in log segment %s, offset %u",
747 "invalid info bits %04X in log segment %s, offset %u",
761 char fhdrident_str[32];
762 char sysident_str[32];
773 "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s",
774 fhdrident_str, sysident_str);
780 "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header");
786 "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header");
790 else if (offset == 0)
798 "invalid info bits %04X in log segment %s, offset %u",
812 "unexpected pageaddr %X/%X in log segment %s, offset %u",
837 "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u",
880 targetRecOff = RecPtr % XLOG_BLCKSZ;
883 targetPagePtr = RecPtr - targetRecOff;
903 tmpRecPtr = targetPagePtr + pageHeaderSize
908 tmpRecPtr = targetPagePtr + pageHeaderSize;
957 for (block_id = 0; block_id <= state->
max_block_id; block_id++)
978 #define COPY_HEADER_FIELD(_dst, _size) \
980 if (remaining < _size) \
981 goto shortdata_err; \
982 memcpy(_dst, ptr, _size); \
984 remaining -= _size; \
998 ptr = (
char *) record;
1004 while (remaining > datatotal)
1011 uint8 main_data_len;
1016 datatotal += main_data_len;
1027 datatotal += main_data_len;
1041 if (block_id <= state->max_block_id)
1044 "out-of-order block_id %u at %X/%X",
1052 blk = &state->
blocks[block_id];
1057 blk->
flags = fork_flags;
1066 "BKPBLOCK_HAS_DATA set, but no data included at %X/%X",
1073 "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X",
1106 "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X",
1122 "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X",
1137 "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X",
1152 "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X",
1161 rnode = &blk->
rnode;
1168 "BKPBLOCK_SAME_REL set but no previous rel at %X/%X",
1173 blk->
rnode = *rnode;
1180 "invalid block_id %u at %X/%X",
1188 if (remaining != datatotal)
1202 for (block_id = 0; block_id <= state->
max_block_id; block_id++)
1245 "record with invalid length at %X/%X",
1269 bkpb = &record->
blocks[block_id];
1271 *rnode = bkpb->
rnode;
1275 *blknum = bkpb->
blkno;
1292 bkpb = &record->
blocks[block_id];
1325 bkpb = &record->
blocks[block_id];
1346 memcpy(page, ptr, BLCKSZ);
XLogReaderState * XLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data)
#define InvalidXLogRecPtr
#define BKPIMAGE_HAS_HOLE
#define XLogPageHeaderSize(hdr)
#define XLR_BLOCK_ID_DATA_LONG
static XLogRecPtr ReadRecPtr
static bool ValidXLogPageHeader(XLogReaderState *state, XLogRecPtr recptr, XLogPageHeader hdr)
#define XLogFileName(fname, tli, logSegNo)
void * palloc_extended(Size size, int flags)
static void report_invalid_record(XLogReaderState *state, const char *fmt,...) pg_attribute_printf(2
#define MCXT_ALLOC_NO_OOM
#define MemSet(start, val, len)
XLogPageHeaderData * XLogPageHeader
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg)
static int ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
XLogRecord * XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg)
#define pg_attribute_printf(f, a)
#define XLogSegNoOffsetToRecPtr(segno, offset, dest)
XLogLongPageHeaderData * XLogLongPageHeader
int int vsnprintf(char *str, size_t count, const char *fmt, va_list args)
void pfree(void *pointer)
static bool allocate_recordbuf(XLogReaderState *state, uint32 reclength)
XLogRecord * decoded_record
#define COPY_HEADER_FIELD(_dst, _size)
#define EQ_CRC32C(c1, c2)
void XLogReaderInvalReadState(XLogReaderState *state)
#define XLogRecPtrIsInvalid(r)
void XLogReaderFree(XLogReaderState *state)
bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum)
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
#define BKPBLOCK_SAME_REL
#define BKPIMAGE_IS_COMPRESSED
int32 pglz_decompress(const char *source, int32 slen, char *dest, int32 rawsize)
#define BKPBLOCK_HAS_IMAGE
#define XLByteToSeg(xlrp, logSegNo)
#define Assert(condition)
static bool ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr, XLogRecPtr PrevRecPtr, XLogRecord *record, bool randAccess)
int(* XLogPageReadCB)(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *readBuf, TimeLineID *pageTLI)
#define SizeOfXLogShortPHD
#define XLR_BLOCK_ID_ORIGIN
#define XLP_FIRST_IS_CONTRECORD
static void header(const char *fmt,...) pg_attribute_printf(1
#define InvalidRepOriginId
bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
#define XLR_BLOCK_ID_DATA_SHORT
static bool ValidXLogRecord(XLogReaderState *state, XLogRecord *record, XLogRecPtr recptr)
#define BKPBLOCK_FORK_MASK
#define XRecOffIsValid(xlrp)
#define COMP_CRC32C(crc, data, len)
RepOriginId record_origin
static void static void ResetDecoder(XLogReaderState *state)
#define offsetof(type, field)
DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID+1]
#define BKPBLOCK_HAS_DATA