From f08bf94b4f18c7aea9c6e7d3f321c153da7a76d8 Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Date: Tue, 7 Apr 2026 19:24:15 +0530
Subject: [PATCH v20260407] Unlock ShmemIndexLock before calling init_fn
 callback

CallShmemCallbacksAfterStartup() calls init_fn or attach_fn callbacks
while holding ShmemIndexLock. Those callbacks do not require the lock to
be held. Before d4885af3d65325c1fcd319e98c634fde9a200443, code
initializing the shared structures executed without holding
ShmemIndexLock.

On the other hand, those callbacks may be performing long running
operations like disk access e.g. pgss_shmem_init. Holding a lightweight
lock that long should be avoided, if possible. It will cause a delay in
loading an extension in all the backends since all attach_fns will be
serialized.

Author: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
---
 src/backend/storage/ipc/shmem.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c
index 1ebffe5a32a..66b95713020 100644
--- a/src/backend/storage/ipc/shmem.c
+++ b/src/backend/storage/ipc/shmem.c
@@ -956,6 +956,8 @@ CallShmemCallbacksAfterStartup(const ShmemCallbacks *callbacks)
 	list_free_deep(pending_shmem_requests);
 	pending_shmem_requests = NIL;
 
+	LWLockRelease(ShmemIndexLock);
+
 	/* Finish by calling the appropriate subsystem-specific callback */
 	if (found_any)
 	{
@@ -968,7 +970,6 @@ CallShmemCallbacksAfterStartup(const ShmemCallbacks *callbacks)
 			callbacks->init_fn(callbacks->opaque_arg);
 	}
 
-	LWLockRelease(ShmemIndexLock);
 	shmem_request_state = SRS_DONE;
 }
 

base-commit: 29e7dbf5e4daa8fafc2b18a1551e7b31c8847340
-- 
2.34.1

