Re: Better shared data structure management and resizable shared data structures

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Daniel Gustafsson <daniel(at)yesql(dot)se>
Cc: Robert Haas <robertmhaas(at)gmail(dot)com>, Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>, chaturvedipalak1911(at)gmail(dot)com
Subject: Re: Better shared data structure management and resizable shared data structures
Date: 2026-04-05 16:13:00
Message-ID: 1494c82a-6f8a-449d-a90b-cd96d9b47be5@iki.fi
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 26/03/2026 20:31, Daniel Gustafsson wrote:
>> On 22 Mar 2026, at 01:14, Heikki Linnakangas <hlinnaka(at)iki(dot)fi> wrote:
>> * The request_fn callback is called in postmaster startup, at the same stage as the old shmem_request callback was. But in EXEC_BACKEND mode, it's *also* called in each backend.
>
> Should the request_fn be told, via an argument, from where it is called? It
> can be figured out but it's cleaner if all implementations will do it in the
> same way. I don't have a direct case in mind where it would be needed, but I
> was recently digging into SSL passphrase reloading which has failure cases
> precisely becasue of this so am thinking out loud to avoid similar problems
> here.

Hmm, you mean adding an argument along the lines of:

static void
pgss_shmem_request(void *arg, bool attaching)
{
...
}

Perhaps. The idea is that a request callback should generally do the
exact same thing whether it's called from postmaster or from backend
startup, though. I worry that an argument like that makes it too
tempting to have different logic. That said, there are a couple of
places where I'm using IsUnderPostmaster for that purpose. For example,
I have this in lwlock.c (in latest version I'm currently working on that
I haven't posted yet):

/* Size of MainLWLockArray. Only valid in postmaster. */
static int num_main_array_locks;

/*
* Request shmem space for user-defined tranches and the main LWLock array.
*/
static void
LWLockShmemRequest(void *arg)
{
size_t size;

/* Space for user-defined tranches */
ShmemRequestStruct(.name = "LWLock tranches",
.size = sizeof(LWLockTrancheShmemData),
.ptr = (void **) &LWLockTranches,
);

/* Space for the LWLock array */
if (!IsUnderPostmaster)
{
num_main_array_locks = NUM_FIXED_LWLOCKS +
NumLWLocksForNamedTranches();
size = num_main_array_locks * sizeof(LWLockPadded);
}
else
size = SHMEM_ATTACH_UNKNOWN_SIZE;

ShmemRequestStruct(.name = "Main LWLock array",
.size = size,
.ptr = (void **) &MainLWLockArray,
);
}

- Heikki

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Ashutosh Bapat 2026-04-05 16:23:43 Re: Better shared data structure management and resizable shared data structures
Previous Message Sami Imseih 2026-04-05 16:05:14 Re: Duplicate RequestNamedLWLocktranche() names and test_lwlock_tranches improvements