summaryrefslogtreecommitdiff
path: root/sql/ha_myisam.cc
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2003-08-02 02:43:18 -0700
committerunknown <igor@rurik.mysql.com>2003-08-02 02:43:18 -0700
commitb6d27e20e19e1998b745a438dbde635261ebc5d4 (patch)
treeadd5cbee3049a38799b03ee640b5ae06fbc34ef1 /sql/ha_myisam.cc
parent4f6f7f7ded18764b8aa382c3a84261657fea66f8 (diff)
downloadmariadb-git-b6d27e20e19e1998b745a438dbde635261ebc5d4.tar.gz
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
Diffstat (limited to 'sql/ha_myisam.cc')
-rw-r--r--sql/ha_myisam.cc97
1 files changed, 85 insertions, 12 deletions
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 &param, 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(&param);
@@ -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(&param, 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);
}