From 127e197a57fd237938adbec7b4ca42401068bc11 Mon Sep 17 00:00:00 2001 From: "ZizhuanLiu(X-MAN)" <44973863@qq.com> Date: Sat, 13 Jun 2026 19:10:01 +0800 Subject: [PATCH v4] Keep the return value of XLogInsertRecord() for XLOG_SWITCH record consistent with other records patch v4 --- src/backend/access/transam/xlog.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index d69d03b..ab6f8bb 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -737,7 +737,7 @@ static void CopyXLogRecordToWAL(int write_len, bool isLogSwitch, static void ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr); static bool ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, - XLogRecPtr *PrevPtr); + XLogRecPtr *PrevPtr, XLogRecPtr *actual_EndPos); static XLogRecPtr WaitXLogInsertionsToFinish(XLogRecPtr upto); static char *GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli); static XLogRecPtr XLogBytePosToRecPtr(uint64 bytepos); @@ -796,6 +796,7 @@ XLogInsertRecord(XLogRecData *rdata, WalInsertClass class = WALINSERT_NORMAL; XLogRecPtr StartPos; XLogRecPtr EndPos; + XLogRecPtr actual_EndPos; bool prevDoPageWrites = doPageWrites; TimeLineID insertTLI; @@ -920,7 +921,7 @@ XLogInsertRecord(XLogRecData *rdata, */ Assert(!XLogRecPtrIsValid(fpw_lsn)); WALInsertLockAcquireExclusive(); - inserted = ReserveXLogSwitch(&StartPos, &EndPos, &rechdr->xl_prev); + inserted = ReserveXLogSwitch(&StartPos, &EndPos, &rechdr->xl_prev, &actual_EndPos); } else { @@ -1023,21 +1024,11 @@ XLogInsertRecord(XLogRecData *rdata, /* * Even though we reserved the rest of the segment for us, which is * reflected in EndPos, we return a pointer to just the end of the - * xlog-switch record. + * xlog-switch record, which is consistent with other WAL types returned + * by XLogBytePosToEndRecPtr(). */ if (inserted) - { - EndPos = StartPos + SizeOfXLogRecord; - if (StartPos / XLOG_BLCKSZ != EndPos / XLOG_BLCKSZ) - { - uint64 offset = XLogSegmentOffset(EndPos, wal_segment_size); - - if (offset == EndPos % XLOG_BLCKSZ) - EndPos += SizeOfXLogLongPHD; - else - EndPos += SizeOfXLogShortPHD; - } - } + EndPos = actual_EndPos; } #ifdef WAL_DEBUG @@ -1202,7 +1193,8 @@ ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, * reserving any space, and the function returns false. */ static bool -ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr) +ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, + XLogRecPtr *PrevPtr, XLogRecPtr *actual_EndPos) { XLogCtlInsert *Insert = &XLogCtl->Insert; uint64 startbytepos; @@ -1236,6 +1228,10 @@ ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr) *StartPos = XLogBytePosToRecPtr(startbytepos); *EndPos = XLogBytePosToEndRecPtr(endbytepos); + /* Store actual end position. */ + if (actual_EndPos != NULL) + *actual_EndPos = *EndPos; + segleft = wal_segment_size - XLogSegmentOffset(*EndPos, wal_segment_size); if (segleft != wal_segment_size) { -- 2.43.0