Re'ordering of startup. Fixed Execution path issues. Added function for de'initing everything. This includes Antony's suggestions (bk collapse uber alles!)
This commit is contained in:
parent
7216b5bc7a
commit
5c3ac45ca4
@ -430,12 +430,6 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
|
|||||||
savepoint_alloc_size+= tmp;
|
savepoint_alloc_size+= tmp;
|
||||||
hton->slot= total_ha++;
|
hton->slot= total_ha++;
|
||||||
hton2plugin[hton->slot]=plugin;
|
hton2plugin[hton->slot]=plugin;
|
||||||
/* This is just a temp need until plugin/engine startup is fixed */
|
|
||||||
if (plugin->plugin->status_vars)
|
|
||||||
{
|
|
||||||
add_status_vars(plugin->plugin->status_vars);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hton->prepare)
|
if (hton->prepare)
|
||||||
total_ha_2pc++;
|
total_ha_2pc++;
|
||||||
break;
|
break;
|
||||||
|
@ -1186,7 +1186,7 @@ void clean_up(bool print_message)
|
|||||||
udf_free();
|
udf_free();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
plugin_free();
|
plugin_shutdown();
|
||||||
if (tc_log)
|
if (tc_log)
|
||||||
tc_log->close();
|
tc_log->close();
|
||||||
xid_cache_free();
|
xid_cache_free();
|
||||||
@ -2629,7 +2629,7 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||||||
/*
|
/*
|
||||||
Add server status variables to the dynamic list of
|
Add server status variables to the dynamic list of
|
||||||
status variables that is shown by SHOW STATUS.
|
status variables that is shown by SHOW STATUS.
|
||||||
Later, in plugin_init, plugin_load, and mysql_install_plugin
|
Later, in plugin_init, and mysql_install_plugin
|
||||||
new entries could be added to that list.
|
new entries could be added to that list.
|
||||||
*/
|
*/
|
||||||
if (add_status_vars(status_vars))
|
if (add_status_vars(status_vars))
|
||||||
@ -3178,7 +3178,7 @@ server.");
|
|||||||
using_update_log=1;
|
using_update_log=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin_init())
|
if (plugin_init(0))
|
||||||
{
|
{
|
||||||
sql_print_error("Failed to init plugins.");
|
sql_print_error("Failed to init plugins.");
|
||||||
return 1;
|
return 1;
|
||||||
@ -3610,7 +3610,6 @@ we force server id to 2, but this MySQL server will not act as a slave.");
|
|||||||
|
|
||||||
if (!opt_noacl)
|
if (!opt_noacl)
|
||||||
{
|
{
|
||||||
plugin_load();
|
|
||||||
#ifdef HAVE_DLOPEN
|
#ifdef HAVE_DLOPEN
|
||||||
udf_init();
|
udf_init();
|
||||||
#endif
|
#endif
|
||||||
|
@ -63,6 +63,10 @@ static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM];
|
|||||||
static rw_lock_t THR_LOCK_plugin;
|
static rw_lock_t THR_LOCK_plugin;
|
||||||
static bool initialized= 0;
|
static bool initialized= 0;
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
my_bool plugin_register_builtin(struct st_mysql_plugin *plugin);
|
||||||
|
void plugin_load(void);
|
||||||
|
|
||||||
static struct st_plugin_dl *plugin_dl_find(const LEX_STRING *dl)
|
static struct st_plugin_dl *plugin_dl_find(const LEX_STRING *dl)
|
||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
@ -442,15 +446,6 @@ static my_bool plugin_add(const LEX_STRING *name, const LEX_STRING *dl, int repo
|
|||||||
tmp.name.length= name_len;
|
tmp.name.length= name_len;
|
||||||
tmp.ref_count= 0;
|
tmp.ref_count= 0;
|
||||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||||
if (plugin->status_vars)
|
|
||||||
{
|
|
||||||
SHOW_VAR array[2]= {
|
|
||||||
{plugin->name, (char*)plugin->status_vars, SHOW_ARRAY},
|
|
||||||
{0, 0, SHOW_UNDEF}
|
|
||||||
};
|
|
||||||
if (add_status_vars(array)) // add_status_vars makes a copy
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (! (tmp_plugin_ptr= plugin_insert_or_reuse(&tmp)))
|
if (! (tmp_plugin_ptr= plugin_insert_or_reuse(&tmp)))
|
||||||
goto err;
|
goto err;
|
||||||
if (my_hash_insert(&plugin_hash[plugin->type], (byte*)tmp_plugin_ptr))
|
if (my_hash_insert(&plugin_hash[plugin->type], (byte*)tmp_plugin_ptr))
|
||||||
@ -466,16 +461,35 @@ static my_bool plugin_add(const LEX_STRING *name, const LEX_STRING *dl, int repo
|
|||||||
if (report & REPORT_TO_LOG)
|
if (report & REPORT_TO_LOG)
|
||||||
sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), name->str);
|
sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), name->str);
|
||||||
err:
|
err:
|
||||||
if (plugin->status_vars)
|
plugin_dl_del(dl);
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void plugin_deinitializer(struct st_plugin_int *plugin)
|
||||||
|
{
|
||||||
|
if (plugin->plugin->status_vars)
|
||||||
{
|
{
|
||||||
SHOW_VAR array[2]= {
|
SHOW_VAR array[2]= {
|
||||||
{plugin->name, (char*)plugin->status_vars, SHOW_ARRAY},
|
{plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY},
|
||||||
{0, 0, SHOW_UNDEF}
|
{0, 0, SHOW_UNDEF}
|
||||||
};
|
};
|
||||||
remove_status_vars(array);
|
remove_status_vars(array);
|
||||||
}
|
}
|
||||||
plugin_dl_del(dl);
|
|
||||||
DBUG_RETURN(TRUE);
|
if (plugin->state == PLUGIN_IS_READY)
|
||||||
|
{
|
||||||
|
if (plugin->plugin->deinit)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
|
||||||
|
if (plugin->plugin->deinit())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
|
||||||
|
plugin->name.str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plugin->state= PLUGIN_IS_UNINITIALIZED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -486,14 +500,7 @@ static void plugin_del(const LEX_STRING *name)
|
|||||||
DBUG_ENTER("plugin_del");
|
DBUG_ENTER("plugin_del");
|
||||||
if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)))
|
if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)))
|
||||||
{
|
{
|
||||||
if (plugin->plugin->status_vars)
|
plugin_deinitializer(plugin);
|
||||||
{
|
|
||||||
SHOW_VAR array[2]= {
|
|
||||||
{plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY},
|
|
||||||
{0, 0, SHOW_UNDEF}
|
|
||||||
};
|
|
||||||
remove_status_vars(array);
|
|
||||||
}
|
|
||||||
hash_delete(&plugin_hash[plugin->plugin->type], (byte*)plugin);
|
hash_delete(&plugin_hash[plugin->plugin->type], (byte*)plugin);
|
||||||
plugin_dl_del(&plugin->plugin_dl->dl);
|
plugin_dl_del(&plugin->plugin_dl->dl);
|
||||||
plugin->state= PLUGIN_IS_FREED;
|
plugin->state= PLUGIN_IS_FREED;
|
||||||
@ -523,6 +530,26 @@ static int plugin_initialize(struct st_plugin_int *plugin)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("plugin_initialize");
|
DBUG_ENTER("plugin_initialize");
|
||||||
|
|
||||||
|
if (plugin->plugin->status_vars)
|
||||||
|
{
|
||||||
|
#ifdef FIX_LATER
|
||||||
|
/*
|
||||||
|
We have a problem right now where we can not prepend without
|
||||||
|
breaking backwards compatibility. We will fix this shortly so
|
||||||
|
that engines have "use names" and we wil use those for
|
||||||
|
CREATE TABLE, and use the plugin name then for adding automatic
|
||||||
|
variable names.
|
||||||
|
*/
|
||||||
|
SHOW_VAR array[2]= {
|
||||||
|
{plugin->name, (char*)plugin->status_vars, SHOW_ARRAY},
|
||||||
|
{0, 0, SHOW_UNDEF}
|
||||||
|
};
|
||||||
|
if (add_status_vars(array)) // add_status_vars makes a copy
|
||||||
|
goto err;
|
||||||
|
#else
|
||||||
|
add_status_vars(plugin->plugin->status_vars); // add_status_vars makes a copy
|
||||||
|
#endif /* FIX_LATER */
|
||||||
|
}
|
||||||
if (plugin->plugin->init)
|
if (plugin->plugin->init)
|
||||||
{
|
{
|
||||||
if (plugin->plugin->init())
|
if (plugin->plugin->init())
|
||||||
@ -540,6 +567,8 @@ static int plugin_initialize(struct st_plugin_int *plugin)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plugin->state= PLUGIN_IS_READY;
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
err:
|
err:
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -592,52 +621,6 @@ err:
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plugin_call_initializer(void)
|
|
||||||
{
|
|
||||||
uint i;
|
|
||||||
DBUG_ENTER("plugin_call_initializer");
|
|
||||||
for (i= 0; i < plugin_array.elements; i++)
|
|
||||||
{
|
|
||||||
struct st_plugin_int *tmp= dynamic_element(&plugin_array, i,
|
|
||||||
struct st_plugin_int *);
|
|
||||||
if (tmp->state == PLUGIN_IS_UNINITIALIZED)
|
|
||||||
{
|
|
||||||
if (plugin_initialize(tmp))
|
|
||||||
plugin_del(&tmp->name);
|
|
||||||
else
|
|
||||||
tmp->state= PLUGIN_IS_READY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DBUG_VOID_RETURN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void plugin_call_deinitializer(void)
|
|
||||||
{
|
|
||||||
uint i;
|
|
||||||
DBUG_ENTER("plugin_call_deinitializer");
|
|
||||||
for (i= 0; i < plugin_array.elements; i++)
|
|
||||||
{
|
|
||||||
struct st_plugin_int *tmp= dynamic_element(&plugin_array, i,
|
|
||||||
struct st_plugin_int *);
|
|
||||||
if (tmp->state == PLUGIN_IS_READY)
|
|
||||||
{
|
|
||||||
if (tmp->plugin->deinit)
|
|
||||||
{
|
|
||||||
DBUG_PRINT("info", ("Deinitializing plugin: '%s'", tmp->name.str));
|
|
||||||
if (tmp->plugin->deinit())
|
|
||||||
{
|
|
||||||
DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
|
|
||||||
tmp->name.str));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tmp->state= PLUGIN_IS_UNINITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DBUG_VOID_RETURN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static byte *get_hash_key(const byte *buff, uint *length,
|
static byte *get_hash_key(const byte *buff, uint *length,
|
||||||
my_bool not_used __attribute__((unused)))
|
my_bool not_used __attribute__((unused)))
|
||||||
{
|
{
|
||||||
@ -647,7 +630,14 @@ static byte *get_hash_key(const byte *buff, uint *length,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int plugin_init(void)
|
/*
|
||||||
|
The logic is that we first load and initialize all compiled in plugins.
|
||||||
|
From there we load up the dynamic types (assuming we have not been told to
|
||||||
|
skip this part).
|
||||||
|
|
||||||
|
Finally we inializie everything, aka the dynamic that have yet to initialize.
|
||||||
|
*/
|
||||||
|
int plugin_init(int skip_dynamic_loading)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct st_mysql_plugin **builtins;
|
struct st_mysql_plugin **builtins;
|
||||||
@ -672,24 +662,46 @@ int plugin_init(void)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register all the built-in plugins */
|
/*
|
||||||
|
First we register builtin plugins
|
||||||
|
*/
|
||||||
for (builtins= mysqld_builtins; *builtins; builtins++)
|
for (builtins= mysqld_builtins; *builtins; builtins++)
|
||||||
{
|
{
|
||||||
for (plugin= *builtins; plugin->info; plugin++)
|
for (plugin= *builtins; plugin->info; plugin++)
|
||||||
{
|
{
|
||||||
|
// if (!(strcmp(plugin->name, "MyISAM")))
|
||||||
|
{
|
||||||
if (plugin_register_builtin(plugin))
|
if (plugin_register_builtin(plugin))
|
||||||
goto err;
|
goto err;
|
||||||
struct st_plugin_int *tmp=dynamic_element(&plugin_array,
|
struct st_plugin_int *tmp= dynamic_element(&plugin_array,
|
||||||
plugin_array.elements-1,
|
plugin_array.elements-1,
|
||||||
struct st_plugin_int *);
|
struct st_plugin_int *);
|
||||||
if (plugin_initialize(tmp))
|
if (plugin_initialize(tmp))
|
||||||
goto err;
|
goto err;
|
||||||
tmp->state= PLUGIN_IS_READY;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Register all dynamic plugins */
|
||||||
|
if (!skip_dynamic_loading)
|
||||||
|
plugin_load();
|
||||||
|
|
||||||
initialized= 1;
|
initialized= 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Now we initialize all remaining plugins
|
||||||
|
*/
|
||||||
|
for (i= 0; i < plugin_array.elements; i++)
|
||||||
|
{
|
||||||
|
struct st_plugin_int *tmp= dynamic_element(&plugin_array, i,
|
||||||
|
struct st_plugin_int *);
|
||||||
|
if (tmp->state == PLUGIN_IS_UNINITIALIZED)
|
||||||
|
{
|
||||||
|
if (plugin_initialize(tmp))
|
||||||
|
plugin_del(&tmp->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -734,8 +746,6 @@ void plugin_load(void)
|
|||||||
THD *new_thd;
|
THD *new_thd;
|
||||||
DBUG_ENTER("plugin_load");
|
DBUG_ENTER("plugin_load");
|
||||||
|
|
||||||
DBUG_ASSERT(initialized);
|
|
||||||
|
|
||||||
if (!(new_thd= new THD))
|
if (!(new_thd= new THD))
|
||||||
{
|
{
|
||||||
sql_print_error("Can't allocate memory for plugin structures");
|
sql_print_error("Can't allocate memory for plugin structures");
|
||||||
@ -772,7 +782,6 @@ void plugin_load(void)
|
|||||||
DBUG_PRINT("warning", ("Couldn't load plugin named '%s' with soname '%s'.",
|
DBUG_PRINT("warning", ("Couldn't load plugin named '%s' with soname '%s'.",
|
||||||
name.str, dl.str));
|
name.str, dl.str));
|
||||||
}
|
}
|
||||||
plugin_call_initializer();
|
|
||||||
if (error > 0)
|
if (error > 0)
|
||||||
sql_print_error(ER(ER_GET_ERRNO), my_errno);
|
sql_print_error(ER(ER_GET_ERRNO), my_errno);
|
||||||
end_read_record(&read_record_info);
|
end_read_record(&read_record_info);
|
||||||
@ -787,11 +796,22 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void plugin_free(void)
|
void plugin_shutdown(void)
|
||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
DBUG_ENTER("plugin_free");
|
DBUG_ENTER("plugin_shutdown");
|
||||||
plugin_call_deinitializer();
|
|
||||||
|
/*
|
||||||
|
We loop through all plugins and call deinit() if they have one.
|
||||||
|
*/
|
||||||
|
for (i= 0; i < plugin_array.elements; i++)
|
||||||
|
{
|
||||||
|
struct st_plugin_int *tmp= dynamic_element(&plugin_array, i,
|
||||||
|
struct st_plugin_int *);
|
||||||
|
plugin_deinitializer(tmp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
for (i= 0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++)
|
for (i= 0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++)
|
||||||
hash_free(&plugin_hash[i]);
|
hash_free(&plugin_hash[i]);
|
||||||
delete_dynamic(&plugin_array);
|
delete_dynamic(&plugin_array);
|
||||||
@ -841,8 +861,6 @@ my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp->state= PLUGIN_IS_READY;
|
|
||||||
|
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
restore_record(table, s->default_values);
|
restore_record(table, s->default_values);
|
||||||
table->field[0]->store(name->str, name->length, system_charset_info);
|
table->field[0]->store(name->str, name->length, system_charset_info);
|
||||||
|
@ -67,17 +67,14 @@ typedef int (*plugin_type_init)(struct st_plugin_int *);
|
|||||||
extern char *opt_plugin_dir_ptr;
|
extern char *opt_plugin_dir_ptr;
|
||||||
extern char opt_plugin_dir[FN_REFLEN];
|
extern char opt_plugin_dir[FN_REFLEN];
|
||||||
extern const LEX_STRING plugin_type_names[];
|
extern const LEX_STRING plugin_type_names[];
|
||||||
extern int plugin_init(void);
|
extern int plugin_init(int);
|
||||||
extern void plugin_load(void);
|
extern void plugin_shutdown(void);
|
||||||
extern void plugin_free(void);
|
|
||||||
extern my_bool plugin_is_ready(const LEX_STRING *name, int type);
|
extern my_bool plugin_is_ready(const LEX_STRING *name, int type);
|
||||||
extern st_plugin_int *plugin_lock(const LEX_STRING *name, int type);
|
extern st_plugin_int *plugin_lock(const LEX_STRING *name, int type);
|
||||||
extern void plugin_unlock(struct st_plugin_int *plugin);
|
extern void plugin_unlock(struct st_plugin_int *plugin);
|
||||||
extern my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl);
|
extern my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl);
|
||||||
extern my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name);
|
extern my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name);
|
||||||
|
|
||||||
extern my_bool plugin_register_builtin(struct st_mysql_plugin *plugin);
|
|
||||||
|
|
||||||
typedef my_bool (plugin_foreach_func)(THD *thd,
|
typedef my_bool (plugin_foreach_func)(THD *thd,
|
||||||
st_plugin_int *plugin,
|
st_plugin_int *plugin,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user