From 1e9de1bb9590f93dfcba0f9e428c660d99e700ff Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Jul 2003 12:30:49 -0700 Subject: mi_keycache.c: new file Many files: Added CACHE INDEX command sql/ha_myisam.cc: Added CACHE INDEX command sql/handler.cc: Added CACHE INDEX command sql/sql_lex.cc: Added CACHE INDEX command sql/sql_parse.cc: Added CACHE INDEX command sql/sql_table.cc: Added CACHE INDEX command sql/ha_myisam.h: Added CACHE INDEX command sql/handler.h: Added CACHE INDEX command sql/mysql_priv.h: Added CACHE INDEX command sql/sql_lex.h: Added CACHE INDEX command sql/sql_yacc.yy: Added CACHE INDEX command --- sql/ha_myisam.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'sql/ha_myisam.cc') diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 4f1021232a4..4ca11fe0da5 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -688,6 +688,64 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize) } +/* + Assign table indexes to a key cache. +*/ + +int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) +{ + int error; + const char *errmsg; + ulonglong map= ~(ulonglong) 0; + TABLE_LIST *table_list= table->pos_in_table_list; + char *keycache_name= table_list->option; + + DBUG_ENTER("ha_myisam::assign_to_keycache"); + + /* Check validity of the index references */ + if (table_list->use_index) + { + key_map kmap= get_key_map_from_key_list(table, table_list->use_index); + if (kmap == ~(key_map) 0) + { + errmsg= thd->net.last_error; + error= HA_ADMIN_FAILED; + goto err; + } + if (kmap) + map= kmap; + } + + if ((error= mi_assign_to_keycache(file, map, keycache_name))) + { + switch (error) { + default: + char buf[ERRMSGSIZE+20]; + my_snprintf(buf, ERRMSGSIZE, + "Failed to read from index file (errno: %d)", my_errno); + errmsg= buf; + } + error= HA_ADMIN_FAILED; + goto err; + } + + DBUG_RETURN(HA_ADMIN_OK); + + err: + { + MI_CHECK param; + myisamchk_init(¶m); + param.thd= thd; + param.op_name= (char*)"assign_to_keycache"; + param.db_name= table->table_cache_key; + param.table_name= table->table_name; + param.testflag= 0; + mi_check_print_error(¶m, errmsg); + DBUG_RETURN(error); + } +} + + /* Preload pages of the index file for a table into the key cache. */ -- cgit v1.2.1 From 6ef96ae3be39517d3267e5230631994939dd74aa Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 2 Aug 2003 02:43:18 -0700 Subject: Many files: Added key cache assignment mi_locking.c: Added key cache assignment: correction my_sys.h: Added key cache variable structure include/my_sys.h: Added key cache variable structure include/my_base.h: Added key cache assignment include/myisam.h: Added key cache assignment include/my_global.h: Added key cache assignment isam/_page.c: Added key cache assignment isam/close.c: Added key cache assignment isam/isamchk.c: Added key cache assignment isam/isamlog.c: Added key cache assignment isam/panic.c: Added key cache assignment isam/_locking.c: Added key cache assignment isam/test2.c: Added key cache assignment isam/test3.c: Added key cache assignment myisam/myisamdef.h: Added key cache assignment myisam/mi_check.c: Added key cache assignment myisam/mi_close.c: Added key cache assignment myisam/mi_extra.c: Added key cache assignment myisam/mi_page.c: Added key cache assignment myisam/mi_panic.c: Added key cache assignment myisam/mi_preload.c: Added key cache assignment myisam/mi_test1.c: Added key cache assignment myisam/mi_test2.c: Added key cache assignment myisam/mi_test3.c: Added key cache assignment myisam/myisamchk.c: Added key cache assignment myisam/myisamlog.c: Added key cache assignment myisam/mi_delete_all.c: Added key cache assignment myisam/mi_locking.c: Added key cache assignment: correction myisam/mi_keycache.c: Added key cache assignment sql/handler.h: Added key cache assignment sql/mysql_priv.h: Added key cache assignment sql/set_var.h: Added key cache assignment sql/table.h: Added key cache assignment sql/ha_myisam.cc: Added key cache assignment sql/ha_myisammrg.cc: Added key cache assignment sql/handler.cc: Added key cache assignment sql/mysqld.cc: Added key cache assignment sql/set_var.cc: Added key cache assignment sql/sql_base.cc: Added key cache assignment sql/sql_table.cc: Added key cache assignment sql/sql_test.cc: Added key cache assignment sql/sql_yacc.yy: Added key cache assignment mysys/mf_keycache.c: Added key cache assignment mysql-test/t/key_cache.test: Added key cache assignment mysql-test/r/key_cache.result: Added key cache assignment --- sql/ha_myisam.cc | 97 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 12 deletions(-) (limited to 'sql/ha_myisam.cc') diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 4ca11fe0da5..85d5236a18f 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -228,6 +228,12 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) { if (!(file=mi_open(name, mode, test_if_locked))) return (my_errno ? my_errno : -1); + + /* Synchronize key cache assignment of the handler */ + KEY_CACHE_VAR *key_cache= table->key_cache ? table->key_cache : + &dflt_key_cache_var; + VOID(mi_extra(file, HA_EXTRA_SET_KEY_CACHE, + (void*) &key_cache->cache)); if (test_if_locked & (HA_OPEN_IGNORE_IF_LOCKED | HA_OPEN_TMP_TABLE)) VOID(mi_extra(file, HA_EXTRA_NO_WAIT_LOCK, 0)); @@ -694,16 +700,27 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize) int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) { - int error; - const char *errmsg; + uint len; + KEY_CACHE_VAR *old_key_cache; + KEY_CACHE_VAR *new_key_cache; + const char *errmsg=0; + int error= HA_ADMIN_OK; ulonglong map= ~(ulonglong) 0; TABLE_LIST *table_list= table->pos_in_table_list; - char *keycache_name= table_list->option; - + const char *new_key_cache_name= table_list->option ? + (const char *) table_list->option : + DEFAULT_KEY_CACHE_NAME; + KEY_CACHE_ASMT *key_cache_asmt= table->key_cache_asmt; + bool triggered= key_cache_asmt->triggered; + DBUG_ENTER("ha_myisam::assign_to_keycache"); + VOID(pthread_mutex_lock(&LOCK_assign)); + + old_key_cache= key_cache_asmt->key_cache; + /* Check validity of the index references */ - if (table_list->use_index) + if (!triggered && table_list->use_index) { key_map kmap= get_key_map_from_key_list(table, table_list->use_index); if (kmap == ~(key_map) 0) @@ -715,23 +732,54 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) if (kmap) map= kmap; } - - if ((error= mi_assign_to_keycache(file, map, keycache_name))) + + len= strlen(new_key_cache_name); + new_key_cache= get_or_create_key_cache(new_key_cache_name, len); + if (old_key_cache == new_key_cache) + { + /* Nothing to do: table is assigned to the same key cache */ + goto ok; + } + + if (!new_key_cache || + (!new_key_cache->cache && ha_key_cache(new_key_cache))) { + if (key_cache_asmt->triggered) + error= HA_ERR_OUT_OF_MEM; + else + { + char buf[ERRMSGSIZE]; + my_snprintf(buf, ERRMSGSIZE, + "Failed to create key cache %s", new_key_cache_name); + errmsg= buf; + error= HA_ADMIN_FAILED; + } + goto err; + } + + reassign_key_cache(key_cache_asmt, new_key_cache); + + VOID(pthread_mutex_unlock(&LOCK_assign)); + error= mi_assign_to_keycache(file, map, &new_key_cache->cache); + VOID(pthread_mutex_lock(&LOCK_assign)); + + if (error && !key_cache_asmt->triggered) + { switch (error) { default: char buf[ERRMSGSIZE+20]; my_snprintf(buf, ERRMSGSIZE, - "Failed to read from index file (errno: %d)", my_errno); + "Failed to flush to index file (errno: %d)", my_errno); errmsg= buf; } - error= HA_ADMIN_FAILED; + error= HA_ADMIN_CORRUPT; goto err; } - - DBUG_RETURN(HA_ADMIN_OK); + + goto ok; err: + if (!triggered) { MI_CHECK param; myisamchk_init(¶m); @@ -741,8 +789,33 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) param.table_name= table->table_name; param.testflag= 0; mi_check_print_error(¶m, errmsg); - DBUG_RETURN(error); + } + + ok: + if (--key_cache_asmt->requests) + { + /* There is a queue of assignments for the table */ + + /* Remove the first member from the queue */ + struct st_my_thread_var *last= key_cache_asmt->queue; + struct st_my_thread_var *thread= last->next; + if (thread->next == thread) + key_cache_asmt->queue= 0; + else + { + last->next= thread->next; + last->next->prev= &last->next; + thread->next= 0; + } + /* Signal the first waiting thread to proceed */ + VOID(pthread_cond_signal(&thread->suspend)); } + + key_cache_asmt->triggered= 0; + + VOID(pthread_mutex_unlock(&LOCK_assign)); + + DBUG_RETURN(error); } -- cgit v1.2.1 From ed8dc87c00909daf7d96e563b4d4ca34b7dda0b2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 1 Oct 2003 18:20:07 -0700 Subject: Many files: Improved concurrency for key cache reassignment include/my_sys.h: Improved concurrency for key cache reassignment include/myisam.h: Improved concurrency for key cache reassignment myisam/mi_keycache.c: Improved concurrency for key cache reassignment myisam/mi_locking.c: Improved concurrency for key cache reassignment mysys/mf_keycache.c: Improved concurrency for key cache reassignment sql/ha_myisam.cc: Improved concurrency for key cache reassignment sql/sql_table.cc: Improved concurrency for key cache reassignment --- sql/ha_myisam.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sql/ha_myisam.cc') diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 313d2a3eff3..e3712ae4271 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -761,7 +761,7 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) reassign_key_cache(key_cache_asmt, new_key_cache); VOID(pthread_mutex_unlock(&LOCK_assign)); - error= mi_assign_to_keycache(file, map, &new_key_cache->cache); + error= mi_assign_to_keycache(file, map, new_key_cache, &LOCK_assign); VOID(pthread_mutex_lock(&LOCK_assign)); if (error && !key_cache_asmt->triggered) -- cgit v1.2.1