Commit 5c3ac45c authored by brian@zim.(none)'s avatar brian@zim.(none)

Re'ordering of startup. Fixed Execution path issues. Added function for...

Re'ordering of startup. Fixed Execution path issues. Added function for de'initing everything. This includes Antony's suggestions (bk collapse uber alles!)
parent 7216b5bc
...@@ -430,12 +430,6 @@ int ha_initialize_handlerton(st_plugin_int *plugin) ...@@ -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) ...@@ -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, ...@@ -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."); ...@@ -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."); ...@@ -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]; ...@@ -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 ...@@ -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,26 +461,13 @@ static my_bool plugin_add(const LEX_STRING *name, const LEX_STRING *dl, int repo ...@@ -466,26 +461,13 @@ 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)
{
SHOW_VAR array[2]= {
{plugin->name, (char*)plugin->status_vars, SHOW_ARRAY},
{0, 0, SHOW_UNDEF}
};
remove_status_vars(array);
}
plugin_dl_del(dl); plugin_dl_del(dl);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
static void plugin_del(const LEX_STRING *name) void plugin_deinitializer(struct st_plugin_int *plugin)
{ {
uint i;
struct st_plugin_int *plugin;
DBUG_ENTER("plugin_del");
if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)))
{
if (plugin->plugin->status_vars) if (plugin->plugin->status_vars)
{ {
SHOW_VAR array[2]= { SHOW_VAR array[2]= {
...@@ -494,6 +476,31 @@ static void plugin_del(const LEX_STRING *name) ...@@ -494,6 +476,31 @@ static void plugin_del(const LEX_STRING *name)
}; };
remove_status_vars(array); remove_status_vars(array);
} }
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;
}
}
static void plugin_del(const LEX_STRING *name)
{
uint i;
struct st_plugin_int *plugin;
DBUG_ENTER("plugin_del");
if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)))
{
plugin_deinitializer(plugin);
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) ...@@ -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) ...@@ -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: ...@@ -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, ...@@ -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) ...@@ -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 (plugin_register_builtin(plugin)) // if (!(strcmp(plugin->name, "MyISAM")))
goto err; {
struct st_plugin_int *tmp=dynamic_element(&plugin_array, if (plugin_register_builtin(plugin))
plugin_array.elements-1, goto err;
struct st_plugin_int *); struct st_plugin_int *tmp= dynamic_element(&plugin_array,
if (plugin_initialize(tmp)) plugin_array.elements-1,
goto err; struct st_plugin_int *);
tmp->state= PLUGIN_IS_READY; if (plugin_initialize(tmp))
goto err;
}
} }
} }
/* 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) ...@@ -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) ...@@ -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: ...@@ -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 ...@@ -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 *); ...@@ -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);
......
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