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:
@ -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();
|
||||
|
Reference in New Issue
Block a user