Hi Kristofer,
OK to push. Thanks!
kpettersson@stripped wrote:
> ChangeSet@stripped, 2007-10-31 12:25:18+01: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-31 12:25:17+01:00, thek@adventure.(none) +13 -11
> 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-31 12:25:17 +01:00
> @@ -311,7 +311,7 @@ static my_bool acl_load(THD *thd, TABLE_
> continue;
> }
>
> - const char *password= get_field(&mem, table->field[2]);
> + const char *password= get_field(thd->mem_root, table->field[2]);
> uint password_len= password ? strlen(password) : 0;
> set_user_salt(&user, password, password_len);
> if (user.salt_len == 0 && password_len != 0)
> @@ -364,7 +364,7 @@ static my_bool acl_load(THD *thd, TABLE_
> /* Starting from 4.0.2 we have more fields */
> if (table->s->fields >= 31)
> {
> - char *ssl_type=get_field(&mem, table->field[next_field++]);
> + char *ssl_type=get_field(thd->mem_root, table->field[next_field++]);
> if (!ssl_type)
> user.ssl_type=SSL_TYPE_NONE;
> else if (!strcmp(ssl_type, "ANY"))
> @@ -378,11 +378,11 @@ static my_bool acl_load(THD *thd, TABLE_
> user.x509_issuer= get_field(&mem, table->field[next_field++]);
> user.x509_subject= get_field(&mem, table->field[next_field++]);
>
> - char *ptr = get_field(&mem, table->field[next_field++]);
> + char *ptr = get_field(thd->mem_root, table->field[next_field++]);
> user.user_resource.questions=ptr ? atoi(ptr) : 0;
> - ptr = get_field(&mem, table->field[next_field++]);
> + ptr = get_field(thd->mem_root, table->field[next_field++]);
> user.user_resource.updates=ptr ? atoi(ptr) : 0;
> - ptr = get_field(&mem, table->field[next_field++]);
> + ptr = get_field(thd->mem_root, table->field[next_field++]);
> user.user_resource.conn_per_hour= ptr ? atoi(ptr) : 0;
> if (user.user_resource.questions || user.user_resource.updates ||
> user.user_resource.conn_per_hour)
> @@ -391,7 +391,7 @@ static my_bool acl_load(THD *thd, TABLE_
> if (table->s->fields >= 36)
> {
> /* Starting from 5.0.3 we have max_user_connections field */
> - ptr= get_field(&mem, table->field[next_field++]);
> + ptr= get_field(thd->mem_root, table->field[next_field++]);
> user.user_resource.user_conn= ptr ? atoi(ptr) : 0;
> }
> else
> @@ -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))
>
--
Davi Arnaut, Software Engineer
MySQL Inc, www.mysql.com
Are you MySQL certified? www.mysql.com/certification