summaryrefslogtreecommitdiff
path: root/sql/sql_admin.cc
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2020-05-22 18:02:24 +0300
committerMonty <monty@mariadb.org>2020-05-23 14:58:33 +0300
commitbe647ff14d6196af825f05020acee8f18af4773d (patch)
treedf9a139f33c72f943671272f4c99ab8e23a4f093 /sql/sql_admin.cc
parent6462af1c2e2cddf3a96818dc7884e187d8ba7f24 (diff)
downloadmariadb-git-be647ff14d6196af825f05020acee8f18af4773d.tar.gz
Fixed deadlock with LOCK TABLES and ALTER TABLE
MDEV-21398 Deadlock (server hang) or assertion failure in Diagnostics_area::set_error_status upon ALTER under lock This failure could only happen if one locked the same table multiple times and then did an ALTER TABLE on the table. Major change is to change all instances of table->m_needs_reopen= true; to table->mark_table_for_reopen(); The main fix for the problem was to ensure that we mark all instances of the table in the locked_table_list and when we reopen the tables, we first close all tables before reopening and locking them. Other things: - Don't call thd->locked_tables_list.reopen_tables if there are no tables marked for reopen. (performance)
Diffstat (limited to 'sql/sql_admin.cc')
-rw-r--r--sql/sql_admin.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc
index 0613495f202..7ace3144dc3 100644
--- a/sql/sql_admin.cc
+++ b/sql/sql_admin.cc
@@ -1087,7 +1087,7 @@ send_result_message:
}
/* Make sure this table instance is not reused after the operation. */
if (table->table)
- table->table->m_needs_reopen= true;
+ table->table->mark_table_for_reopen();
}
result_code= result_code ? HA_ADMIN_FAILED : HA_ADMIN_OK;
table->next_local= save_next_local;
@@ -1212,7 +1212,7 @@ err:
trans_rollback(thd);
if (table && table->table)
{
- table->table->m_needs_reopen= true;
+ table->table->mark_table_for_reopen();
table->table= 0;
}
close_thread_tables(thd); // Shouldn't be needed