v5-0002-make-the-errdetail-on-multixact-members-more-deta.patch
text/x-patch
Filename: v5-0002-make-the-errdetail-on-multixact-members-more-deta.patch
Type: text/x-patch
Part: 1
Message:
Re: 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 v5-0002
Subject: make the errdetail on multixact members more detailed
| File | + | − |
|---|---|---|
| src/backend/access/transam/multixact.c | 22 | 7 |
| src/tools/pgindent/typedefs.list | 1 | 0 |
From 0e379ca25a6eb5d658a2241be06ff6f45369171e Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Wed, 11 Mar 2026 11:48:59 +0200
Subject: [PATCH v5 2/2] make the errdetail on multixact members more detailed
(to be squashed)
---
src/backend/access/transam/multixact.c | 29 +++++++++++++++++++-------
src/tools/pgindent/typedefs.list | 1 +
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index abde1750189..30e04080b00 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -313,6 +313,14 @@ static void mXactCachePut(MultiXactId multi, int nmembers,
MultiXactMember *members);
/* management of SLRU infrastructure */
+
+/* opaque_data type for MultiXactMemberIoErrorDetail */
+typedef struct MultiXactOffsetSlruReadContext
+{
+ MultiXactId multi;
+ MultiXactOffset offset;
+} MultiXactOffsetSlruReadContext;
+
static bool MultiXactOffsetPagePrecedes(int64 page1, int64 page2);
static bool MultiXactMemberPagePrecedes(int64 page1, int64 page2);
static int MultiXactOffsetIoErrorDetail(const void *opaque_data);
@@ -907,6 +915,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset,
if (pageno != prev_pageno)
{
+ MultiXactOffsetSlruReadContext slru_read_context = {multi, offset};
+
/*
* MultiXactMember SLRU page is changed so check if this new page
* fall into the different SLRU bank then release the old bank's
@@ -922,7 +932,7 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset,
prevlock = lock;
}
slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true,
- &offset);
+ &slru_read_context);
prev_pageno = pageno;
}
@@ -1334,6 +1344,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
if (pageno != prev_pageno)
{
+ MultiXactOffsetSlruReadContext slru_read_context = {multi, offset};
LWLock *newlock;
/*
@@ -1349,9 +1360,8 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
LWLockAcquire(newlock, LW_EXCLUSIVE);
lock = newlock;
}
-
slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true,
- &offset);
+ &slru_read_context);
prev_pageno = pageno;
}
@@ -1962,6 +1972,7 @@ TrimMultiXact(void)
flagsoff = MXOffsetToFlagsOffset(offset);
if (flagsoff != 0)
{
+ MultiXactOffsetSlruReadContext slru_read_context = {InvalidMultiXactId, offset};
int slotno;
TransactionId *xidptr;
int memberoff;
@@ -1969,7 +1980,7 @@ TrimMultiXact(void)
LWLockAcquire(lock, LW_EXCLUSIVE);
memberoff = MXOffsetToMemberOffset(offset);
- slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, &offset);
+ slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, &slru_read_context);
xidptr = (TransactionId *)
(MultiXactMemberCtl->shared->page_buffer[slotno] + memberoff);
@@ -2825,10 +2836,14 @@ MultiXactOffsetIoErrorDetail(const void *opaque_data)
static int
MultiXactMemberIoErrorDetail(const void *opaque_data)
{
- MultiXactOffset mxoff = *(const MultiXactOffset *) opaque_data;
+ const MultiXactOffsetSlruReadContext *context = opaque_data;
- return errdetail("Could not access multixact member at offset %" PRIu64 ".",
- mxoff);
+ if (MultiXactIdIsValid(context->multi))
+ return errdetail("Could not access member of multixact %u at offset %" PRIu64 ".",
+ context->multi, context->offset);
+ else
+ return errdetail("Could not access multixact member at offset %" PRIu64 ".",
+ context->offset);
}
/*
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 3da19d41413..951c0574e52 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1749,6 +1749,7 @@ MultiXactId
MultiXactMember
MultiXactOffset
MultiXactOffset32
+MultiXactOffsetSlruReadContext
MultiXactStateData
MultiXactStatus
MultirangeIOData
--
2.47.3