0001-xlogreader-fix.patch
text/x-patch
Filename: 0001-xlogreader-fix.patch
Type: text/x-patch
Part: 0
Message:
Re: logical changeset generation v4
Patch
Format: unified
Series: patch 0001
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlogreader.c | 10 | 1 |
>From 5ca4b81f03bd7a4bf5101bd68811548023ac12fe Mon Sep 17 00:00:00 2001 From: Andres Freund <andres@anarazel.de> Date: Mon, 14 Jan 2013 21:43:13 +0100 Subject: [PATCH] xlogreader: fix --- src/backend/access/transam/xlogreader.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 6a420e6..9439c05 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -350,7 +350,7 @@ XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg) /* Wait for the next page to become available */ readOff = ReadPageInternal(state, targetPagePtr, - Min(len, XLOG_BLCKSZ)); + Min(total_len - gotlen + SizeOfXLogShortPHD, XLOG_BLCKSZ)); if (readOff < 0) goto err; @@ -383,6 +383,11 @@ XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg) /* Append the continuation from this page to the buffer */ pageHeaderSize = XLogPageHeaderSize(pageHeader); + + if (readOff < pageHeaderSize) + readOff = ReadPageInternal(state, targetPagePtr, + pageHeaderSize); + Assert(pageHeaderSize <= readOff); contdata = (char *) state->readBuf + pageHeaderSize; @@ -390,6 +395,10 @@ XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg) if (pageHeader->xlp_rem_len < len) len = pageHeader->xlp_rem_len; + if (readOff < (pageHeaderSize + len)) + readOff = ReadPageInternal(state, targetPagePtr, + pageHeaderSize + len); + memcpy(buffer, (char *) contdata, len); buffer += len; gotlen += len; -- 1.7.12.289.g0ce9864.dirty