Re: Better shared data structure management and resizable shared data structures
Heikki Linnakangas <hlinnaka@iki.fi>
Attachments
- 0001-refactor-Move-ShmemInitHash-to-separate-file.patch (text/x-patch) patch 0001
- 0002-Introduce-a-new-mechanism-for-registering-shared-mem.patch (text/x-patch) patch 0002
- 0003-Add-test-module-to-test-after-startup-shmem-allocati.patch (text/x-patch) patch 0003
- 0004-Convert-pg_stat_statements-to-use-the-new-interface.patch (text/x-patch) patch 0004
- 0005-Introduce-registry-of-built-in-subsystems.patch (text/x-patch) patch 0005
- 0006-Convert-lwlock.c-to-use-the-new-interface.patch (text/x-patch) patch 0006
- 0007-Use-the-new-mechanism-in-a-few-core-subsystems.patch (text/x-patch) patch 0007
- 0008-refactor-predicate.c-inline-SerialInit-to-the-caller.patch (text/x-patch) patch 0008
- 0009-refactor-predicate.c-Move-all-the-initialization-tog.patch (text/x-patch) patch 0009
- 0010-Convert-SLRUs-to-use-the-new-interface.patch (text/x-patch) patch 0010
- 0011-Convert-AIO-to-the-new-interface.patch (text/x-patch) patch 0011
- 0012-Add-option-for-aligning-shmem-allocations.patch (text/x-patch) patch 0012
- 0013-Convert-buffer-manager-to-the-new-API.patch (text/x-patch) patch 0013
- 0014-Convert-all-remaining-subsystems-to-use-the-new-API.patch (text/x-patch) patch 0014
On 02/04/2026 09:58, Ashutosh Bapat wrote: > On Wed, Apr 1, 2026 at 11:47 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote: >>> + /* >>> + * Extra space to reserve in the shared memory segment, but it's not part >>> + * of the struct itself. This is used for shared memory hash tables that >>> + * can grow beyond the initial size when more buckets are allocated. >>> + */ >>> + size_t extra_size; >>> >>> When we introduce resizable structures (where even the hash table >>> directly itself could be resizable), we will introduce a new field >>> max_size which is easy to get confused with extra_size. Maybe we can >>> rename extra_size to something like "auxilliary_size" to mean size of >>> the auxiliary parts of the structure which are not part of the main >>> struct itself. >>> >>> + /* >>> + * max_size is the estimated maximum number of hashtable entries. This is >>> + * not a hard limit, but the access efficiency will degrade if it is >>> + * exceeded substantially (since it's used to compute directory size and >>> + * the hash table buckets will get overfull). >>> + */ >>> + size_t max_size; >>> + >>> + /* >>> + * init_size is the number of hashtable entries to preallocate. For a >>> + * table whose maximum size is certain, this should be equal to max_size; >>> + * that ensures that no run-time out-of-shared-memory failures can occur. >>> + */ >>> + size_t init_size; >>> >>> Everytime I look at these two fields, I question whether those are the >>> number of entries (i.e. size of the hash table) or number of bytes >>> (size of the memory). I know it's the former, but it indicates that >>> something needs to be changed here, like changing the names to have >>> _entries instead of _size, or changing the type to int64 or some such. >>> Renaming to _entries would conflict with dynahash APIs since they use >>> _size, so maybe the latter? >> >> I hear you, but I didn't change these yet. If we go with the patches >> from the "Shared hash table allocations" thread, max_size and init_size >> will be merged into one. I'll try to settle that thread before making >> changes here. > > Will review those patches next. Those are now committed, and here's a new version rebased over those changes. The hash options is now called 'nelems', and the 'extra_size' in ShmemStructOpts is gone. Plus a bunch of other fixes and cleanups. I also reordered and re-grouped the patches a little, into more logical increments I hope. - 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