Kristofer, hello.
The patch is approved here.
Couple of suggestions were discussed on #rep.
Thanks for making it!
regards,
Andrei
> Below is the list of changes that have just been committed into a local
> 5.0 repository of thek. When thek does a push these changes
> will be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
>
> ChangeSet@stripped, 2008-03-17 15:32:18+01:00, thek@adventure.(none) +5 -0
> Bug#30087 Set query_cache_size, if the value is too small, get a unclear warning
>
> This bugs clarifies a warning message issued when the query cache data
> size becomes smaller than the minium allowed size.
>
> mysql-test/r/query_cache.result@stripped, 2008-03-17 15:32:17+01:00,
> thek@adventure.(none) +4 -4
> New warning message when a too small value has been set for query cache
> size.
>
> sql/set_var.cc@stripped, 2008-03-17 15:32:17+01:00, thek@adventure.(none) +1 -6
> To avoid poluting the QC API the warning messages are moved into the
> QC module.
>
> sql/share/errmsg.txt@stripped, 2008-03-17 15:32:17+01:00, thek@adventure.(none) +11 -7
> Changed error message so that minimal cache size always is hinted.
>
> sql/sql_cache.cc@stripped, 2008-03-17 15:32:17+01:00, thek@adventure.(none) +29 -0
> Modified the warning message so that the minimal cache size always is
> hinted.
>
> Added interface method Query_cache::get_minimal_size_limit().
>
> sql/sql_cache.h@stripped, 2008-03-17 15:32:17+01:00, thek@adventure.(none) +2 -0
> Modified the warning message so that the minimal cache size always is
> hinted.
>
> Added interface method Query_cache::get_minimal_size_limit().
>
> diff -Nrup a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result
> --- a/mysql-test/r/query_cache.result 2007-08-21 17:47:03 +02:00
> +++ b/mysql-test/r/query_cache.result 2008-03-17 15:32:17 +01:00
> @@ -564,7 +564,7 @@ select * from t1;
> a
> set GLOBAL query_cache_size=1024;
> Warnings:
> -Warning 1282 Query cache failed to set size 1024; new query cache size is 0
> +Warning 1282 Query cache failed to set size 1024 (minimal value: 41297); new query
> cache size is 0
> show global variables like "query_cache_size";
> Variable_name Value
> query_cache_size 0
> @@ -572,7 +572,7 @@ select * from t1;
> a
> set GLOBAL query_cache_size=10240;
> Warnings:
> -Warning 1282 Query cache failed to set size 10240; new query cache size is 0
> +Warning 1282 Query cache failed to set size 10240 (minimal value: 41297); new query
> cache size is 0
> show global variables like "query_cache_size";
> Variable_name Value
> query_cache_size 0
> @@ -580,7 +580,7 @@ select * from t1;
> a
> set GLOBAL query_cache_size=20480;
> Warnings:
> -Warning 1282 Query cache failed to set size 20480; new query cache size is 0
> +Warning 1282 Query cache failed to set size 20480 (minimal value: 41297); new query
> cache size is 0
> show global variables like "query_cache_size";
> Variable_name Value
> query_cache_size 0
> @@ -588,7 +588,7 @@ select * from t1;
> a
> set GLOBAL query_cache_size=40960;
> Warnings:
> -Warning 1282 Query cache failed to set size 40960; new query cache size is 0
> +Warning 1282 Query cache failed to set size 40960 (minimal value: 41297); new query
> cache size is 0
> show global variables like "query_cache_size";
> Variable_name Value
> query_cache_size 0
> diff -Nrup a/sql/set_var.cc b/sql/set_var.cc
> --- a/sql/set_var.cc 2008-01-10 12:01:24 +01:00
> +++ b/sql/set_var.cc 2008-03-17 15:32:17 +01:00
> @@ -1343,12 +1343,7 @@ static void fix_net_retry_count(THD *thd
> static void fix_query_cache_size(THD *thd, enum_var_type type)
> {
> #ifdef HAVE_QUERY_CACHE
> - ulong requested= query_cache_size;
> - query_cache.resize(query_cache_size);
> - if (requested != query_cache_size)
> - push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
> - ER_WARN_QC_RESIZE, ER(ER_WARN_QC_RESIZE),
> - requested, query_cache_size);
> + query_cache_size= query_cache.resize(query_cache_size);
> #endif
> }
>
> diff -Nrup a/sql/share/errmsg.txt b/sql/share/errmsg.txt
> --- a/sql/share/errmsg.txt 2007-10-23 13:15:27 +02:00
> +++ b/sql/share/errmsg.txt 2008-03-17 15:32:17 +01:00
> @@ -4992,13 +4992,13 @@ ER_WRONG_NAME_FOR_CATALOG 42000
> spa "Nombre de catalog incorrecto '%-.100s'"
> swe "Felaktigt katalog namn '%-.100s'"
> ER_WARN_QC_RESIZE
> - eng "Query cache failed to set size %lu; new query cache size is %lu"
> - ger "дnderung der Query-Cache-GrЖъe auf %lu fehlgeschlagen; neue
> Query-Cache-GrЖъe ist %lu"
> - por "Falha em Query cache para configurar tamanho %lu, novo tamanho de query cache
> И %lu"
> - rus "Кеш запросов не может установить размер %lu,
> новый размер кеша зпросов - %lu"
> - spa "Query cache fallada para configurar tamaЯo %lu, nuevo tamaЯo de query cache
> es %lu"
> - swe "Storleken av "Query cache" kunde inte sДttas till %lu, ny storlek Дr %lu"
> - ukr "Кеш запит╕в неспроможен встановити
> розм╕р %lu, новий розм╕р кеша запит╕в - %lu"
> + eng "Query cache failed to set size %lu (minimal value: %lu); new query cache size
> is %lu"
> + ger "дnderung der Query-Cache-GrЖъe auf %lu (Minimale Zahl: %lu) fehlgeschlagen;
> neue Query-Cache-GrЖъe ist %lu"
> + por "Falha em Query cache para configurar tamanho %lu (NЗmero mМnimo: %lu), novo
> tamanho de query cache И %lu"
> + rus "Кеш запросов не может установить размер %lu
> (minimal value: %lu), новый размер кеша зпросов - %lu"
> + spa "Query cache fallada para configurar tamaЯo %lu (NЗmero mМnimo: %lu), nuevo
> tamaЯo de query cache es %lu"
> + swe "Storleken av "Query cache" kunde inte sДttas till %lu (minsta vДrde: %lu);
> ny storlek Дr %lu"
> + ukr "Кеш запит╕в неспроможен встановити
> розм╕р %lu (minimal value: %lu), новий розм╕р кеша запит╕в
> - %lu"
> ER_BAD_FT_COLUMN
> eng "Column '%-.64s' cannot be part of FULLTEXT index"
> ger "Feld '%-.64s' kann nicht Teil eines FULLTEXT-Index sein"
> @@ -5641,3 +5641,7 @@ ER_NAME_BECOMES_EMPTY
> eng "Name '%-.64s' has become ''"
> ER_AMBIGUOUS_FIELD_TERM
> eng "First character of the FIELDS TERMINATED string is ambiguous; please use
> non-optional and non-empty FIELDS ENCLOSED BY"
> +ER_WARN_QC_RESIZE2
> + eng "Cache size %lu is too small to be efficient; minimal value is %lu. New size is
> %lu"
> + swe "Cache-storleken %lu Дr fЖr liten fЖr att vara effektiv; minsta vДrdet Дr
> %lu. Ny storlek Дr %lu"
> +
> diff -Nrup a/sql/sql_cache.cc b/sql/sql_cache.cc
> --- a/sql/sql_cache.cc 2007-10-01 12:44:28 +02:00
> +++ b/sql/sql_cache.cc 2008-03-17 15:32:17 +01:00
> @@ -816,6 +816,16 @@ ulong Query_cache::resize(ulong query_ca
> free_cache();
> query_cache_size= query_cache_size_arg;
> ::query_cache_size= init_cache();
> +
> + if (::query_cache_size != query_cache_size_arg)
> + {
> + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
> + ER_WARN_QC_RESIZE, ER(ER_WARN_QC_RESIZE),
> + query_cache_size_arg,
> + get_minimal_size_limit(),
> + ::query_cache_size);
> + }
> +
> STRUCT_UNLOCK(&structure_guard_mutex);
> DBUG_RETURN(::query_cache_size);
> }
> @@ -1613,6 +1623,25 @@ void Query_cache::init()
> DBUG_VOID_RETURN;
> }
>
> +
> +/**
> + Return the lowest possible query cache size.
> +*/
> +
> +ulong Query_cache::get_minimal_size_limit()
> +{
> + ulong approx_additional_data_size= (sizeof(Query_cache) +
> + sizeof(gptr)*(def_query_hash_size+
> + def_table_hash_size));
> +
> + ulong data_size= (min_allocation_unit << QUERY_CACHE_MEM_BIN_STEP_PWR2
> <<
> + QUERY_CACHE_MEM_BIN_FIRST_STEP_PWR2) +
> + ALIGN_SIZE(1) - 1 +
> + (1 << QUERY_CACHE_MEM_BIN_STEP_PWR2) - 1 +
> + (1 << QUERY_CACHE_MEM_BIN_FIRST_STEP_PWR2) - 1;
> +
> + return(data_size + approx_additional_data_size);
> +}
>
> ulong Query_cache::init_cache()
> {
> diff -Nrup a/sql/sql_cache.h b/sql/sql_cache.h
> --- a/sql/sql_cache.h 2007-08-17 16:55:19 +02:00
> +++ b/sql/sql_cache.h 2008-03-17 15:32:17 +01:00
> @@ -245,6 +245,8 @@ private:
>
> void free_query_internal(Query_cache_block *point);
>
> + ulong get_minimal_size_limit();
> +
> protected:
> /*
> The following mutex is locked when searching or changing global
>