Hi Kristofer,
kpettersson@stripped wrote:
> ChangeSet@stripped, 2007-10-25 14:16:24+02:00, thek@adventure.(none) +1 -0
> Bug#31347 Increase in memory usage after many DROP USER statements
>
> Dropping users causes huge increase in memory usage because field values were
> allocated on the server memory root for temporary usage but never deallocated.
>
> This patch changes the target memory root to be that of the thread handler
> instead since this root is cleared between each statement.
>
> sql/sql_acl.cc@stripped, 2007-10-25 14:16:22+02:00, thek@adventure.(none) +7 -5
> Changed memory root from server life time memory to thread life time memory.
>
> diff -Nrup a/sql/sql_acl.cc b/sql/sql_acl.cc
> --- a/sql/sql_acl.cc 2007-09-20 18:10:34 +02:00
> +++ b/sql/sql_acl.cc 2007-10-25 14:16:22 +02:00
> @@ -4865,6 +4865,7 @@ static int handle_grant_table(TABLE_LIST
> byte user_key[MAX_KEY_LENGTH];
> uint key_prefix_length;
> DBUG_ENTER("handle_grant_table");
> + THD *thd= current_thd;
>
> if (! table_no) // mysql.user table
> {
> @@ -4932,17 +4933,18 @@ static int handle_grant_table(TABLE_LIST
> DBUG_PRINT("info",("scan error: %d", error));
> continue;
> }
> - if (! (host= get_field(&mem, host_field)))
> + if (! (host= get_field(thd->mem_root, host_field)))
> host= "";
> - if (! (user= get_field(&mem, user_field)))
> + if (! (user= get_field(thd->mem_root, user_field)))
> user= "";
>
> #ifdef EXTRA_DEBUG
> DBUG_PRINT("loop",("scan fields: '%s'@'%s' '%s' '%s' '%s'",
> user, host,
> - get_field(&mem, table->field[1]) /*db*/,
> - get_field(&mem, table->field[3]) /*table*/,
> - get_field(&mem, table->field[4]) /*column*/));
> + get_field(thd->mem_root, table->field[1]) /*db*/,
> + get_field(thd->mem_root, table->field[3])
> /*table*/,
> + get_field(thd->mem_root,
> + table->field[4]) /*column*/));
> #endif
> if (strcmp(user_str, user) ||
> my_strcasecmp(system_charset_info, host_str, host))
>
OK to push, I just have a minor comment:
I think there are other places where you could change to the memory root
of the thread handler:
const char *password= get_field(&mem, table->field[2]);
char *ssl_type=get_field(&mem, table->field[next_field++]);
char *ptr = get_field(&mem, table->field[next_field++]);
user.user_resource.questions=ptr ? atoi(ptr) : 0;
ptr = get_field(&mem, table->field[next_field++]);
user.user_resource.updates=ptr ? atoi(ptr) : 0;
ptr = get_field(&mem, table->field[next_field++]);
user.user_resource.conn_per_hour= ptr ? atoi(ptr) : 0;
Regards,
--
Davi Arnaut, Software Engineer
MySQL Inc, www.mysql.com
Are you MySQL certified? www.mysql.com/certification