diff options
Diffstat (limited to 'src/bin/pg_rewind/parsexlog.c')
-rw-r--r-- | src/bin/pg_rewind/parsexlog.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index f0439edce38..eac58f5cf0f 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -56,6 +56,9 @@ static int SimpleXLogPageRead(XLogReaderState *xlogreader, * Read WAL from the datadir/pg_wal, starting from 'startpoint' on timeline * index 'tliIndex' in target timeline history, until 'endpoint'. Make note of * the data blocks touched by the WAL records, and return them in a page map. + * + * 'endpoint' is the end of the last record to read. The record starting at + * 'endpoint' is the first one that is not read. */ void extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, @@ -96,7 +99,13 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, startpoint = InvalidXLogRecPtr; /* continue reading at next record */ - } while (xlogreader->ReadRecPtr != endpoint); + } while (xlogreader->EndRecPtr < endpoint); + + /* + * If 'endpoint' didn't point exactly at a record boundary, the caller + * messed up. + */ + Assert(xlogreader->EndRecPtr == endpoint); XLogReaderFree(xlogreader); if (xlogreadfd != -1) |