diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2014-02-13 11:40:49 +0400 |
---|---|---|
committer | Sergey Vojtovich <svoj@mariadb.org> | 2014-02-13 11:40:49 +0400 |
commit | bde11c1ab59c40be6043e156b0427e1d7105ec85 (patch) | |
tree | 4acdd9c12ec8c5dd52fd91790f617959647abd68 /sql/sql_plugin.cc | |
parent | b0b699dc278faa7cfbc0f54766d02cee762663a9 (diff) | |
download | mariadb-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.cc | 1 |
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); |