From: Kyotaro Horiguchi Date: Thu, 18 Apr 2019 15:50:51 +0900 Subject: [PATCH 08/10] Make pg_waldump not use callback but call the function directly This patch does the similar thing to the change in logical rep. Moves callback from XLogReaderState from the parameter of XLogFindNextRecord. Then invalidate the parameters callback and private for XLogReaderAllocate. --- src/backend/access/transam/xlogreader.c | 15 +++++---------- src/bin/pg_waldump/pg_waldump.c | 21 +++++++++------------ src/include/access/xlogreader.h | 14 +++++--------- 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index ce901c358a..0bf8dac408 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1026,7 +1026,8 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr, * debugging purposes. */ XLogRecPtr -XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) +XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr, + XLogFindNextRecordCB read_page, void *private) { XLogReaderState saved_state = *state; XLogRecPtr tmpRecPtr; @@ -1065,9 +1066,7 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) /* Read the page containing the record */ while(XLogNeedData(state, targetPagePtr, targetRecOff)) - state->read_page(state, state->loadPagePtr, state->loadLen, - state->currRecPtr, state->readBuf, - &state->readPageTLI); + read_page(state, private); if (state->readLen < 0) goto err; @@ -1078,9 +1077,7 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) /* make sure we have enough data for the page header */ while (XLogNeedData(state, targetPagePtr, pageHeaderSize)) - state->read_page(state, state->loadPagePtr, state->loadLen, - state->currRecPtr, state->readBuf, - &state->readPageTLI); + read_page(state, private); if (state->readLen < 0) goto err; @@ -1127,9 +1124,7 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) { if (result == XLREAD_NEED_DATA) { - state->read_page(state, state->loadPagePtr, state->loadLen, - state->currRecPtr, state->readBuf, - &state->readPageTLI); + read_page(state, private); continue; } diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 54717c9320..3125633327 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -422,10 +422,12 @@ XLogDumpXLogRead(const char *directory, TimeLineID timeline_id, * XLogReader read_page callback */ static void -XLogDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, - XLogRecPtr targetPtr, char *readBuff, TimeLineID *curFileTLI) +XLogDumpReadPage(XLogReaderState *state, void *priv) { - XLogDumpPrivate *private = state->private_data; + XLogRecPtr targetPagePtr = state->loadPagePtr; + int reqLen = state->loadLen; + char *readBuff = state->readBuf; + XLogDumpPrivate *private = (XLogDumpPrivate *) priv; int count = XLOG_BLCKSZ; if (private->endptr != InvalidXLogRecPtr) @@ -1095,13 +1097,13 @@ main(int argc, char **argv) /* done with argument parsing, do the actual work */ /* we have everything we need, start reading */ - xlogreader_state = XLogReaderAllocate(WalSegSz, XLogDumpReadPage, - &private); + xlogreader_state = XLogReaderAllocate(WalSegSz, NULL, NULL); if (!xlogreader_state) fatal_error("out of memory"); /* first find a valid recptr to start from */ - first_record = XLogFindNextRecord(xlogreader_state, private.startptr); + first_record = XLogFindNextRecord(xlogreader_state, private.startptr, + &XLogDumpReadPage, (void*) &private); if (first_record == InvalidXLogRecPtr) fatal_error("could not find a valid record after %X/%X", @@ -1128,12 +1130,7 @@ main(int argc, char **argv) while (XLogReadRecord(xlogreader_state, first_record, &record, &errormsg) == XLREAD_NEED_DATA) - xlogreader_state->read_page(xlogreader_state, - xlogreader_state->loadPagePtr, - xlogreader_state->loadLen, - xlogreader_state->currRecPtr, - xlogreader_state->readBuf, - &xlogreader_state->readPageTLI); + XLogDumpReadPage(xlogreader_state, (void *) &private); if (!record) { diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index bc0c642906..b4ace71a75 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -29,14 +29,6 @@ typedef struct XLogReaderState XLogReaderState; -/* Function type definition for the read_page callback */ -typedef void (*XLogPageReadCB) (XLogReaderState *xlogreader, - XLogRecPtr targetPagePtr, - int reqLen, - XLogRecPtr targetRecPtr, - char *readBuf, - TimeLineID *pageTLI); - typedef struct { /* Is this block ref in use? */ @@ -252,7 +244,11 @@ extern bool XLogReaderValidatePageHeader(XLogReaderState *state, extern void XLogReaderInvalReadState(XLogReaderState *state); #ifdef FRONTEND -extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr); +/* Function type definition for the read_page callback */ +typedef void (*XLogFindNextRecordCB) (XLogReaderState *xlogreader, + void *private); +extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr, + XLogFindNextRecordCB read_page, void *private); #endif /* FRONTEND */ /* Functions for decoding an XLogRecord */ -- 2.16.3 ----Next_Part(Fri_May_24_11_56_24_2019_374)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="v3-0009-Make-pg_rewind-not-use-callback-but-call-the-functio.patch"