summaryrefslogtreecommitdiff
path: root/sql/sql_plugin.cc
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2014-02-13 11:40:49 +0400
committerSergey Vojtovich <svoj@mariadb.org>2014-02-13 11:40:49 +0400
commitbde11c1ab59c40be6043e156b0427e1d7105ec85 (patch)
tree4acdd9c12ec8c5dd52fd91790f617959647abd68 /sql/sql_plugin.cc
parentb0b699dc278faa7cfbc0f54766d02cee762663a9 (diff)
downloadmariadb-git-bde11c1ab59c40be6043e156b0427e1d7105ec85.tar.gz
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.
Diffstat (limited to 'sql/sql_plugin.cc')
-rw-r--r--sql/sql_plugin.cc1
1 files changed, 1 insertions, 0 deletions
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);