1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-6774 - Deadlock between SELECT, DROP TABLE, SHOW STATUS and

SET @@global.log_output

Deadlock chain:
rdlock(LOCK_logger) -> lock(LOCK_open)     SELECT 1
lock(LOCK_open)     -> lock(LOCK_status)   DROP TABLE t1
lock(LOCK_status)   -> lock(LOCK_g_s_v)    SHOW STATUS
lock(LOCK_g_s_)     -> wrlock(LOCK_logger) SET @@global.log_output=DEFAULT

Fixed by removing relationship between LOCK_status and
LOCK_global_system_variables during SHOW STATUS: we don't really need
LOCK_global_system_variables when accessing status vars.
This commit is contained in:
Sergey Vojtovich
2014-09-25 10:43:11 +04:00
parent d1e46a50bc
commit b737d902a8
2 changed files with 4 additions and 11 deletions

View File

@ -2648,12 +2648,11 @@ static bool show_status_array(THD *thd, const char *wild,
char *value=var->value;
const char *pos, *end; // We assign a lot of const's
mysql_mutex_lock(&LOCK_global_system_variables);
if (show_type == SHOW_SYS)
{
sys_var *var= ((sys_var *) value);
show_type= var->show_type();
mysql_mutex_lock(&LOCK_global_system_variables);
value= (char*) var->value_ptr(thd, value_type, &null_lex_str);
charset= var->charset(thd);
}
@ -2754,7 +2753,8 @@ static bool show_status_array(THD *thd, const char *wild,
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
table->field[1]->set_notnull();
mysql_mutex_unlock(&LOCK_global_system_variables);
if (var->type == SHOW_SYS)
mysql_mutex_unlock(&LOCK_global_system_variables);
if (schema_table_store_record(thd, table))
{