[PATCH v8 1/4] Refactor setting XLP_FIRST_IS_OVERWRITE_CONTRECORD.

Heikki Linnakangas <heikki.linnakangas@iki.fi>

From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
To:
Date: 2021-11-20T21:56:17Z
Lists: pgsql-hackers
Set it directly in CreateOverwriteContrecordRecord(). That way,
AdvanceXLInsertBuffer() doesn't need the missingContrecPtr global
variable.
---
 src/backend/access/transam/xlog.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index d2d67209a32..56e0f519787 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -901,7 +901,9 @@ static void VerifyOverwriteContrecord(xl_overwrite_contrecord *xlrec,
 									  XLogReaderState *state);
 static int LocalSetXLogInsertAllowed(void);
 static void CreateEndOfRecoveryRecord(void);
-static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn);
+static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
+												  XLogRecPtr missingContrecPtr,
+												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
 static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
@@ -2283,18 +2285,6 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic)
 		if (!Insert->forcePageWrites)
 			NewPage->xlp_info |= XLP_BKP_REMOVABLE;
 
-		/*
-		 * If a record was found to be broken at the end of recovery, and
-		 * we're going to write on the page where its first contrecord was
-		 * lost, set the XLP_FIRST_IS_OVERWRITE_CONTRECORD flag on the page
-		 * header.  See CreateOverwriteContrecordRecord().
-		 */
-		if (missingContrecPtr == NewPageBeginPtr)
-		{
-			NewPage->xlp_info |= XLP_FIRST_IS_OVERWRITE_CONTRECORD;
-			missingContrecPtr = InvalidXLogRecPtr;
-		}
-
 		/*
 		 * If first page of an XLOG segment file, make it a long header.
 		 */
@@ -8141,7 +8131,7 @@ StartupXLOG(void)
 	if (!XLogRecPtrIsInvalid(abortedRecPtr))
 	{
 		Assert(!XLogRecPtrIsInvalid(missingContrecPtr));
-		CreateOverwriteContrecordRecord(abortedRecPtr);
+		CreateOverwriteContrecordRecord(abortedRecPtr, missingContrecPtr, newTLI);
 		abortedRecPtr = InvalidXLogRecPtr;
 		missingContrecPtr = InvalidXLogRecPtr;
 	}
@@ -9569,14 +9559,17 @@ CreateEndOfRecoveryRecord(void)
  * XLOG_OVERWRITE_CONTRECORD matches what was effectively overwritten.
  */
 static XLogRecPtr
-CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn)
+CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr missingContrecPtr,
+								TimeLineID newTLI)
 {
 	xl_overwrite_contrecord xlrec;
 	XLogRecPtr	recptr;
+	XLogPageHeader pagehdr;
 
 	/* sanity check */
 	if (!RecoveryInProgress())
 		elog(ERROR, "can only be used at end of recovery");
+	Assert(missingContrecPtr % XLOG_BLCKSZ == 0);
 
 	xlrec.overwritten_lsn = aborted_lsn;
 	xlrec.overwrite_time = GetCurrentTimestamp();
@@ -9588,6 +9581,12 @@ CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn)
 
 	recptr = XLogInsert(RM_XLOG_ID, XLOG_OVERWRITE_CONTRECORD);
 
+	/*
+	 * Set the XLP_FIRST_IS_OVERWRITE_CONTRECORD flag on the page header.
+	 */
+	pagehdr = (XLogPageHeader) GetXLogBuffer(missingContrecPtr, newTLI);
+	pagehdr->xlp_info |= XLP_FIRST_IS_OVERWRITE_CONTRECORD;
+
 	XLogFlush(recptr);
 
 	END_CRIT_SECTION();
-- 
2.30.2


--------------2135AFA2DD79B96A7476E2B5
Content-Type: text/x-patch; charset=UTF-8;
 name="v8-0002-Move-code-around-in-StartupXLOG.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="v8-0002-Move-code-around-in-StartupXLOG.patch"