diff options
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r-- | sql/set_var.cc | 156 |
1 files changed, 107 insertions, 49 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc index cb6c875d513..33dcd4b7e29 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -59,6 +59,9 @@ #include "ha_innodb.h" #endif +ulong dflt_key_buff_size; +uint dflt_key_cache_block_size; + static HASH system_variable_hash; const char *bool_type_names[]= { "OFF", "ON", NullS }; TYPELIB bool_typelib= @@ -88,7 +91,7 @@ static void fix_query_cache_size(THD *thd, enum_var_type type); static void fix_query_cache_min_res_unit(THD *thd, enum_var_type type); static void fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type); static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type); -static KEY_CACHE *create_key_cache(const char *name, uint length); +static KEY_CACHE_VAR *create_key_cache(const char *name, uint length); void fix_sql_mode_var(THD *thd, enum_var_type type); static byte *get_error_count(THD *thd); static byte *get_warning_count(THD *thd); @@ -137,6 +140,7 @@ sys_var_thd_ulong sys_interactive_timeout("interactive_timeout", sys_var_thd_ulong sys_join_buffer_size("join_buffer_size", &SV::join_buff_size); sys_var_key_buffer_size sys_key_buffer_size("key_buffer_size"); +sys_var_key_cache_block_size sys_key_cache_block_size("key_cache_block_size"); sys_var_bool_ptr sys_local_infile("local_infile", &opt_local_infile); sys_var_thd_bool sys_log_warnings("log_warnings", &SV::log_warnings); @@ -390,6 +394,7 @@ sys_var *sys_variables[]= &sys_interactive_timeout, &sys_join_buffer_size, &sys_key_buffer_size, + &sys_key_cache_block_size, &sys_last_insert_id, &sys_local_infile, &sys_log_binlog, @@ -547,6 +552,8 @@ struct show_var_st init_vars[]= { {sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS}, {sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS}, {sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS}, + {sys_key_cache_block_size.name, (char*) &sys_key_cache_block_size, + SHOW_SYS}, {"language", language, SHOW_CHAR}, {"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, {sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS}, @@ -1412,70 +1419,93 @@ void sys_var_collation_connection::set_default(THD *thd, enum_var_type type) } +static LEX_STRING default_key_cache_base= {(char *) DEFAULT_KEY_CACHE_NAME, 7}; + +static KEY_CACHE_VAR zero_key_cache= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +static KEY_CACHE_VAR *get_key_cache(LEX_STRING *cache_name) +{ + if (!cache_name || !cache_name->str || !cache_name->length || + cache_name->str == default_key_cache_base.str || + (cache_name->length == default_key_cache_base.length && + !memcmp(cache_name->str, default_key_cache_base.str, + default_key_cache_base.length))) + cache_name= &default_key_cache_base; + return ((KEY_CACHE_VAR*) find_named(&key_caches, + cache_name->str, cache_name->length)); +} + +byte *sys_var_key_cache_param::value_ptr(THD *thd, enum_var_type type, + LEX_STRING *base) +{ + KEY_CACHE_VAR *key_cache= get_key_cache(base); + if (!key_cache) + key_cache= &zero_key_cache; + return (byte*) key_cache + offset ; +} + bool sys_var_key_buffer_size::update(THD *thd, set_var *var) { + int rc; ulonglong tmp= var->value->val_int(); + if (!base_name.length) - { - base_name.str= (char*) "default"; - base_name.length= 7; - } - KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, base_name.str, - base_name.length); + base_name= default_key_cache_base; + KEY_CACHE_VAR *key_cache= get_key_cache(&base_name); + if (!key_cache) { if (!tmp) // Tried to delete cache return 0; // Ok, nothing to do + if (!(key_cache= create_key_cache(base_name.str, base_name.length))) return 1; } if (!tmp) { + if (!key_cache->cache) + return 0; /* Delete not default key caches */ - if (base_name.length != 7 || memcpy(base_name.str, "default", 7)) + if (key_cache != &dflt_key_cache_var) { /* - QQ: Here we should move tables using this key cache to default - key cache + Move tables using this key cache to the default key cache + and remove this key cache if no tables are assigned to it */ - delete key_cache; - return 0; + return (reassign_keycache_tables(thd, key_cache, + default_key_cache_base.str, 1)); } + return 0; } - key_cache->size= (ulonglong) getopt_ull_limit_value(tmp, option_limits); + key_cache->buff_size= (ulonglong) getopt_ull_limit_value(tmp, option_limits); - /* QQ: Needs to be updated when we have multiple key caches */ - keybuff_size= key_cache->size; - ha_resize_key_cache(); - return 0; + if (!key_cache->cache) + return (bool)(ha_key_cache(key_cache)); + else + return (bool)(ha_resize_key_cache(key_cache)); } -static ulonglong zero=0; - -byte *sys_var_key_buffer_size::value_ptr(THD *thd, enum_var_type type, - LEX_STRING *base) +bool sys_var_key_cache_block_size::update(THD *thd, set_var *var) { - const char *name; - uint length; + ulong tmp= var->value->val_int(); - if (!base->str) - { - name= "default"; - length= 7; - } - else - { - name= base->str; - length= base->length; - } - KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, name, length); - if (!key_cache) - return (byte*) &zero; - return (byte*) &key_cache->size; + if (!base_name.length) + base_name= default_key_cache_base; + KEY_CACHE_VAR *key_cache= get_key_cache(&base_name); + + if (!key_cache && !(key_cache= create_key_cache(base_name.str, + base_name.length))) + return 1; + + key_cache->block_size= (ulong) getopt_ull_limit_value(tmp, option_limits); + + if (key_cache->cache) + /* Do not build a new key cache here */ + return (bool) (ha_resize_key_cache(key_cache)); + return 0; } - /***************************************************************************** @@ -2062,27 +2092,40 @@ void delete_elements(I_List<NAMED_LIST> *list, void (*free_element)(gptr)) /* Key cache functions */ -static KEY_CACHE *create_key_cache(const char *name, uint length) +static KEY_CACHE_VAR *create_key_cache(const char *name, uint length) { - KEY_CACHE *key_cache; + KEY_CACHE_VAR *key_cache; DBUG_PRINT("info",("Creating key cache: %s", name)); - if ((key_cache= (KEY_CACHE*) my_malloc(sizeof(KEY_CACHE), - MYF(MY_ZEROFILL | MY_WME)))) + if (length != default_key_cache_base.length || + memcmp(name, default_key_cache_base.str, length)) { - if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache)) + if ((key_cache= (KEY_CACHE_VAR*) my_malloc(sizeof(KEY_CACHE_VAR), + MYF(MY_ZEROFILL | MY_WME)))) { - my_free((char*) key_cache, MYF(0)); - key_cache= 0; + if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache)) + { + my_free((char*) key_cache, MYF(0)); + key_cache= 0; + } } } + else + { + key_cache= &dflt_key_cache_var; + if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache)) + key_cache= 0; + } + return key_cache; } -KEY_CACHE *get_or_create_key_cache(const char *name, uint length) +KEY_CACHE_VAR *get_or_create_key_cache(const char *name, uint length) { - KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, name, - length); + LEX_STRING key_cache_name; + key_cache_name.str= (char *) name; + key_cache_name.length= length; + KEY_CACHE_VAR *key_cache= get_key_cache(&key_cache_name); if (!key_cache) key_cache= create_key_cache(name, length); return key_cache; @@ -2091,7 +2134,22 @@ KEY_CACHE *get_or_create_key_cache(const char *name, uint length) void free_key_cache(gptr key_cache) { - my_free(key_cache, MYF(0)); + if (key_cache != (gptr) &dflt_key_cache_var) + my_free(key_cache, MYF(0)); +} + +bool process_key_caches(int (* func) (KEY_CACHE_VAR *)) +{ + + I_List_iterator<NAMED_LIST> it(key_caches); + NAMED_LIST *element; + while ((element= it++)) + { + KEY_CACHE_VAR *key_cache= (KEY_CACHE_VAR *) element->data; + if (key_cache != &dflt_key_cache_var) + func(key_cache); + } + return 0; } |