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

