1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

BUG#14485479: INSTALL AUDIT PLUGIN HANGS IF WE TRY TO

DISABLE AND ENABLED DURING DDL OPERATION

PROBLEM: Same thread trying to acquire the same mutex
         second time leads to hang/server crash.
         While [un]installing audit_log plugin
         a thread acquires the LOCK_plugin mutex
         and after successful initialization tries
         to write in mysql.plugin table. It holds
         this mutex for a long time. If some how
         plugin table is corrupted then a write to 
         plugin table will throw an error, thread try
         to log this error in the audit_log plugin,
         doing so it tries to acquire the mutex
         again and results is server hang/crash.

SOLUTION: Releasing the LOCK_plugin mutex before
          writing in mysql.plugin table. We dont
          need to hold this mutex as thread already
          acquired a TL_WRITE lock on mysql.plugin
          table.
This commit is contained in:
Ashish Agarwal
2012-10-31 12:40:48 +05:30
parent fa3e181d62
commit 147be51f20
3 changed files with 26 additions and 2 deletions

View File

@ -1820,6 +1820,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
{
if (plugin_initialize(tmp))
{
mysql_mutex_unlock(&LOCK_plugin);
my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str,
"Plugin initialization function failed.");
goto deinit;
@ -1831,6 +1832,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
of the insert into the plugin table, so that it is not replicated in
row based mode.
*/
mysql_mutex_unlock(&LOCK_plugin);
tmp_disable_binlog(thd);
table->use_all_columns();
restore_record(table, s->default_values);
@ -1843,10 +1845,9 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
table->file->print_error(error, MYF(0));
goto deinit;
}
mysql_mutex_unlock(&LOCK_plugin);
DBUG_RETURN(FALSE);
deinit:
mysql_mutex_lock(&LOCK_plugin);
tmp->state= PLUGIN_IS_DELETED;
reap_needed= true;
reap_plugins();