From b94b2c17e07e5b9c8df1510da0f687ca2b52a5c3 Mon Sep 17 00:00:00 2001 From: Maxim Orlov 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