On Tue, Sep 16, 2025 at 10:27:34PM -0500, Nathan Bossart wrote:
> It looks like the postmaster is trying to access the request array after
> re-initializing shared memory, which of course fails.  So, we need to keep
> the request array in postmaster's local memory, too.  Attached is a quick
> attempt at a fix.

I was able to simplify the patch.

-- 
nathan
>From eab5c8d101a4efbfa00f2c627943e5b18d74ef78 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nat...@postgresql.org>
Date: Tue, 16 Sep 2025 22:11:47 -0500
Subject: [PATCH v2 1/1] fix LWLock shmem reinitialization

---
 src/backend/storage/lmgr/lwlock.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/backend/storage/lmgr/lwlock.c 
b/src/backend/storage/lmgr/lwlock.c
index 46c82c63ca5..626f0fbdac1 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -192,6 +192,9 @@ typedef struct NamedLWLockTrancheRequest
 int                    NamedLWLockTrancheRequests = 0;
 NamedLWLockTrancheRequest *NamedLWLockTrancheRequestArray = NULL;
 
+/* postmaster's local copy of the request array */
+static NamedLWLockTrancheRequest *LocalNamedLWLockTrancheRequestArray;
+
 /* shared memory counter of registered tranches */
 int               *LWLockCounter = NULL;
 
@@ -396,6 +399,9 @@ LWLockShmemSize(void)
        Size            size;
        int                     numLocks = NUM_FIXED_LWLOCKS;
 
+       if (LocalNamedLWLockTrancheRequestArray)
+               NamedLWLockTrancheRequestArray = 
LocalNamedLWLockTrancheRequestArray;
+
        /* Calculate total number of locks needed in the main array. */
        numLocks += NumLWLocksForNamedTranches();
 
@@ -459,7 +465,7 @@ CreateLWLocks(void)
                {
                        memcpy(ptr, NamedLWLockTrancheRequestArray,
                                   NamedLWLockTrancheRequests * 
sizeof(NamedLWLockTrancheRequest));
-                       pfree(NamedLWLockTrancheRequestArray);
+                       LocalNamedLWLockTrancheRequestArray = 
NamedLWLockTrancheRequestArray;
                        NamedLWLockTrancheRequestArray = 
(NamedLWLockTrancheRequest *) ptr;
                        ptr += NamedLWLockTrancheRequests * 
sizeof(NamedLWLockTrancheRequest);
                }
-- 
2.39.5 (Apple Git-154)

Reply via email to