On Fri, Oct 30, 2026 at 12:17:33PM +0100, Ashutosh Bapat wrote:
> During normal startup, we call CalculateShmemSize() twice: once to
> initialize the shared-memory-related GUCs and again to create the
> shared memory segment. We can avoid the second calculation by calling
> CalculateShmemSize() after ShmemCallRequestCallbacks() and passing the
> result to InitializeShmemGUCs() and CreateSharedMemoryAndSemaphores().
> The attached patch does this, ensuring that GUC reporting and shared
> memory creation use the same calculated size.

+1.  I think it's my fault it's called twice.  I don't recall why I didn't
bother trying to fix it, but I do think it's worth fixing.

> As a follow-up, would it make sense to introduce an SRS_SIZED state
> between SRS_REQUESTING and SRS_INITIALIZING? We could enter it when
> ShmemGetRequestedSize() finishes and adjust the state checks
> accordingly. This would prevent new requests from being registered
> after the required shared memory size has been calculated.
> EXEC_BACKEND child attachment and late allocation would retain their
> existing paths without entering this state. I can update the patch if
> this seems worthwhile.

Seems worth exploring.

> -     CreateSharedMemoryAndSemaphores();
> +     shmem_size = CalculateShmemSize();
> +     CreateSharedMemoryAndSemaphores(shmem_size);

nitpick: When the variable is only used in one place, is there any reason
not to just do CreateSharedMemoryAndSemaphores(CalculateShmemSize())?

>  /*
>   * CalculateShmemSize
>   *           Calculates the amount of shared memory needed.
> + *
> + * Expected to be called only once after collecting all shared memory 
> requests
> + * but before allocating the shared memory segment at the startup or server
> + * restart.
>   */

Should we ERROR if it is called more than once?  That might need some
special handling for the restart_after_crash case.

> -CreateSharedMemoryAndSemaphores(void)
> +CreateSharedMemoryAndSemaphores(Size size)

Should we verify the size looks reasonable?  A "!= 0" check might be
worthwhile, at least.

> - *   ShmemGetRequestedSize() --- estimate the total size of all registered 
> shared
> - *                              memory structures.
> + * ShmemGetRequestedSize() --- estimate the total size of all registered 
> shared
> + * memory structures.

nitpick: Unnecessary changes.

> - * This is called at postmaster startup, before the shared memory segment has
> - * been created.
> + * This is called at postmaster startup or server restart, before the shared
> + * memory segment has been created.

nitpick: This also seems unnecessary, or at least unrelated to the patch at
hand.

-- 
nathan


Reply via email to