0001-test_slru-Fix-LWLock-allocation-logic.patch

text/plain

Filename: 0001-test_slru-Fix-LWLock-allocation-logic.patch
Type: text/plain
Part: 0
Message: Failure in test_slru for host gokiburi (REL_16_STABLE only)
From ad64c6a38603f8606674e16c9830084eff4b54d4 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Mon, 18 May 2026 20:27:34 +0900
Subject: [PATCH] test_slru: Fix LWLock allocation logic

Only for REL_16_STABLE, per report from buildfarm members gokiburi.
---
 src/test/modules/test_slru/test_slru.c | 36 +++++++++++++++++++-------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/test/modules/test_slru/test_slru.c b/src/test/modules/test_slru/test_slru.c
index ae21444c4763..72b4c66658b8 100644
--- a/src/test/modules/test_slru/test_slru.c
+++ b/src/test/modules/test_slru/test_slru.c
@@ -40,9 +40,16 @@ PG_FUNCTION_INFO_V1(test_slru_delete_all);
 /* Number of SLRU page slots */
 #define NUM_TEST_BUFFERS		16
 
-/* SLRU control lock */
-LWLock		TestSLRULock;
-#define TestSLRULock (&TestSLRULock)
+typedef struct TestSlruSharedState
+{
+	/* SLRU control lock */
+	LWLock		lock;
+} TestSlruSharedState;
+
+/* Pointer to shared-memory state. */
+static TestSlruSharedState *test_slru_state = NULL;
+
+#define TestSLRULock (&test_slru_state->lock)
 
 static SlruCtlData TestSlruCtlData;
 #define TestSlruCtl			(&TestSlruCtlData)
@@ -202,6 +209,7 @@ test_slru_shmem_request(void)
 
 	/* reserve shared memory for the test SLRU */
 	RequestAddinShmemSpace(SimpleLruShmemSize(NUM_TEST_BUFFERS, 0));
+	RequestAddinShmemSpace(MAXALIGN(sizeof(TestSlruSharedState)));
 }
 
 static bool
@@ -214,7 +222,7 @@ static void
 test_slru_shmem_startup(void)
 {
 	const char	slru_dir_name[] = "pg_test_slru";
-	int			test_tranche_id;
+	bool		found;
 
 	if (prev_shmem_startup_hook)
 		prev_shmem_startup_hook();
@@ -225,15 +233,25 @@ test_slru_shmem_startup(void)
 	 */
 	(void) MakePGDirectory(slru_dir_name);
 
-	/* initialize the SLRU facility */
-	test_tranche_id = LWLockNewTrancheId();
-	LWLockRegisterTranche(test_tranche_id, "test_slru_tranche");
-	LWLockInitialize(TestSLRULock, test_tranche_id);
+	LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
+	test_slru_state = ShmemInitStruct("test_slru",
+									  sizeof(TestSlruSharedState),
+									  &found);
 
+	if (!found)
+	{
+		/* First time through ... */
+		LWLockInitialize(&test_slru_state->lock, LWLockNewTrancheId());
+		LWLockRegisterTranche(test_slru_state->lock.tranche, "test_slru");
+	}
+
+	LWLockRelease(AddinShmemInitLock);
+
+	/* initialize the SLRU facility */
 	TestSlruCtl->PagePrecedes = test_slru_page_precedes_logically;
 	SimpleLruInit(TestSlruCtl, "TestSLRU",
 				  NUM_TEST_BUFFERS, 0, TestSLRULock, slru_dir_name,
-				  test_tranche_id, SYNC_HANDLER_NONE);
+				  test_slru_state->lock.tranche, SYNC_HANDLER_NONE);
 }
 
 void
-- 
2.54.0