From: Kyotaro Horiguchi Date: Thu, 18 Apr 2019 15:02:19 +0900 Subject: [PATCH 06/10] Make XlogReadTwoPhaseData not use callback but call the function directly This patch replaces the call to the callback in XlogReadTwoPhaseData with direct call to the original function. Then invalidate the parameters callback and private for XLogReaderAllocate. --- src/backend/access/transam/twophase.c | 8 ++------ src/backend/access/transam/xlogutils.c | 8 +++++--- src/backend/replication/logical/logicalfuncs.c | 8 ++++++-- src/include/access/xlogutils.h | 5 +---- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 6feca69126..f6d48368fe 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1386,8 +1386,7 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len) XLogReaderState *xlogreader; char *errormsg; - xlogreader = XLogReaderAllocate(wal_segment_size, &read_local_xlog_page, - NULL); + xlogreader = XLogReaderAllocate(wal_segment_size, NULL, NULL); if (!xlogreader) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), @@ -1396,10 +1395,7 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len) while (XLogReadRecord(xlogreader, lsn, &record, &errormsg) == XLREAD_NEED_DATA) - xlogreader->read_page(xlogreader, - xlogreader->loadPagePtr, xlogreader->loadLen, - xlogreader->currRecPtr, xlogreader->readBuf, - &xlogreader->readPageTLI); + read_local_xlog_page(xlogreader); if (record == NULL) ereport(ERROR, diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index c853e1f0e3..fd461f16fc 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -908,10 +908,12 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa * loop for now. */ void -read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, - int reqLen, XLogRecPtr targetRecPtr, char *cur_page, - TimeLineID *pageTLI) +read_local_xlog_page(XLogReaderState *state) { + XLogRecPtr targetPagePtr = state->loadPagePtr; + int reqLen = state->loadLen; + char *cur_page = state->readBuf; + TimeLineID *pageTLI = &state->readPageTLI; XLogRecPtr read_upto, loc; int count; diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 4d09255504..240a375d8f 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -118,8 +118,12 @@ void logical_read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page, TimeLineID *pageTLI) { - read_local_xlog_page(state, targetPagePtr, reqLen, - targetRecPtr, cur_page, pageTLI); + Assert(targetPagePtr == state->loadPagePtr && + reqLen == state->loadLen && + targetRecPtr == state->currRecPtr && + cur_page == state->readBuf && + pageTLI == &state->readPageTLI); + read_local_xlog_page(state); } /* diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index be0c79d18c..9724ce20b8 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -47,10 +47,7 @@ extern Buffer XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, extern Relation CreateFakeRelcacheEntry(RelFileNode rnode); extern void FreeFakeRelcacheEntry(Relation fakerel); -extern void read_local_xlog_page(XLogReaderState *state, - XLogRecPtr targetPagePtr, int reqLen, - XLogRecPtr targetRecPtr, char *cur_page, - TimeLineID *pageTLI); +extern void read_local_xlog_page(XLogReaderState *state); extern void XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wantLength); -- 2.16.3 ----Next_Part(Wed_Jul_10_13_18_10_2019_842)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="v4-0007-Make-logical-rep-stuff-not-use-callback-but-call-the.patch"