diff options
-rw-r--r-- | myisam/mi_locking.c | 33 | ||||
-rw-r--r-- | mysql-test/r/symlink.result | 4 | ||||
-rw-r--r-- | mysql-test/t/symlink.test | 2 | ||||
-rw-r--r-- | mysys/mf_keycache.c | 18 | ||||
-rw-r--r-- | sql/ha_myisam.cc | 2 | ||||
-rw-r--r-- | sql/sql_show.cc | 11 |
6 files changed, 42 insertions, 28 deletions
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c index 19fd99779ba..18daebffa85 100644 --- a/myisam/mi_locking.c +++ b/myisam/mi_locking.c @@ -57,10 +57,8 @@ int mi_lock_database(MI_INFO *info, int lock_type) DBUG_PRINT("info", ("old lock: %d", info->lock_type)); if (info->lock_type == F_RDLCK) count= --share->r_locks; - else if (info->lock_type == F_WRLCK) - count= --share->w_locks; else - count= 1; /* F_EXTRA_LCK */ + count= --share->w_locks; --share->tot_locks; if (info->lock_type == F_WRLCK && !share->w_locks && !share->delay_key_write && flush_key_blocks(share->kfile,FLUSH_KEEP)) @@ -110,19 +108,22 @@ int mi_lock_database(MI_INFO *info, int lock_type) if (error) mi_mark_crashed(info); } - if (share->r_locks) - { /* Only read locks left */ - flag=1; - if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF, - MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) - error=my_errno; - } - else if (!share->w_locks) - { /* No more locks */ - flag=1; - if (my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF, - MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) - error=my_errno; + if (info->lock_type != F_EXTRA_LCK) + { + if (share->r_locks) + { /* Only read locks left */ + flag=1; + if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF, + MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) + error=my_errno; + } + else if (!share->w_locks) + { /* No more locks */ + flag=1; + if (my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF, + MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) + error=my_errno; + } } } info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED); diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index ab699ac4c4e..2deecae7243 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -40,7 +40,7 @@ t9 CREATE TABLE `t9` ( `b` char(16) NOT NULL default '', `c` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM DATA DIRECTORY='TEST_DIR/var/tmp/' INDEX DIRECTORY='TEST_DIR/var/run/' alter table t9 rename t8, add column d int not null; alter table t8 rename t7; rename table t7 to t9; @@ -62,5 +62,5 @@ t9 CREATE TABLE `t9` ( `c` int(11) NOT NULL default '0', `d` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM DATA DIRECTORY='TEST_DIR/var/tmp/' INDEX DIRECTORY='TEST_DIR/var/run/' drop database mysqltest; diff --git a/mysql-test/t/symlink.test b/mysql-test/t/symlink.test index d8bba12b645..5e1fe313a7e 100644 --- a/mysql-test/t/symlink.test +++ b/mysql-test/t/symlink.test @@ -46,6 +46,7 @@ check table t9; optimize table t9; repair table t9; alter table t9 add column c int not null; +--replace_result $MYSQL_TEST_DIR TEST_DIR show create table t9; # Test renames @@ -86,5 +87,6 @@ enable_query_log; alter table t9 rename mysqltest.t9; select count(*) from mysqltest.t9; +--replace_result $MYSQL_TEST_DIR TEST_DIR show create table mysqltest.t9; drop database mysqltest; diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c index 6a037f13f05..4cb3681b8b8 100644 --- a/mysys/mf_keycache.c +++ b/mysys/mf_keycache.c @@ -705,11 +705,19 @@ int flush_key_blocks(File file, enum flush_type type) static int flush_all_key_blocks() { - int error=0; - while (_my_blocks_changed > 0) - if (flush_key_blocks_int(_my_used_first->file, FLUSH_RELEASE)) - error=1; - return error; + SEC_LINK **block, **end; + for (block= changed_blocks, end= block+CHANGED_BLOCKS_HASH; + block < end; + block++ + ) + { + while (*block) + { + if (flush_key_blocks_int((*block)->file, FLUSH_RELEASE)) + return 1; + } + } + return 0; } diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 9059ad803f8..97c002cee52 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1018,7 +1018,7 @@ THR_LOCK_DATA **ha_myisam::store_lock(THD *thd, void ha_myisam::update_create_info(HA_CREATE_INFO *create_info) { - table->file->info(HA_STATUS_AUTO | HA_STATUS_CONST); + ha_myisam::info(HA_STATUS_AUTO | HA_STATUS_CONST); if (!(create_info->used_fields & HA_CREATE_USED_AUTO)) { create_info->auto_increment_value=auto_increment_value; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 6e7fe650247..6680485ef0c 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -903,6 +903,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) key_info= table->key_info; file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK | HA_STATUS_TIME); + bzero((char*) &create_info, sizeof(create_info)); file->update_create_info(&create_info); primary_key= table->primary_key; @@ -1005,10 +1006,12 @@ store_create_info(THD *thd, TABLE *table, String *packet) } if (file->raid_type) { - sprintf(buff," RAID_TYPE=%s RAID_CHUNKS=%d RAID_CHUNKSIZE=%ld", - my_raid_type(file->raid_type), file->raid_chunks, - file->raid_chunksize/RAID_BLOCK_SIZE); - packet->append(buff); + uint length; + length= my_snprintf(buff,sizeof(buff), + " RAID_TYPE=%s RAID_CHUNKS=%d RAID_CHUNKSIZE=%ld", + my_raid_type(file->raid_type), file->raid_chunks, + file->raid_chunksize/RAID_BLOCK_SIZE); + packet->append(buff, length); } append_directory(thd, packet, "DATA", create_info.data_file_name); append_directory(thd, packet, "INDEX", create_info.index_file_name); |