Skip to content

Commit

Permalink
MDEV-33441 Do not deinit plugin variables when retry requested
Browse files Browse the repository at this point in the history
After MDEV-31400, plugins are allowed to ask for retries when failing
initialisation. However, such failures also cause plugin system
variables to be deleted (plugin_variables_deinit()) before retrying
and are not re-added during retry.

We fix this by checking that if the plugin has requested a retry the
variables are not deleted. Because plugin_deinitialize() also calls
plugin_variables_deinit(), if the retry fails, the variables will
still be deleted.

Alternatives considered:

- remove the plugin_variables_deinit() from plugin_initialize() error
handling altogether. We decide to take a more conservative approach
here.

- re-add the system variables during retry. It is more complicated
than simply iterating over plugin->system_vars and call
my_hash_insert(). For example we will need to assign values to
the test_load field and extract more code from test_plugin_options(),
if that is possible.
  • Loading branch information
mariadb-YuchenPei authored and sanja-byelkin committed Feb 14, 2024
1 parent d21cb43 commit 068a681
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 1 deletion.
3 changes: 2 additions & 1 deletion sql/sql_plugin.cc
Expand Up @@ -1505,7 +1505,7 @@ static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin,
else
ret= plugin_do_initialize(plugin, state);

if (ret)
if (ret && ret != HA_ERR_RETRY_INIT)
plugin_variables_deinit(plugin);

mysql_mutex_lock(&LOCK_plugin);
Expand Down Expand Up @@ -1786,6 +1786,7 @@ int plugin_init(int *argc, char **argv, int flags)
uint state= plugin_ptr->state;
mysql_mutex_unlock(&LOCK_plugin);
error= plugin_do_initialize(plugin_ptr, state);
DBUG_EXECUTE_IF("fail_spider_init_retry", error= 1;);
mysql_mutex_lock(&LOCK_plugin);
plugin_ptr->state= state;
if (error == HA_ERR_RETRY_INIT)
Expand Down
7 changes: 7 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result
@@ -0,0 +1,7 @@
#
# MDEV-33441 No spider variables available is Spider is loaded upon server startup
#
set spider_same_server_link=0;
#
# end of test mdev_33441
#
10 changes: 10 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result
@@ -0,0 +1,10 @@
#
# MDEV-33441 No spider variables available is Spider is loaded upon server startup
#
select * from mysql.plugin;
name dl
show variables like 'spider%';
Variable_name Value
#
# end of test mdev_33441_fail
#
1 change: 1 addition & 0 deletions storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt
@@ -0,0 +1 @@
--plugin-load-add=ha_spider
10 changes: 10 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test
@@ -0,0 +1,10 @@
--echo #
--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup
--echo #

# We test that at least one spider variable exists.
set spider_same_server_link=0;

--echo #
--echo # end of test mdev_33441
--echo #
2 changes: 2 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt
@@ -0,0 +1,2 @@
--plugin-load-add=ha_spider
--debug-dbug=d,fail_spider_init_retry
10 changes: 10 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test
@@ -0,0 +1,10 @@
--source include/have_debug.inc
--echo #
--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup
--echo #
# We test that when retry fails, spider variables are deleted.
select * from mysql.plugin;
show variables like 'spider%';
--echo #
--echo # end of test mdev_33441_fail
--echo #

0 comments on commit 068a681

Please sign in to comment.