From ddc2c9e973090b4989f68a9e2e792088be31a519 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 12 Jan 2026 19:28:51 -0500 Subject: [PATCH v10 8/8] WIP: bufmgr: Rename ResOwnerReleaseBufferPin This is separate as I'm not yet convinced of the new naming. The comment probably makes sense regardless. This is a name suggested a while ago by Melanie. Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- src/include/storage/buf_internals.h | 6 +++--- src/backend/storage/buffer/bufmgr.c | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 12086cf6dc7..b6714318154 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -520,18 +520,18 @@ extern PGDLLIMPORT CkptSortItem *CkptBufferIds; /* ResourceOwner callbacks to hold buffer I/Os and pins */ extern PGDLLIMPORT const ResourceOwnerDesc buffer_io_resowner_desc; -extern PGDLLIMPORT const ResourceOwnerDesc buffer_pin_resowner_desc; +extern PGDLLIMPORT const ResourceOwnerDesc buffer_resowner_desc; /* Convenience wrappers over ResourceOwnerRemember/Forget */ static inline void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer) { - ResourceOwnerRemember(owner, Int32GetDatum(buffer), &buffer_pin_resowner_desc); + ResourceOwnerRemember(owner, Int32GetDatum(buffer), &buffer_resowner_desc); } static inline void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) { - ResourceOwnerForget(owner, Int32GetDatum(buffer), &buffer_pin_resowner_desc); + ResourceOwnerForget(owner, Int32GetDatum(buffer), &buffer_resowner_desc); } static inline void ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index e114e64fdd9..2f39454fd7f 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -263,8 +263,8 @@ static void ForgetPrivateRefCountEntry(PrivateRefCountEntry *ref); /* ResourceOwner callbacks to hold in-progress I/Os and buffer pins */ static void ResOwnerReleaseBufferIO(Datum res); static char *ResOwnerPrintBufferIO(Datum res); -static void ResOwnerReleaseBufferPin(Datum res); -static char *ResOwnerPrintBufferPin(Datum res); +static void ResOwnerReleaseBuffer(Datum res); +static char *ResOwnerPrintBuffer(Datum res); const ResourceOwnerDesc buffer_io_resowner_desc = { @@ -275,13 +275,13 @@ const ResourceOwnerDesc buffer_io_resowner_desc = .DebugPrint = ResOwnerPrintBufferIO }; -const ResourceOwnerDesc buffer_pin_resowner_desc = +const ResourceOwnerDesc buffer_resowner_desc = { - .name = "buffer pin", + .name = "buffer", .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, .release_priority = RELEASE_PRIO_BUFFER_PINS, - .ReleaseResource = ResOwnerReleaseBufferPin, - .DebugPrint = ResOwnerPrintBufferPin + .ReleaseResource = ResOwnerReleaseBuffer, + .DebugPrint = ResOwnerPrintBuffer }; /* @@ -7671,8 +7671,14 @@ ResOwnerPrintBufferIO(Datum res) return psprintf("lost track of buffer IO on buffer %d", buffer); } +/* + * Release buffer as part of resource owner cleanup. This will only be called + * if the buffer is pinned. If this backend held the content lock at the time + * of the error we also need to release that (note that it is not possible to + * hold a content lock without a pin). + */ static void -ResOwnerReleaseBufferPin(Datum res) +ResOwnerReleaseBuffer(Datum res) { Buffer buffer = DatumGetInt32(res); @@ -7708,7 +7714,7 @@ ResOwnerReleaseBufferPin(Datum res) } static char * -ResOwnerPrintBufferPin(Datum res) +ResOwnerPrintBuffer(Datum res) { return DebugPrintBufferRefcount(DatumGetInt32(res)); } -- 2.48.1.76.g4e746b1a31.dirty