Commit 154860ea authored by Ashish Agarwal's avatar Ashish Agarwal

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.
parent 5598603a
disable_query_log;
#
# Check if server has support for loading plugins
#
if (`SELECT @@have_dynamic_loading != 'YES'`) {
--skip Null audit plugin requires dynamic loading
}
#
# Check if the variable AUDIT_NULL is set
#
if (!$AUDIT_NULL) {
--skip Audit_null plugin requires the environment variable \$AUDIT_NULL to be set (normally done by mtr)
}
#
# Check if --plugin-dir was setup for null_audit db
#
if (`SELECT CONCAT('--plugin-dir=', REPLACE(@@plugin_dir, '\\\\', '/')) != '$AUDIT_NULL_OPT/'`) {
--skip null audit plugin requires that --plugin-dir is set to the null audit plugin dir (either the .opt file does not contain \$AUDIT_NULL_OPT or another plugin is in use)
}
enable_query_log;
...@@ -40,3 +40,4 @@ ha_blackhole storage/blackhole BLACKHOLE_PLUGIN ...@@ -40,3 +40,4 @@ ha_blackhole storage/blackhole BLACKHOLE_PLUGIN
ha_federated storage/federated FEDERATED_PLUGIN ha_federated storage/federated FEDERATED_PLUGIN
mypluglib plugin/fulltext SIMPLE_PARSER mypluglib plugin/fulltext SIMPLE_PARSER
libdaemon_example plugin/daemon_example DAEMONEXAMPLE libdaemon_example plugin/daemon_example DAEMONEXAMPLE
adt_null plugin/audit_null AUDIT_NULL
...@@ -1820,6 +1820,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl ...@@ -1820,6 +1820,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
{ {
if (plugin_initialize(tmp)) if (plugin_initialize(tmp))
{ {
mysql_mutex_unlock(&LOCK_plugin);
my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str, my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str,
"Plugin initialization function failed."); "Plugin initialization function failed.");
goto deinit; goto deinit;
...@@ -1831,6 +1832,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl ...@@ -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 of the insert into the plugin table, so that it is not replicated in
row based mode. row based mode.
*/ */
mysql_mutex_unlock(&LOCK_plugin);
tmp_disable_binlog(thd); tmp_disable_binlog(thd);
table->use_all_columns(); table->use_all_columns();
restore_record(table, s->default_values); restore_record(table, s->default_values);
...@@ -1843,10 +1845,9 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl ...@@ -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)); table->file->print_error(error, MYF(0));
goto deinit; goto deinit;
} }
mysql_mutex_unlock(&LOCK_plugin);
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
deinit: deinit:
mysql_mutex_lock(&LOCK_plugin);
tmp->state= PLUGIN_IS_DELETED; tmp->state= PLUGIN_IS_DELETED;
reap_needed= true; reap_needed= true;
reap_plugins(); reap_plugins();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment