summaryrefslogtreecommitdiff
path: root/sql/sql_rename.cc
diff options
context:
space:
mode:
authormonty@narttu.mysql.fi <>2003-03-04 13:36:59 +0200
committermonty@narttu.mysql.fi <>2003-03-04 13:36:59 +0200
commit21cc72bfe825ef8651d19b535b23c33b8957f1b4 (patch)
tree013fc022f7bca8766f16eff8ae9714126b96160f /sql/sql_rename.cc
parent28b6e0269a12ebab1461f64fc9aa6c1e3df50f43 (diff)
parent8c51eb2c126c1782e2598763d516f92eec29c924 (diff)
downloadmariadb-git-21cc72bfe825ef8651d19b535b23c33b8957f1b4.tar.gz
Merge with 3.23 to get fix for deadlock when doing LOCK TABLES in one thread and DROP TABLE in another thread
Diffstat (limited to 'sql/sql_rename.cc')
-rw-r--r--sql/sql_rename.cc34
1 files changed, 11 insertions, 23 deletions
diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc
index 3eddd2646d5..d7e998264f3 100644
--- a/sql/sql_rename.cc
+++ b/sql/sql_rename.cc
@@ -31,8 +31,8 @@ static TABLE_LIST *rename_tables(THD *thd, TABLE_LIST *table_list,
bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list)
{
- bool error=1,got_all_locks=1;
- TABLE_LIST *lock_table,*ren_table=0;
+ bool error= 1;
+ TABLE_LIST *ren_table= 0;
DBUG_ENTER("mysql_rename_tables");
/*
@@ -47,23 +47,11 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list)
}
VOID(pthread_mutex_lock(&LOCK_open));
- for (lock_table=table_list ; lock_table ; lock_table=lock_table->next)
- {
- int got_lock;
- if ((got_lock=lock_table_name(thd,lock_table)) < 0)
- goto end;
- if (got_lock)
- got_all_locks=0;
- }
-
- if (!got_all_locks && wait_for_locked_table_names(thd,table_list))
- goto end;
-
- if (!(ren_table=rename_tables(thd,table_list,0)))
- error=0;
-
-end:
- if (ren_table)
+ if (lock_table_names(thd, table_list))
+ goto err;
+
+ error=0;
+ if ((ren_table=rename_tables(thd,table_list,0)))
{
/* Rename didn't succeed; rename back the tables in reverse order */
TABLE_LIST *prev=0,*table;
@@ -85,7 +73,7 @@ end:
table=table->next->next; // Skip error table
/* Revert to old names */
rename_tables(thd, table, 1);
- /* Note that lock_table == 0 here, so the unlock loop will work */
+ error= 1;
}
/* Lets hope this doesn't fail as the result will be messy */
@@ -100,9 +88,9 @@ end:
send_ok(&thd->net);
}
- for (TABLE_LIST *table=table_list ; table != lock_table ; table=table->next)
- unlock_table_name(thd,table);
- pthread_cond_broadcast(&COND_refresh);
+ unlock_table_names(thd,table_list);
+
+err:
pthread_mutex_unlock(&LOCK_open);
DBUG_RETURN(error);
}