diff options
author | Konstantin Osipov <kostja@sun.com> | 2009-12-01 17:02:32 +0300 |
---|---|---|
committer | Konstantin Osipov <kostja@sun.com> | 2009-12-01 17:02:32 +0300 |
commit | 1b078b3f2df729859807d3905cf3e0b9f1b8d29c (patch) | |
tree | f0ca2d3c2322836cc1cb41d36a17844036cc6104 /sql | |
parent | d0a1f640db28448adf1f7cafe8e9d811e80e73da (diff) | |
download | mariadb-git-1b078b3f2df729859807d3905cf3e0b9f1b8d29c.tar.gz |
Backport of:
------------------------------------------------------------
revno: 2630.4.25
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w2
timestamp: Fri 2008-06-06 15:32:48 +0400
message:
WL#3726 "DDL locking for all metadata objects".
After review fixes in progress.
Clarified some comments explaining control flow in
prepare_for_repair().
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_table.cc | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b5f7fad36a6..cac4bab27b7 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4397,16 +4397,16 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list, if (!(check_opt->sql_flags & TT_USEFRM)) DBUG_RETURN(0); - if (!(table= table_list->table)) /* if open_ltable failed */ + if (!(table= table_list->table)) { + /* + Attempt to do full-blown table open in mysql_admin_table() has failed. + Let us try to open at least a .FRM for this table. + */ char key[MAX_DBKEY_LENGTH]; uint key_length; key_length= create_table_def_key(thd, key, table_list, 0); - /* - TODO: Check that REPAIR's code also conforms to meta-data - locking protocol. Fix if it is not. - */ mdl_lock_data= mdl_alloc_lock(0, table_list->db, table_list->table_name, thd->mem_root); mdl_set_lock_type(mdl_lock_data, MDL_EXCLUSIVE); @@ -4486,12 +4486,19 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list, if (table_list->table) { - /* If we could open the table, close it */ + /* + Table was successfully open in mysql_admin_table(). Now we need + to close it, but leave it protected by exclusive metadata lock. + */ if (close_cached_table(thd, table)) goto end; table_list->table= 0; } - // After this point we have X mdl lock in both cases + /* + After this point we have an exclusive metadata lock on our table + in both cases when table was successfully open in mysql_admin_table() + and when it was open in prepare_for_repair(). + */ if (my_rename(from, tmp, MYF(MY_WME))) { |