nocfbot-3-0001-Use-GetNamedDSA-GetNamedDSHash-for-shared.patch
application/octet-stream
Filename: nocfbot-3-0001-Use-GetNamedDSA-GetNamedDSHash-for-shared.patch
Type: application/octet-stream
Part: 0
Message:
Re: pg_plan_advice
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Use GetNamedDSA / GetNamedDSHash for shared memory allocations
| File | + | − |
|---|---|---|
| contrib/pg_stash_advice/pg_stash_advice.c | 11 | 97 |
From a9de0367fc504de403b93be179f36615a3884fc7 Mon Sep 17 00:00:00 2001
From: Lukas Fittl <lukas@fittl.com>
Date: Tue, 31 Mar 2026 23:30:11 -0700
Subject: [PATCH vnocfbot-3] Use GetNamedDSA / GetNamedDSHash for shared memory
allocations
This allows utilizing pg_get_dsm_registry_allocations to see the amount
of memory used by the internal storage.
---
contrib/pg_stash_advice/pg_stash_advice.c | 108 +++-------------------
1 file changed, 11 insertions(+), 97 deletions(-)
diff --git a/contrib/pg_stash_advice/pg_stash_advice.c b/contrib/pg_stash_advice/pg_stash_advice.c
index 22122236694..c74d0eebf45 100644
--- a/contrib/pg_stash_advice/pg_stash_advice.c
+++ b/contrib/pg_stash_advice/pg_stash_advice.c
@@ -43,13 +43,7 @@ PG_FUNCTION_INFO_V1(pg_set_stashed_advice);
typedef struct pgsa_shared_state
{
LWLock lock;
- int dsa_tranche;
- int stash_tranche;
- int entry_tranche;
uint64 next_stash_id;
- dsa_handle area;
- dshash_table_handle stash_hash;
- dshash_table_handle entry_hash;
} pgsa_shared_state;
typedef struct pgsa_stash
@@ -113,29 +107,27 @@ static dshash_table *pgsa_stash_dshash;
static dshash_table *pgsa_entry_dshash;
/* Shared memory hash table parameters */
-static dshash_parameters pgsa_stash_dshash_parameters = {
+static const dshash_parameters pgsa_stash_dshash_parameters = {
NAMEDATALEN,
sizeof(pgsa_stash),
dshash_strcmp,
dshash_strhash,
dshash_strcpy,
- LWTRANCHE_INVALID /* gets set at runtime */
+ LWTRANCHE_INVALID /* assigned by GetNamedDSHash */
};
-static dshash_parameters pgsa_entry_dshash_parameters = {
+static const dshash_parameters pgsa_entry_dshash_parameters = {
sizeof(pgsa_entry_key),
sizeof(pgsa_entry),
dshash_memcmp,
dshash_memhash,
dshash_memcpy,
- LWTRANCHE_INVALID /* gets set at runtime */
+ LWTRANCHE_INVALID /* assigned by GetNamedDSHash */
};
/* GUC variable */
static char *pg_stash_advice_stash_name = "";
-/* Other global variables */
-static MemoryContext pg_stash_advice_mcxt;
/* Function prototypes */
static char *pgsa_advisor(PlannerGlobal *glob,
@@ -519,17 +511,6 @@ static void
pgsa_attach(void)
{
bool found;
- MemoryContext oldcontext;
-
- /*
- * Create a memory context to make sure that any control structures
- * allocated in local memory are sufficiently persistent.
- */
- if (pg_stash_advice_mcxt == NULL)
- pg_stash_advice_mcxt = AllocSetContextCreate(TopMemoryContext,
- "pg_stash_advice",
- ALLOCSET_DEFAULT_SIZES);
- oldcontext = MemoryContextSwitchTo(pg_stash_advice_mcxt);
/* Attach to the fixed-size state object if not already done. */
if (pgsa_state == NULL)
@@ -540,80 +521,19 @@ pgsa_attach(void)
/* Attach to the DSA area if not already done. */
if (pgsa_dsa_area == NULL)
- {
- dsa_handle area_handle;
-
- LWLockAcquire(&pgsa_state->lock, LW_EXCLUSIVE);
- area_handle = pgsa_state->area;
- if (area_handle == DSA_HANDLE_INVALID)
- {
- pgsa_dsa_area = dsa_create(pgsa_state->dsa_tranche);
- dsa_pin(pgsa_dsa_area);
- pgsa_state->area = dsa_get_handle(pgsa_dsa_area);
- LWLockRelease(&pgsa_state->lock);
- }
- else
- {
- LWLockRelease(&pgsa_state->lock);
- pgsa_dsa_area = dsa_attach(area_handle);
- }
- dsa_pin_mapping(pgsa_dsa_area);
- }
+ pgsa_dsa_area = GetNamedDSA("pg_stash_advice_dsa", &found);
/* Attach to the stash_name->stash_id hash table if not already done. */
if (pgsa_stash_dshash == NULL)
- {
- dshash_table_handle stash_handle;
-
- LWLockAcquire(&pgsa_state->lock, LW_EXCLUSIVE);
- pgsa_stash_dshash_parameters.tranche_id = pgsa_state->stash_tranche;
- stash_handle = pgsa_state->stash_hash;
- if (stash_handle == DSHASH_HANDLE_INVALID)
- {
- pgsa_stash_dshash = dshash_create(pgsa_dsa_area,
- &pgsa_stash_dshash_parameters,
- NULL);
- pgsa_state->stash_hash =
- dshash_get_hash_table_handle(pgsa_stash_dshash);
- LWLockRelease(&pgsa_state->lock);
- }
- else
- {
- LWLockRelease(&pgsa_state->lock);
- pgsa_stash_dshash = dshash_attach(pgsa_dsa_area,
- &pgsa_stash_dshash_parameters,
- stash_handle, NULL);
- }
- }
+ pgsa_stash_dshash = GetNamedDSHash("pg_stash_advice_stash",
+ &pgsa_stash_dshash_parameters,
+ &found);
/* Attach to the entry hash table if not already done. */
if (pgsa_entry_dshash == NULL)
- {
- dshash_table_handle entry_handle;
-
- LWLockAcquire(&pgsa_state->lock, LW_EXCLUSIVE);
- pgsa_entry_dshash_parameters.tranche_id = pgsa_state->entry_tranche;
- entry_handle = pgsa_state->entry_hash;
- if (entry_handle == DSHASH_HANDLE_INVALID)
- {
- pgsa_entry_dshash = dshash_create(pgsa_dsa_area,
- &pgsa_entry_dshash_parameters,
- NULL);
- pgsa_state->entry_hash =
- dshash_get_hash_table_handle(pgsa_entry_dshash);
- LWLockRelease(&pgsa_state->lock);
- }
- else
- {
- LWLockRelease(&pgsa_state->lock);
- pgsa_entry_dshash = dshash_attach(pgsa_dsa_area,
- &pgsa_entry_dshash_parameters,
- entry_handle, NULL);
- }
- }
-
- /* Restore previous memory context. */
- MemoryContextSwitchTo(oldcontext);
+ pgsa_entry_dshash = GetNamedDSHash("pg_stash_advice_entry",
+ &pgsa_entry_dshash_parameters,
+ &found);
}
/*
@@ -789,13 +709,7 @@ pgsa_init_shared_state(void *ptr, void *arg)
LWLockInitialize(&state->lock,
LWLockNewTrancheId("pg_stash_advice_lock"));
- state->dsa_tranche = LWLockNewTrancheId("pg_stash_advice_dsa");
- state->stash_tranche = LWLockNewTrancheId("pg_stash_advice_stash");
- state->entry_tranche = LWLockNewTrancheId("pg_stash_advice_entry");
state->next_stash_id = UINT64CONST(1);
- state->area = DSA_HANDLE_INVALID;
- state->stash_hash = DSHASH_HANDLE_INVALID;
- state->entry_hash = DSHASH_HANDLE_INVALID;
}
/*
--
2.47.1