#At file:///home/dlenev/src/bzr/mysql-6.0-3726-w2/
2663 Dmitry Lenev 2008-06-06
WL#3726 "DDL locking for all metadata objects".
After review fixes in progress.
Clarified some comments explaining control flow in
prepare_for_repair().
modified:
sql/sql_table.cc
=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc 2008-06-05 15:33:38 +0000
+++ b/sql/sql_table.cc 2008-06-06 11:32:48 +0000
@@ -3935,16 +3935,16 @@ static int prepare_for_repair(THD *thd,
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);
@@ -4024,12 +4024,19 @@ static int prepare_for_repair(THD *thd,
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)))
{
| Thread |
|---|
| • bzr commit into mysql-6.0 branch (dlenev:2663) WL#3726 | Dmitry Lenev | 6 Jun |