]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Accommodate very large dshash tables.
authorNathan Bossart <nathan@postgresql.org>
Tue, 17 Dec 2024 21:24:45 +0000 (15:24 -0600)
committerNathan Bossart <nathan@postgresql.org>
Tue, 17 Dec 2024 21:24:45 +0000 (15:24 -0600)
If a dshash table grows very large (e.g., the dshash table for
cumulative statistics when there are millions of tables), resizing
it may fail with an error like:

ERROR: invalid DSA memory alloc request size 1073741824

To fix, permit dshash resizing to allocate more than 1 GB by
providing the DSA_ALLOC_HUGE flag.

Reported-by: Andreas Scherbaum
Author: Matthias van de Meent
Reviewed-by: Cédric Villemain, Michael Paquier, Andres Freund
Discussion: https://postgr.es/m/80a12d59-0d5e-4c54-866c-e69cd6536471%40pgug.de
Backpatch-through: 13

src/backend/lib/dshash.c

index c5c032a593b1c9489faba0d0af2b669ac8e9256c..83b611584dd61b423612f1306974633ee4ef44c2 100644 (file)
@@ -844,8 +844,10 @@ resize(dshash_table *hash_table, size_t new_size_log2)
        Assert(new_size_log2 == hash_table->control->size_log2 + 1);
 
        /* Allocate the space for the new table. */
-       new_buckets_shared = dsa_allocate0(hash_table->area,
-                                                                          sizeof(dsa_pointer) * new_size);
+       new_buckets_shared =
+               dsa_allocate_extended(hash_table->area,
+                                                         sizeof(dsa_pointer) * new_size,
+                                                         DSA_ALLOC_HUGE | DSA_ALLOC_ZERO);
        new_buckets = dsa_get_address(hash_table->area, new_buckets_shared);
 
        /*