mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
WL#5341 - Sticky plugins
This patch implements "permanent" load option for plugins as specified by WL#5341. mysql-test/r/plugin_load_option.result: A test case for WL#5341. mysql-test/t/plugin_load_option-master.opt: A test case for WL#5341. mysql-test/t/plugin_load_option.test: A test case for WL#5341. sql/share/errmsg-utf8.txt: An error message for WL#5341. sql/sql_plugin.cc: Added FORCE_PLUS_PERMANENT plugin load option. sql/sql_plugin.h: Expose and use plugin load option instead of is_mandatory flag. This is a requirement for to-be-implemented WL5496.
This commit is contained in:
@@ -41,9 +41,8 @@ extern struct st_mysql_plugin *mysql_mandatory_plugins[];
|
||||
@note The order of the enumeration is critical.
|
||||
@see construct_options
|
||||
*/
|
||||
static const char *global_plugin_typelib_names[]=
|
||||
{ "OFF", "ON", "FORCE", NULL };
|
||||
enum enum_plugin_load_policy {PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE};
|
||||
const char *global_plugin_typelib_names[]=
|
||||
{ "OFF", "ON", "FORCE", "FORCE_PLUS_PERMANENT", NULL };
|
||||
static TYPELIB global_plugin_typelib=
|
||||
{ array_elements(global_plugin_typelib_names)-1,
|
||||
"", global_plugin_typelib_names, NULL };
|
||||
@@ -796,6 +795,7 @@ static bool plugin_add(MEM_ROOT *tmp_root,
|
||||
tmp.name.length= name_len;
|
||||
tmp.ref_count= 0;
|
||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||
tmp.load_option= PLUGIN_ON;
|
||||
if (test_plugin_options(tmp_root, &tmp, argc, argv))
|
||||
tmp.state= PLUGIN_IS_DISABLED;
|
||||
|
||||
@@ -1237,7 +1237,7 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
tmp.name.str= (char *)plugin->name;
|
||||
tmp.name.length= strlen(plugin->name);
|
||||
tmp.state= 0;
|
||||
tmp.is_mandatory= mandatory;
|
||||
tmp.load_option= mandatory ? PLUGIN_FORCE : PLUGIN_ON;
|
||||
|
||||
/*
|
||||
If the performance schema is compiled in,
|
||||
@@ -1256,7 +1256,7 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
to work, by using '--skip-performance-schema' (the plugin)
|
||||
*/
|
||||
if (!my_strcasecmp(&my_charset_latin1, plugin->name, "PERFORMANCE_SCHEMA"))
|
||||
tmp.is_mandatory= true;
|
||||
tmp.load_option= PLUGIN_FORCE;
|
||||
|
||||
free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE));
|
||||
if (test_plugin_options(&tmp_root, &tmp, argc, argv))
|
||||
@@ -1334,7 +1334,8 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
while ((plugin_ptr= *(--reap)))
|
||||
{
|
||||
mysql_mutex_unlock(&LOCK_plugin);
|
||||
if (plugin_ptr->is_mandatory)
|
||||
if (plugin_ptr->load_option == PLUGIN_FORCE ||
|
||||
plugin_ptr->load_option == PLUGIN_FORCE_PLUS_PERMANENT)
|
||||
reaped_mandatory_plugin= TRUE;
|
||||
plugin_deinitialize(plugin_ptr, true);
|
||||
mysql_mutex_lock(&LOCK_plugin);
|
||||
@@ -1844,6 +1845,11 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
|
||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str);
|
||||
goto err;
|
||||
}
|
||||
if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT)
|
||||
{
|
||||
my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str);
|
||||
goto err;
|
||||
}
|
||||
|
||||
plugin->state= PLUGIN_IS_DELETED;
|
||||
if (plugin->ref_count)
|
||||
@@ -3054,7 +3060,8 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
plugin_dash.length + 1);
|
||||
strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS);
|
||||
|
||||
if (!tmp->is_mandatory)
|
||||
if (tmp->load_option != PLUGIN_FORCE &&
|
||||
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||
{
|
||||
/* support --skip-plugin-foo syntax */
|
||||
options[0].name= plugin_name_ptr;
|
||||
@@ -3314,7 +3321,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
{
|
||||
struct sys_var_chain chain= { NULL, NULL };
|
||||
bool disable_plugin;
|
||||
enum_plugin_load_policy plugin_load_policy= tmp->is_mandatory ? PLUGIN_FORCE : PLUGIN_ON;
|
||||
enum_plugin_load_option plugin_load_option= tmp->load_option;
|
||||
|
||||
MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ?
|
||||
&tmp->mem_root : &plugin_mem_root;
|
||||
@@ -3335,7 +3342,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
*/
|
||||
if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") &&
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster")))
|
||||
plugin_load_policy= PLUGIN_OFF;
|
||||
plugin_load_option= PLUGIN_OFF;
|
||||
|
||||
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
||||
count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */
|
||||
@@ -3359,8 +3366,9 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
We adjust the default value to account for the hardcoded exceptions
|
||||
we have set for the federated and ndbcluster storage engines.
|
||||
*/
|
||||
if (!tmp->is_mandatory)
|
||||
opts[0].def_value= opts[1].def_value= plugin_load_policy;
|
||||
if (tmp->load_option != PLUGIN_FORCE &&
|
||||
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||
opts[0].def_value= opts[1].def_value= plugin_load_option;
|
||||
|
||||
error= handle_options(argc, &argv, opts, NULL);
|
||||
(*argc)++; /* add back one for the program name */
|
||||
@@ -3375,12 +3383,13 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
Set plugin loading policy from option value. First element in the option
|
||||
list is always the <plugin name> option value.
|
||||
*/
|
||||
if (!tmp->is_mandatory)
|
||||
plugin_load_policy= (enum_plugin_load_policy)*(ulong*)opts[0].value;
|
||||
if (tmp->load_option != PLUGIN_FORCE &&
|
||||
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||
plugin_load_option= (enum_plugin_load_option) *(ulong*) opts[0].value;
|
||||
}
|
||||
|
||||
disable_plugin= (plugin_load_policy == PLUGIN_OFF);
|
||||
tmp->is_mandatory= (plugin_load_policy == PLUGIN_FORCE);
|
||||
disable_plugin= (plugin_load_option == PLUGIN_OFF);
|
||||
tmp->load_option= plugin_load_option;
|
||||
|
||||
/*
|
||||
If the plugin is disabled it should not be initialized.
|
||||
|
Reference in New Issue
Block a user