aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_rewind/parsexlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_rewind/parsexlog.c')
-rw-r--r--src/bin/pg_rewind/parsexlog.c109
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;