summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorKonstantin Osipov <kostja@sun.com>2009-12-01 17:02:32 +0300
committerKonstantin Osipov <kostja@sun.com>2009-12-01 17:02:32 +0300
commit1b078b3f2df729859807d3905cf3e0b9f1b8d29c (patch)
treef0ca2d3c2322836cc1cb41d36a17844036cc6104 /sql
parentd0a1f640db28448adf1f7cafe8e9d811e80e73da (diff)
downloadmariadb-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.cc21
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)))
{