summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/handler.cc6
-rw-r--r--sql/mysqld.cc7
-rw-r--r--sql/sql_plugin.cc192
-rw-r--r--sql/sql_plugin.h7
4 files changed, 110 insertions, 102 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index dd1be47e3c2..465919d49a8 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -430,12 +430,6 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
savepoint_alloc_size+= tmp;
hton->slot= total_ha++;
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)
total_ha_2pc++;
break;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 46f5e0ae4e9..9b2f61ee2cf 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1186,7 +1186,7 @@ void clean_up(bool print_message)
udf_free();
#endif
}
- plugin_free();
+ plugin_shutdown();
if (tc_log)
tc_log->close();
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
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.
*/
if (add_status_vars(status_vars))
@@ -3178,7 +3178,7 @@ server.");
using_update_log=1;
}
- if (plugin_init())
+ if (plugin_init(0))
{
sql_print_error("Failed to init plugins.");
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)
{
- plugin_load();
#ifdef HAVE_DLOPEN
udf_init();
#endif
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 074999a52cf..9db7c743a40 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -63,6 +63,10 @@ static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM];
static rw_lock_t THR_LOCK_plugin;
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)
{
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.ref_count= 0;
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)))
goto err;
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
if (report & REPORT_TO_LOG)
sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), name->str);
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);
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)
{
SHOW_VAR array[2]= {
@@ -494,6 +476,31 @@ static void plugin_del(const LEX_STRING *name)
};
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);
plugin_dl_del(&plugin->plugin_dl->dl);
plugin->state= PLUGIN_IS_FREED;
@@ -523,6 +530,26 @@ static int plugin_initialize(struct st_plugin_int *plugin)
{
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())
@@ -540,6 +567,8 @@ static int plugin_initialize(struct st_plugin_int *plugin)
goto err;
}
+ plugin->state= PLUGIN_IS_READY;
+
DBUG_RETURN(0);
err:
DBUG_RETURN(1);
@@ -592,52 +621,6 @@ err:
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,
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;
struct st_mysql_plugin **builtins;
@@ -672,24 +662,46 @@ int plugin_init(void)
goto err;
}
- /* Register all the built-in plugins */
+ /*
+ First we register builtin plugins
+ */
for (builtins= mysqld_builtins; *builtins; builtins++)
{
for (plugin= *builtins; plugin->info; plugin++)
{
- if (plugin_register_builtin(plugin))
- goto err;
- struct st_plugin_int *tmp=dynamic_element(&plugin_array,
- plugin_array.elements-1,
- struct st_plugin_int *);
- if (plugin_initialize(tmp))
- goto err;
- tmp->state= PLUGIN_IS_READY;
+// if (!(strcmp(plugin->name, "MyISAM")))
+ {
+ if (plugin_register_builtin(plugin))
+ goto err;
+ struct st_plugin_int *tmp= dynamic_element(&plugin_array,
+ plugin_array.elements-1,
+ struct st_plugin_int *);
+ if (plugin_initialize(tmp))
+ goto err;
+ }
}
}
+ /* Register all dynamic plugins */
+ if (!skip_dynamic_loading)
+ plugin_load();
+
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);
err:
@@ -734,8 +746,6 @@ void plugin_load(void)
THD *new_thd;
DBUG_ENTER("plugin_load");
- DBUG_ASSERT(initialized);
-
if (!(new_thd= new THD))
{
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'.",
name.str, dl.str));
}
- plugin_call_initializer();
if (error > 0)
sql_print_error(ER(ER_GET_ERRNO), my_errno);
end_read_record(&read_record_info);
@@ -787,11 +796,22 @@ end:
}
-void plugin_free(void)
+void plugin_shutdown(void)
{
uint i;
- DBUG_ENTER("plugin_free");
- plugin_call_deinitializer();
+ DBUG_ENTER("plugin_shutdown");
+
+ /*
+ 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++)
hash_free(&plugin_hash[i]);
delete_dynamic(&plugin_array);
@@ -841,8 +861,6 @@ my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING
goto err;
}
- tmp->state= PLUGIN_IS_READY;
-
table->use_all_columns();
restore_record(table, s->default_values);
table->field[0]->store(name->str, name->length, system_charset_info);
diff --git a/sql/sql_plugin.h b/sql/sql_plugin.h
index df7c9a39495..ed7ba36ac84 100644
--- a/sql/sql_plugin.h
+++ b/sql/sql_plugin.h
@@ -67,17 +67,14 @@ typedef int (*plugin_type_init)(struct st_plugin_int *);
extern char *opt_plugin_dir_ptr;
extern char opt_plugin_dir[FN_REFLEN];
extern const LEX_STRING plugin_type_names[];
-extern int plugin_init(void);
-extern void plugin_load(void);
-extern void plugin_free(void);
+extern int plugin_init(int);
+extern void plugin_shutdown(void);
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 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_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,
st_plugin_int *plugin,
void *arg);