mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
lp:790513 MariaDB crashes on startup
initialize plugins earlier, to support, for example, non-MyISAM mysql.plugin table.
This commit is contained in:
parent
018614e2b3
commit
135ce0ba6c
3 changed files with 62 additions and 16 deletions
11
mysql-test/r/plugin_innodb.result
Normal file
11
mysql-test/r/plugin_innodb.result
Normal file
|
@ -0,0 +1,11 @@
|
|||
install plugin example soname 'ha_example.so';
|
||||
create table t1(a int) engine=example;
|
||||
drop table t1;
|
||||
alter table mysql.plugin engine=innodb;
|
||||
restart
|
||||
create table t1(a int) engine=example;
|
||||
select * from t1;
|
||||
a
|
||||
drop table t1;
|
||||
alter table mysql.plugin engine=myisam;
|
||||
uninstall plugin example;
|
27
mysql-test/t/plugin_innodb.test
Normal file
27
mysql-test/t/plugin_innodb.test
Normal file
|
@ -0,0 +1,27 @@
|
|||
--source include/not_embedded.inc
|
||||
--source include/have_example_plugin.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
if (!`select count(*) from information_schema.plugins
|
||||
where plugin_name = 'innodb' and plugin_status = 'active' and
|
||||
plugin_library is null`) {
|
||||
skip Need compiled-in InnoDB;
|
||||
}
|
||||
|
||||
|
||||
--replace_regex /\.dll/.so/
|
||||
eval install plugin example soname '$HA_EXAMPLE_SO';
|
||||
create table t1(a int) engine=example;
|
||||
drop table t1;
|
||||
|
||||
alter table mysql.plugin engine=innodb;
|
||||
--echo restart
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
create table t1(a int) engine=example;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
alter table mysql.plugin engine=myisam;
|
||||
uninstall plugin example;
|
||||
|
|
@ -1232,15 +1232,23 @@ int plugin_init(int *argc, char **argv, int flags)
|
|||
if (register_builtin(plugin, &tmp, &plugin_ptr))
|
||||
goto err_unlock;
|
||||
|
||||
/* only initialize MyISAM and CSV at this stage */
|
||||
if (!(is_myisam=
|
||||
!my_strcasecmp(&my_charset_latin1, plugin->name, "MyISAM")) &&
|
||||
my_strcasecmp(&my_charset_latin1, plugin->name, "CSV"))
|
||||
continue;
|
||||
is_myisam= !my_strcasecmp(&my_charset_latin1, plugin->name, "MyISAM");
|
||||
|
||||
if (plugin_ptr->state == PLUGIN_IS_UNINITIALIZED &&
|
||||
plugin_initialize(plugin_ptr))
|
||||
goto err_unlock;
|
||||
/*
|
||||
strictly speaking, we should to initialize all plugins,
|
||||
even for mysqld --help, because important subsystems
|
||||
may be disabled otherwise, and the help will be incomplete.
|
||||
For example, if the mysql.plugin table is not MyISAM.
|
||||
But for now it's an unlikely corner case, and to optimize
|
||||
mysqld --help for all other users, we will only initialize
|
||||
MyISAM here.
|
||||
*/
|
||||
if (!(flags & PLUGIN_INIT_SKIP_INITIALIZATION) || is_myisam)
|
||||
{
|
||||
if (plugin_ptr->state == PLUGIN_IS_UNINITIALIZED &&
|
||||
plugin_initialize(plugin_ptr))
|
||||
goto err_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
initialize the global default storage engine so that it may
|
||||
|
@ -1445,13 +1453,6 @@ static void plugin_load(MEM_ROOT *tmp_root, int *argc, char **argv)
|
|||
table= tables.table;
|
||||
init_read_record(&read_record_info, new_thd, table, NULL, 1, 0, FALSE);
|
||||
table->use_all_columns();
|
||||
/*
|
||||
there're no other threads running yet, so we don't need a mutex.
|
||||
but plugin_add() before is designed to work in multi-threaded
|
||||
environment, and it uses safe_mutex_assert_owner(), so we lock
|
||||
the mutex here to satisfy the assert
|
||||
*/
|
||||
pthread_mutex_lock(&LOCK_plugin);
|
||||
while (!(error= read_record_info.read_record(&read_record_info)))
|
||||
{
|
||||
DBUG_PRINT("info", ("init plugin record"));
|
||||
|
@ -1462,12 +1463,19 @@ static void plugin_load(MEM_ROOT *tmp_root, int *argc, char **argv)
|
|||
LEX_STRING name= {(char *)str_name.ptr(), str_name.length()};
|
||||
LEX_STRING dl= {(char *)str_dl.ptr(), str_dl.length()};
|
||||
|
||||
/*
|
||||
there're no other threads running yet, so we don't need a mutex.
|
||||
but plugin_add() before is designed to work in multi-threaded
|
||||
environment, and it uses safe_mutex_assert_owner(), so we lock
|
||||
the mutex here to satisfy the assert
|
||||
*/
|
||||
pthread_mutex_lock(&LOCK_plugin);
|
||||
if (plugin_add(tmp_root, &name, &dl, argc, argv, REPORT_TO_LOG))
|
||||
sql_print_warning("Couldn't load plugin named '%s' with soname '%s'.",
|
||||
str_name.c_ptr(), str_dl.c_ptr());
|
||||
free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
|
||||
pthread_mutex_unlock(&LOCK_plugin);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_plugin);
|
||||
if (error > 0)
|
||||
sql_print_error(ER(ER_GET_ERRNO), my_errno);
|
||||
end_read_record(&read_record_info);
|
||||
|
|
Loading…
Add table
Reference in a new issue