v4-0001-Keep-the-return-value-of-XLogInsertRecord-for-XLO.patch
application/octet-stream
Filename: v4-0001-Keep-the-return-value-of-XLogInsertRecord-for-XLO.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v4-0001
Subject: Keep the return value of XLogInsertRecord() for XLOG_SWITCH record consistent with other records patch v4
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 12 | 22 |
From 44673d3803e1af627796bd67862f6c4899960caf Mon Sep 17 00:00:00 2001
From: "ZizhuanLiu(X-MAN)" <44973863@qq.com>
Date: Mon, 15 Jun 2026 09:01:36 +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 | 34 +++++++++++--------------------
1 file changed, 12 insertions(+), 22 deletions(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index d01161d..87ff626 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,27 +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 + MAXALIGN(SizeOfXLogRecord);
-
- /*
- * If the XLOG_SWITCH record crosses a page boundary and actually has
- * a part on the next page, we need to consider the page header. This
- * is consistent with XLogBytePosToEndRecPtr().
- */
- if (StartPos / XLOG_BLCKSZ != (EndPos - 1) / 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
@@ -1208,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;
@@ -1242,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