v3-0004-Use-custom-SLRU-IO-error-msg-for-multixact.patch
application/octet-stream
Filename: v3-0004-Use-custom-SLRU-IO-error-msg-for-multixact.patch
Type: application/octet-stream
Part: 4
Message:
Rework SLRU I/O errors handle
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 v3-0004
Subject: Use custom SLRU IO error msg for multixact
| File | + | − |
|---|---|---|
| src/backend/access/transam/multixact.c | 32 | 4 |
From b94b2c17e07e5b9c8df1510da0f687ca2b52a5c3 Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Wed, 25 Feb 2026 18:20:01 +0300
Subject: [PATCH v3 4/5] Use custom SLRU IO error msg for multixact
---
src/backend/access/transam/multixact.c | 36 +++++++++++++++++++++++---
1 file changed, 32 insertions(+), 4 deletions(-)
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index 816fb50fa4b..b78cd5fe41e 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -277,6 +277,8 @@ static void mXactCachePut(MultiXactId multi, int nmembers,
/* management of SLRU infrastructure */
static bool MultiXactOffsetPagePrecedes(int64 page1, int64 page2);
static bool MultiXactMemberPagePrecedes(int64 page1, int64 page2);
+static inline int MultiXactOffsetIoErrorMsg(const void *opaque_data);
+static inline int MultiXactMemberIoErrorMsg(const void *opaque_data);
static void ExtendMultiXactOffset(MultiXactId multi);
static void ExtendMultiXactMember(MultiXactOffset offset, int nmembers);
static void SetOldestOffset(void);
@@ -881,7 +883,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset,
LWLockAcquire(lock, LW_EXCLUSIVE);
prevlock = lock;
}
- slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, &multi);
+ slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true,
+ &offset);
prev_pageno = pageno;
}
@@ -1309,7 +1312,8 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
lock = newlock;
}
- slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, &multi);
+ slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true,
+ &offset);
prev_pageno = pageno;
}
@@ -1730,8 +1734,8 @@ MultiXactShmemInit(void)
MultiXactOffsetCtl->PagePrecedes = MultiXactOffsetPagePrecedes;
MultiXactMemberCtl->PagePrecedes = MultiXactMemberPagePrecedes;
- MultiXactOffsetCtl->errmsg_for_io_error = xact_errmsg_for_io_error;
- MultiXactMemberCtl->errmsg_for_io_error = xact_errmsg_for_io_error;
+ MultiXactOffsetCtl->errmsg_for_io_error = MultiXactOffsetIoErrorMsg;
+ MultiXactMemberCtl->errmsg_for_io_error = MultiXactMemberIoErrorMsg;
SimpleLruInit(MultiXactOffsetCtl,
"multixact_offset", multixact_offset_buffers, 0,
@@ -2758,6 +2762,30 @@ MultiXactMemberPagePrecedes(int64 page1, int64 page2)
return page1 < page2;
}
+/*
+ * Custom IO errmsg for MultiXactOffset.
+ */
+static inline int
+MultiXactOffsetIoErrorMsg(const void *opaque_data)
+{
+ Assert(opaque_data != NULL);
+
+ return errmsg("could not access status of multixact offset %u",
+ *(MultiXactId *) opaque_data);
+}
+
+/*
+ * Custom IO errmsg for MultiXactMember.
+ */
+static inline int
+MultiXactMemberIoErrorMsg(const void *opaque_data)
+{
+ Assert(opaque_data != NULL);
+
+ return errmsg("could not access status of multixact member %" PRIu64,
+ *(MultiXactOffset *) opaque_data);
+}
+
/*
* Decide which of two MultiXactIds is earlier.
*
--
2.43.0