Commit 0ede7125 authored by Dmitry Lenev's avatar Dmitry Lenev

Fix for bug #50784 "MDL: Assertion `m_tickets.is_empty() ||

m_tickets.front() == m_trans_sentinel'".

Debug build of server crashed due to assert failure in MDL
subsystem when one tried to execute multi-table REPAIR or
OPTIMIZE in autocommit=0 mode.

The assert failure occured when multi-table REPAIR or OPTIMIZE
started processing of second table from its table list and
tried to acquire upgradable metadata lock on this table.
The cause of the assert failure were MDL locks left over from
processing of previous table. It turned out that in autocommit=0
mode close_thread_tables() which happens at the end of table
processing doesn't release metadata locks.

This fix solves problem by releasing locks explicitly using
MDL_context::release_trans_locks() call.
parent c2fe1988
......@@ -169,3 +169,17 @@ test.t1 repair Error Table 't1' was locked with a READ lock and can't be updated
test.t1 repair status Operation failed
UNLOCK TABLES;
DROP TABLE t1;
#
# Test for bug #50784 "MDL: Assertion `m_tickets.is_empty() ||
# m_tickets.front() == m_trans_sentinel'"
#
drop tables if exists t1, t2;
create table t1 (i int);
create table t2 (j int);
set @@autocommit= 0;
repair table t1, t2;
Table Op Msg_type Msg_text
test.t1 repair status OK
test.t2 repair status OK
set @@autocommit= default;
drop tables t1, t2;
......@@ -173,3 +173,18 @@ REPAIR TABLE t1;
UNLOCK TABLES;
DROP TABLE t1;
--echo #
--echo # Test for bug #50784 "MDL: Assertion `m_tickets.is_empty() ||
--echo # m_tickets.front() == m_trans_sentinel'"
--echo #
--disable_warnings
drop tables if exists t1, t2;
--enable_warnings
create table t1 (i int);
create table t2 (j int);
set @@autocommit= 0;
repair table t1, t2;
set @@autocommit= default;
drop tables t1, t2;
......@@ -5030,6 +5030,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
trans_commit_stmt(thd);
trans_commit_implicit(thd);
close_thread_tables(thd);
thd->mdl_context.release_transactional_locks();
table->table=0; // For query cache
/*
......@@ -5059,6 +5060,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
trans_rollback_stmt(thd);
trans_rollback(thd);
close_thread_tables(thd); // Shouldn't be needed
thd->mdl_context.release_transactional_locks();
if (table)
table->table=0;
DBUG_RETURN(TRUE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment