From ad64c6a38603f8606674e16c9830084eff4b54d4 Mon Sep 17 00:00:00 2001 From: Michael Paquier 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