From bde11c1ab59c40be6043e156b0427e1d7105ec85 Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Thu, 13 Feb 2014 11:40:49 +0400 Subject: [PATCH] MDEV-5089 - possible deadlocks between rwlocks and mutexes Pre-MDL versions had direct relationship between LOCK_open and LOCK_global_system_variables, e.g.: intern_sys_var_ptr // locks LOCK_global_system_variable mysql_sys_var_char create_options_are_valid ha_innobase::create handler::ha_create ha_create_table rea_create_table mysql_create_table_no_lock // locks LOCK_open mysql_create_table With MDL this relationship was removed, but mutex order was still recorded. In fact there is indirect relationship between LOCK_open and LOCK_global_system_variables via rwlocks in reverse order. Removed LOCK_open and LOCK_global_system_variables order recording, instead assert that LOCK_open is never held in intern_sys_var_ptr(). This solves only one of many problems detected with MDEV-5089. --- sql/mysqld.cc | 6 ------ sql/sql_plugin.cc | 1 + 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index dcc9aec97a6..b71a7f7c880 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5040,12 +5040,6 @@ int mysqld_main(int argc, char **argv) unireg_abort(1); } - /* - We must have LOCK_open before LOCK_global_system_variables because - LOCK_open is hold while sql_plugin.c::intern_sys_var_ptr() is called. - */ - mysql_mutex_record_order(&LOCK_open, &LOCK_global_system_variables); - create_shutdown_thread(); start_handle_manager(); diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index c127b82b3b6..fa10699ca55 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -2900,6 +2900,7 @@ static uchar *intern_sys_var_ptr(THD* thd, int offset, bool global_lock) DBUG_ENTER("intern_sys_var_ptr"); DBUG_ASSERT(offset >= 0); DBUG_ASSERT((uint)offset <= global_system_variables.dynamic_variables_head); + mysql_mutex_assert_not_owner(&LOCK_open); if (!thd) DBUG_RETURN((uchar*) global_system_variables.dynamic_variables_ptr + offset);