Thread
-
Return DSA area for hash table from GetNamedDSHash()
Sami Imseih <samimseih@gmail.com> — 2026-04-06T22:56:21Z
Hi, While working on extending tests for dshash.c [1], I realized that a user that creates a hash table with GetNamedDSHash() has no way to cap the size of the dsa area underpinning the table by using dsa_set_size_limit(). This is because the dsa_area created using this API is not exposed to the user. This is a gap for users of the GetNamedDSHash() API, because it's very likely that the callers don't want runaway growth of these hash tables. Attached is a new API, dshash_get_dsa_area() that takes in a dshash_table and returns the area. The caller can then use dsa_set_size_limit() to limit the size. We could change the GetNamedDSHash() API to take in a size, but that will not be ideal since a caller may want to change the size dynamically after the hash table is created. I don't have a patch for this yet, but I also think it will make sense for pg_dsm_registry_allocations to also show the max_size postgres=# select * from pg_dsm_registry_allocations; name | type | size ------------------------+---------+--------- test_dsm_registry_dsa | area | 1048576 test_dsm_registry_hash | hash | 1048576 test_dsm_registry_dsm | segment | 20 (3 rows) Thoughts? [1] [https://www.postgresql.org/message-id/acXCJODjsCytdpwT%40paquier.xyz] -- Sami Imseih Amazon Web Services (AWS) -
Re: Return DSA area for hash table from GetNamedDSHash()
jie wang <jugierwang@gmail.com> — 2026-04-07T03:59:14Z
Sami Imseih <samimseih@gmail.com> 于2026年4月7日周二 06:56写道: > Hi, > > While working on extending tests for dshash.c [1], I realized that a > user that creates a hash table with GetNamedDSHash() has no way > to cap the size of the dsa area underpinning the table by using > dsa_set_size_limit(). This is because the dsa_area created using > this API is not exposed to the user. > > This is a gap for users of the GetNamedDSHash() API, > because it's very likely that the callers don't want runaway growth of > these hash tables. > > Attached is a new API, dshash_get_dsa_area() that takes in a dshash_table > and returns the area. The caller can then use dsa_set_size_limit() to limit > the size. > > We could change the GetNamedDSHash() API to take in a size, but that > will not be ideal since a caller may want to change the size dynamically > after > the hash table is created. > > I don't have a patch for this yet, but I also think it will make sense for > pg_dsm_registry_allocations to also show the max_size > > postgres=# select * from pg_dsm_registry_allocations; > name | type | size > ------------------------+---------+--------- > test_dsm_registry_dsa | area | 1048576 > test_dsm_registry_hash | hash | 1048576 > test_dsm_registry_dsm | segment | 20 > (3 rows) > > Thoughts? > > > [1] [https://www.postgresql.org/message-id/acXCJODjsCytdpwT%40paquier.xyz] > > -- > Sami Imseih > Amazon Web Services (AWS) > Hi, I think an assert check could be added in this patch for better safety. Assert(hash_table != NULL); Best regards, -- wang jie
-
Re: Return DSA area for hash table from GetNamedDSHash()
Michael Paquier <michael@paquier.xyz> — 2026-04-08T01:08:46Z
On Mon, Apr 06, 2026 at 05:56:21PM -0500, Sami Imseih wrote: > Attached is a new API, dshash_get_dsa_area() that takes in a dshash_table > and returns the area. The caller can then use dsa_set_size_limit() to limit > the size. +dsa_area * +dshash_get_dsa_area(dshash_table *hash_table) +{ + Assert(hash_table->control->magic == DSHASH_MAGIC); + + return hash_table->area; Rather than an API that returns the DSA area, perhaps it would be more natural to have a wrapper that calls dsa_set_size_limit(), using an existing dshash_table in input? -- Michael -
Re: Return DSA area for hash table from GetNamedDSHash()
Sami Imseih <samimseih@gmail.com> — 2026-04-09T21:11:48Z
Thanks for the replies! > I think an assert check could be added in this patch for better safety. > Assert(hash_table != NULL); > I followed the same approach we take for dshash_destroy() and dshash_get_hash_table_handle(). The caller is responsible for not passing in a NULL hash table, else that assert will segfault. > +dsa_area * > +dshash_get_dsa_area(dshash_table *hash_table) > +{ > + Assert(hash_table->control->magic == DSHASH_MAGIC); > + > + return hash_table->area; > > Rather than an API that returns the DSA area, perhaps it would be more > natural to have a wrapper that calls dsa_set_size_limit(), using an > existing dshash_table in input? hm, having GetNamedDSA return dsa_area for direct use while requiring a special wrapper for the dshash case creates an inconsistent API in dsm_registry.h. dshash_get_dsa_area() means either way the dsa_area is obtained, dsa_set_size_limit() can be used to set the size. -- Sami