From 4f7a4672aee298ee86bdb54a2cf1438fa80ced35 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 26 Dec 2023 22:25:45 -0600 Subject: [PATCH v3 2/2] use dsm registry for pg_prewarm --- contrib/pg_prewarm/autoprewarm.c | 44 ++++++++++---------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 0993bd2453..ed12142d04 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -38,6 +38,7 @@ #include "postmaster/interrupt.h" #include "storage/buf_internals.h" #include "storage/dsm.h" +#include "storage/dsm_registry.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" @@ -95,8 +96,6 @@ static void apw_start_database_worker(void); static bool apw_init_shmem(void); static void apw_detach_shmem(int code, Datum arg); static int apw_compare_blockinfo(const void *p, const void *q); -static void autoprewarm_shmem_request(void); -static shmem_request_hook_type prev_shmem_request_hook = NULL; /* Pointer to shared-memory state. */ static AutoPrewarmSharedState *apw_state = NULL; @@ -140,26 +139,11 @@ _PG_init(void) MarkGUCPrefixReserved("pg_prewarm"); - prev_shmem_request_hook = shmem_request_hook; - shmem_request_hook = autoprewarm_shmem_request; - /* Register autoprewarm worker, if enabled. */ if (autoprewarm) apw_start_leader_worker(); } -/* - * Requests any additional shared memory required for autoprewarm. - */ -static void -autoprewarm_shmem_request(void) -{ - if (prev_shmem_request_hook) - prev_shmem_request_hook(); - - RequestAddinShmemSpace(MAXALIGN(sizeof(AutoPrewarmSharedState))); -} - /* * Main entry point for the leader autoprewarm process. Per-database workers * have a separate entry point. @@ -767,6 +751,16 @@ autoprewarm_dump_now(PG_FUNCTION_ARGS) PG_RETURN_INT64((int64) num_blocks); } +static void +init_state(void *ptr) +{ + AutoPrewarmSharedState *state = (AutoPrewarmSharedState *) ptr; + + LWLockInitialize(&state->lock, LWLockNewTrancheId()); + state->bgworker_pid = InvalidPid; + state->pid_using_dumpfile = InvalidPid; +} + /* * Allocate and initialize autoprewarm related shared memory, if not already * done, and set up backend-local pointer to that state. Returns true if an @@ -777,19 +771,9 @@ apw_init_shmem(void) { bool found; - LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); - apw_state = ShmemInitStruct("autoprewarm", - sizeof(AutoPrewarmSharedState), - &found); - if (!found) - { - /* First time through ... */ - LWLockInitialize(&apw_state->lock, LWLockNewTrancheId()); - apw_state->bgworker_pid = InvalidPid; - apw_state->pid_using_dumpfile = InvalidPid; - } - LWLockRelease(AddinShmemInitLock); - + apw_state = dsm_registry_init_or_attach("autoprewarm", + sizeof(AutoPrewarmSharedState), + init_state, &found); LWLockRegisterTranche(apw_state->lock.tranche, "autoprewarm"); return found; -- 2.25.1