Thread
-
[PATCH v8 1/4] Refactor setting XLP_FIRST_IS_OVERWRITE_CONTRECORD.
Heikki Linnakangas <heikki.linnakangas@iki.fi> — 2021-11-20T21:56:17Z
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"