diff options
Diffstat (limited to 'src/bin/pg_rewind/parsexlog.c')
-rw-r--r-- | src/bin/pg_rewind/parsexlog.c | 109 |
1 files changed, 51 insertions, 58 deletions
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 81e186270a3..59ebac7d6aa 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -41,9 +41,15 @@ static int xlogreadfd = -1; static XLogSegNo xlogreadsegno = -1; static char xlogfpath[MAXPGPATH]; -static bool SimpleXLogPageRead(XLogReaderState *xlogreader, - const char *datadir, int *tliIndex, - const char *restoreCommand); +typedef struct XLogPageReadPrivate +{ + const char *restoreCommand; + int tliIndex; +} XLogPageReadPrivate; + +static int SimpleXLogPageRead(XLogReaderState *xlogreader, + XLogRecPtr targetPagePtr, + int reqLen, XLogRecPtr targetRecPtr, char *readBuf); /* * Read WAL from the datadir/pg_wal, starting from 'startpoint' on timeline @@ -60,22 +66,20 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, XLogRecord *record; XLogReaderState *xlogreader; char *errormsg; + XLogPageReadPrivate private; - xlogreader = XLogReaderAllocate(WalSegSz, datadir, NULL); - + private.tliIndex = tliIndex; + private.restoreCommand = restoreCommand; + xlogreader = XLogReaderAllocate(WalSegSz, datadir, + XL_ROUTINE(.page_read = &SimpleXLogPageRead), + &private); if (xlogreader == NULL) pg_fatal("out of memory"); XLogBeginRead(xlogreader, startpoint); do { - while (XLogReadRecord(xlogreader, &record, &errormsg) == - XLREAD_NEED_DATA) - { - if (!SimpleXLogPageRead(xlogreader, datadir, - &tliIndex, restoreCommand)) - break; - } + record = XLogReadRecord(xlogreader, &errormsg); if (record == NULL) { @@ -119,19 +123,19 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex, XLogRecord *record; XLogReaderState *xlogreader; char *errormsg; + XLogPageReadPrivate private; XLogRecPtr endptr; - xlogreader = XLogReaderAllocate(WalSegSz, datadir, NULL); + private.tliIndex = tliIndex; + private.restoreCommand = restoreCommand; + xlogreader = XLogReaderAllocate(WalSegSz, datadir, + XL_ROUTINE(.page_read = &SimpleXLogPageRead), + &private); if (xlogreader == NULL) pg_fatal("out of memory"); XLogBeginRead(xlogreader, ptr); - while (XLogReadRecord(xlogreader, &record, &errormsg) == - XLREAD_NEED_DATA) - { - if (!SimpleXLogPageRead(xlogreader, datadir, &tliIndex, restoreCommand)) - break; - } + record = XLogReadRecord(xlogreader, &errormsg); if (record == NULL) { if (errormsg) @@ -166,6 +170,7 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, XLogRecPtr searchptr; XLogReaderState *xlogreader; char *errormsg; + XLogPageReadPrivate private; /* * The given fork pointer points to the end of the last common record, @@ -181,7 +186,11 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, forkptr += SizeOfXLogShortPHD; } - xlogreader = XLogReaderAllocate(WalSegSz, datadir, NULL); + private.tliIndex = tliIndex; + private.restoreCommand = restoreCommand; + xlogreader = XLogReaderAllocate(WalSegSz, datadir, + XL_ROUTINE(.page_read = &SimpleXLogPageRead), + &private); if (xlogreader == NULL) pg_fatal("out of memory"); @@ -191,13 +200,7 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, uint8 info; XLogBeginRead(xlogreader, searchptr); - while (XLogReadRecord(xlogreader, &record, &errormsg) == - XLREAD_NEED_DATA) - { - if (!SimpleXLogPageRead(xlogreader, datadir, - &tliIndex, restoreCommand)) - break; - } + record = XLogReadRecord(xlogreader, &errormsg); if (record == NULL) { @@ -243,19 +246,16 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, } /* XLogReader callback function, to read a WAL page */ -static bool -SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, - int *tliIndex, const char *restoreCommand) +static int +SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, + int reqLen, XLogRecPtr targetRecPtr, char *readBuf) { - XLogRecPtr targetPagePtr = xlogreader->readPagePtr; - char *readBuf = xlogreader->readBuf; + XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data; uint32 targetPageOff; XLogRecPtr targetSegEnd; XLogSegNo targetSegNo; int r; - Assert(xlogreader->reqLen <= XLOG_BLCKSZ); - XLByteToSeg(targetPagePtr, targetSegNo, WalSegSz); XLogSegNoOffsetToRecPtr(targetSegNo + 1, 0, WalSegSz, targetSegEnd); targetPageOff = XLogSegmentOffset(targetPagePtr, WalSegSz); @@ -283,14 +283,14 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, * be done both forward and backward, consider also switching timeline * accordingly. */ - while (*tliIndex < targetNentries - 1 && - targetHistory[*tliIndex].end < targetSegEnd) - (*tliIndex)++; - while (*tliIndex > 0 && - targetHistory[*tliIndex].begin >= targetSegEnd) - (*tliIndex)--; - - XLogFileName(xlogfname, targetHistory[*tliIndex].tli, + while (private->tliIndex < targetNentries - 1 && + targetHistory[private->tliIndex].end < targetSegEnd) + private->tliIndex++; + while (private->tliIndex > 0 && + targetHistory[private->tliIndex].begin >= targetSegEnd) + private->tliIndex--; + + XLogFileName(xlogfname, targetHistory[private->tliIndex].tli, xlogreadsegno, WalSegSz); snprintf(xlogfpath, MAXPGPATH, "%s/" XLOGDIR "/%s", @@ -303,11 +303,10 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, /* * If we have no restore_command to execute, then exit. */ - if (restoreCommand == NULL) + if (private->restoreCommand == NULL) { pg_log_error("could not open file \"%s\": %m", xlogfpath); - XLogReaderSetInputData(xlogreader, -1); - return false; + return -1; } /* @@ -317,13 +316,10 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, xlogreadfd = RestoreArchivedFile(xlogreader->segcxt.ws_dir, xlogfname, WalSegSz, - restoreCommand); + private->restoreCommand); if (xlogreadfd < 0) - { - XLogReaderSetInputData(xlogreader, -1); - return false; - } + return -1; else pg_log_debug("using file \"%s\" restored from archive", xlogfpath); @@ -339,8 +335,7 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0) { pg_log_error("could not seek in file \"%s\": %m", xlogfpath); - XLogReaderSetInputData(xlogreader, -1); - return false; + return -1; } @@ -353,15 +348,13 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, const char *datadir, pg_log_error("could not read file \"%s\": read %d of %zu", xlogfpath, r, (Size) XLOG_BLCKSZ); - XLogReaderSetInputData(xlogreader, -1); - return false; + return -1; } Assert(targetSegNo == xlogreadsegno); - xlogreader->seg.ws_tli = targetHistory[*tliIndex].tli; - XLogReaderSetInputData(xlogreader, XLOG_BLCKSZ); - return true; + xlogreader->seg.ws_tli = targetHistory[private->tliIndex].tli; + return XLOG_BLCKSZ; } /* @@ -439,7 +432,7 @@ extractPageInfo(XLogReaderState *record) RmgrNames[rmid], info); } - for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + for (block_id = 0; block_id <= record->max_block_id; block_id++) { RelFileNode rnode; ForkNumber forknum; |