From 882d4dca9935233cbe5ed0f79845d78d691e6bb8 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Thu, 18 Apr 2019 16:00:57 +0900
Subject: [PATCH 09/10] Make pg_rewind not use callback but call the function
 directly

This patch replaces the call to the callback in pg_rewind with direct
call to the original function. Then invalidate the parameters callback
and private for XLogReaderAllocate.
---
 src/bin/pg_rewind/parsexlog.c | 42 +++++++++++-------------------------------
 1 file changed, 11 insertions(+), 31 deletions(-)

diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c
index 21b638ed34..d504c3227a 100644
--- a/src/bin/pg_rewind/parsexlog.c
+++ b/src/bin/pg_rewind/parsexlog.c
@@ -49,9 +49,7 @@ typedef struct XLogPageReadPrivate
 } XLogPageReadPrivate;
 
 static void SimpleXLogPageRead(XLogReaderState *xlogreader,
-				   XLogRecPtr targetPagePtr,
-				   int reqLen, XLogRecPtr targetRecPtr, char *readBuf,
-				   TimeLineID *pageTLI);
+							   XLogPageReadPrivate *private);
 
 /*
  * Read WAL from the datadir/pg_wal, starting from 'startpoint' on timeline
@@ -69,8 +67,7 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
 
 	private.datadir = datadir;
 	private.tliIndex = tliIndex;
-	xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
-									&private);
+	xlogreader = XLogReaderAllocate(WalSegSz, NULL, NULL);
 	if (xlogreader == NULL)
 		pg_fatal("out of memory");
 
@@ -78,12 +75,7 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
 	{
 		while (XLogReadRecord(xlogreader, startpoint, &record, &errormsg) ==
 			   XLREAD_NEED_DATA)
-			xlogreader->read_page(xlogreader,
-								  xlogreader->loadPagePtr,
-								  xlogreader->loadLen,
-								  xlogreader->currRecPtr,
-								  xlogreader->readBuf,
-								  &xlogreader->readPageTLI);
+			SimpleXLogPageRead(xlogreader, &private);
 
 		if (record == NULL)
 		{
@@ -130,19 +122,13 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex)
 
 	private.datadir = datadir;
 	private.tliIndex = tliIndex;
-	xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
-									&private);
+	xlogreader = XLogReaderAllocate(WalSegSz, NULL, NULL);
 	if (xlogreader == NULL)
 		pg_fatal("out of memory");
 
 	while (XLogReadRecord(xlogreader, ptr, &record, &errormsg) ==
 		   XLREAD_NEED_DATA)
-				xlogreader->read_page(xlogreader,
-									  xlogreader->loadPagePtr,
-									  xlogreader->loadLen,
-									  xlogreader->currRecPtr,
-									  xlogreader->readBuf,
-									  &xlogreader->readPageTLI);
+		SimpleXLogPageRead(xlogreader, &private);
 
 	if (record == NULL)
 	{
@@ -196,8 +182,7 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
 
 	private.datadir = datadir;
 	private.tliIndex = tliIndex;
-	xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
-									&private);
+	xlogreader = XLogReaderAllocate(WalSegSz, NULL, NULL);
 	if (xlogreader == NULL)
 		pg_fatal("out of memory");
 
@@ -208,12 +193,7 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
 
 		while (XLogReadRecord(xlogreader, searchptr, &record, &errormsg) ==
 			   XLREAD_NEED_DATA)
-			xlogreader->read_page(xlogreader,
-								  xlogreader->loadPagePtr,
-								  xlogreader->loadLen,
-								  xlogreader->currRecPtr,
-								  xlogreader->readBuf,
-								  &xlogreader->readPageTLI);
+			SimpleXLogPageRead(xlogreader, &private);
 
 		if (record == NULL)
 		{
@@ -260,11 +240,11 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
 
 /* XLogreader callback function, to read a WAL page */
 static void
-SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
-				   int reqLen, XLogRecPtr targetRecPtr, char *readBuf,
-				   TimeLineID *pageTLI)
+SimpleXLogPageRead(XLogReaderState *xlogreader, XLogPageReadPrivate *private)
 {
-	XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data;
+	XLogRecPtr	targetPagePtr = xlogreader->loadPagePtr;
+	char	   *readBuf		  = xlogreader->readBuf;
+	TimeLineID *pageTLI		  = &xlogreader->readPageTLI;
 	uint32		targetPageOff;
 	XLogRecPtr	targetSegEnd;
 	XLogSegNo	targetSegNo;
-- 
2.16.3

