On 26/03/2026 20:31, Daniel Gustafsson wrote:
On 22 Mar 2026, at 01:14, Heikki Linnakangas <[email protected]> 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



Reply via email to