[PATCH v7 1/5] 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 221e4cb34f8..c42accfa53f 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -905,7 +905,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);
@@ -2285,18 +2287,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.
*/
@@ -8144,7 +8134,7 @@ StartupXLOG(void)
if (!XLogRecPtrIsInvalid(abortedRecPtr))
{
Assert(!XLogRecPtrIsInvalid(missingContrecPtr));
- CreateOverwriteContrecordRecord(abortedRecPtr);
+ CreateOverwriteContrecordRecord(abortedRecPtr, missingContrecPtr, newTLI);
abortedRecPtr = InvalidXLogRecPtr;
missingContrecPtr = InvalidXLogRecPtr;
}
@@ -9572,14 +9562,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();
@@ -9591,6 +9584,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
--------------3904592D294EBE853403D5C1
Content-Type: text/x-patch; charset=UTF-8;
name="v7-0002-Use-correct-WAL-position-in-error-message-on-inva.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename*0="v7-0002-Use-correct-WAL-position-in-error-message-on-inva.pa";
filename*1="tch"