Re: Better shared data structure management and resizable shared data structures
Heikki Linnakangas <hlinnaka@iki.fi>
On 12/03/2026 20:56, Robert Haas wrote: > On Thu, Mar 12, 2026 at 2:41 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote: >> shmem_startup_hook() is too late. The shmem structs need to be >> registered at postmaster startup before the shmem segment is allocated, >> so that we can calculate the total size needed. > > Sorry, I meant shmem_request_hook. Ah ok >> I'm currently leaning towards _PG_init(), except for allocations that >> depend on MaxBackends. For those, you can install a shmem_request_hook >> that sets the size in the descriptor. In other words, you can leave the >> 'size' as empty in _PG_init(), but set it later in the shmem_request_hook. > > Why can't you just do the whole thing later? shmem_request_hook won't work in EXEC_BACKEND mode, because in EXEC_BACKEND mode, ShmemRegisterStruct() also needs to be called at backend startup. One of my design goals is to avoid EXEC_BACKEND specific steps so that if you write your extension oblivious to EXEC_BACKEND mode, it will still usually work with EXEC_BACKEND. For example, if it was necessary to call a separate AttachShmem() function for every shmem struct in EXEC_BACKEND mode, but which was not needed on Unix, that would be bad. >> Except that you'd still need them for RequestNamedLWLockTranche(). I >> wonder if we should recommend extensions to embed the LWLock struct into >> their shared memory struct and use the LWLockInitialize() and >> LWLockNewTrancheId() functions instead. That fits the new >> ShmemRegisterStruct() API a little better than RequestNamedLWLockTranche(). > > Yeah, I think RequestNamedLWLockTranche() might be fine if you just > need LWLocks, but if you need a bunch of resources, putting them all > into the same chunk of memory seems cleaner. Agreed. Then again, how often do you need just a LWLock (or multiple LWLocks)? Surely you have a struct you want to protect with the lock. I guess having shmem hash table but no struct would be pretty common, though. - Heikki
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Tidy up #ifdef USE_INJECTION_POINTS guards
- 9480c585df6c 19 (unreleased) landed
-
Convert all remaining subsystems to use the new shmem allocation API
- 9b5acad3f40f 19 (unreleased) landed
-
Convert buffer manager to use the new shmem allocation functions
- a4b6139dcceb 19 (unreleased) landed
-
Add alignment option to ShmemRequestStruct()
- dacfe81a0de5 19 (unreleased) landed
-
Convert AIO to use the new shmem allocation functions
- 58a1573385ed 19 (unreleased) landed
-
Convert SLRUs to use the new shmem allocation functions
- 2e0943a8597e 19 (unreleased) landed
-
Refactor shmem initialization code in predicate.c
- 4c9eca5afea0 19 (unreleased) landed
-
Use the new shmem allocation functions in a few core subsystems
- c6d55714ba4c 19 (unreleased) landed
-
Convert lwlock.c to use the new shmem allocation functions
- a006bc7b1699 19 (unreleased) landed
-
Introduce a registry of built-in shmem subsystems
- 1fc2e9fbc0a3 19 (unreleased) landed
-
Convert pg_stat_statements to use the new shmem allocation functions
- d4885af3d653 19 (unreleased) landed
-
Add a test module to test after-startup shmem allocations
- 6409994c7dd8 19 (unreleased) landed
-
Introduce a new mechanism for registering shared memory areas
- 283e823f9dcb 19 (unreleased) landed
-
Move some code from shmem.c and shmem.h
- 6ef9bee29310 19 (unreleased) landed
-
Improve test_lwlock_tranches
- 92a685e4070d 19 (unreleased) landed
-
Test pg_stat_statements across crash restart
- 148fe2b05df5 19 (unreleased) landed
-
Refactor PredicateLockShmemInit to not reuse var for different things
- 3fd057772827 19 (unreleased) landed
-
Refactor ShmemIndex initialization
- 6b8238cb6aa7 19 (unreleased) landed
-
Add a new shmem_request_hook hook.
- 4f2400cb3f10 15.0 cited