From aab58d33137d4f4f45f77c2738739ba69884b2c8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Mar 2008 10:45:36 +0100 Subject: Bug#25175 Too much memory used by MySQL grant system Each time the server reloads privileges containing table grants, the system will allocate too much memory than needed because of badly chosen growth prediction in the underlying dynamic arrays. This patch introduces a new signature to the hash container initializer which enables a much more pessimistic approach in favour for more efficient memory useage. This patch was supplied by Google Inc. include/hash.h: * New signature for _hash_init. * Defined new function hash_init2 which takes growth_size argument. mysys/hash.c: * New signature for _hash_init. sql/sql_acl.cc: * Changed hash_init signature so that it takes a 'growth_size' smaller than the default. Each time a GRANT_TABLE is allocated a pre-allocated dynamic array is instantiated. A large growth size can result in too many unused hash-entries per table-entry and thus be a waste of free memory. --- mysys/hash.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'mysys/hash.c') diff --git a/mysys/hash.c b/mysys/hash.c index 4532b06b533..9166ae6f788 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -46,7 +46,7 @@ static uint calc_hash(const HASH *hash, const uchar *key, size_t length) } my_bool -_hash_init(HASH *hash,CHARSET_INFO *charset, +_hash_init(HASH *hash,uint growth_size, CHARSET_INFO *charset, ulong size, size_t key_offset, size_t key_length, hash_get_key get_key, void (*free_element)(void*),uint flags CALLER_INFO_PROTO) @@ -55,7 +55,8 @@ _hash_init(HASH *hash,CHARSET_INFO *charset, DBUG_PRINT("enter",("hash: 0x%lx size: %u", (long) hash, (uint) size)); hash->records=0; - if (my_init_dynamic_array_ci(&hash->array,sizeof(HASH_LINK),size,0)) + if (my_init_dynamic_array_ci(&hash->array, sizeof(HASH_LINK), size, + growth_size)) { hash->free=0; /* Allow call to hash_free */ DBUG_RETURN(1); -- cgit v1.2.1