mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug#53251 mysql_library_init fails on second execution with embedded library
thread-specific variables weren't set when we load error message files. per-file comments: libmysqld/lib_sql.cc Bug#53251 mysql_library_init fails on second execution with embedded library we need to call my_thread_init() once more. Normally it's called at the my_init() stage but that doesn't happen on the second my_init() call. sql/derror.cc Bug#53251 mysql_library_init fails on second execution with embedded library use default errors for the embedded server. sql/mysqld.cc Bug#53251 mysql_library_init fails on second execution with embedded library unregister server errors in clean_up(). Without it the error list contains that on the second mysql_server_init() which is not good. sql/set_var.cc Bug#53251 mysql_library_init fails on second execution with embedded library sys_var::cleanup() call instead of the destructor sql/set_var.h Bug#53251 mysql_library_init fails on second execution with embedded library sys_var::cleanup() introduced instead of the destructor sql/sys_vars.h Bug#53251 mysql_library_init fails on second execution with embedded library Sys_var_charptr::cleanup() implemented
This commit is contained in:
@ -481,6 +481,10 @@ int init_embedded_server(int argc, char **argv, char **groups)
|
|||||||
char *fake_argv[] = { (char *)"", 0 };
|
char *fake_argv[] = { (char *)"", 0 };
|
||||||
const char *fake_groups[] = { "server", "embedded", 0 };
|
const char *fake_groups[] = { "server", "embedded", 0 };
|
||||||
my_bool acl_error;
|
my_bool acl_error;
|
||||||
|
|
||||||
|
if (my_thread_init())
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (argc)
|
if (argc)
|
||||||
{
|
{
|
||||||
argcp= &argc;
|
argcp= &argc;
|
||||||
|
@ -35,6 +35,8 @@ static void init_myfunc_errs(void);
|
|||||||
C_MODE_START
|
C_MODE_START
|
||||||
static const char **get_server_errmsgs()
|
static const char **get_server_errmsgs()
|
||||||
{
|
{
|
||||||
|
if (!current_thd)
|
||||||
|
return DEFAULT_ERRMSGS;
|
||||||
return CURRENT_THD_ERRMSGS;
|
return CURRENT_THD_ERRMSGS;
|
||||||
}
|
}
|
||||||
C_MODE_END
|
C_MODE_END
|
||||||
|
@ -1486,6 +1486,7 @@ void clean_up(bool print_message)
|
|||||||
cleanup_errmsgs();
|
cleanup_errmsgs();
|
||||||
MYSQL_CALLBACK(thread_scheduler, end, ());
|
MYSQL_CALLBACK(thread_scheduler, end, ());
|
||||||
finish_client_errs();
|
finish_client_errs();
|
||||||
|
(void) my_error_unregister(ER_ERROR_FIRST, ER_ERROR_LAST); // finish server errs
|
||||||
DBUG_PRINT("quit", ("Error messages freed"));
|
DBUG_PRINT("quit", ("Error messages freed"));
|
||||||
/* Tell main we are ready */
|
/* Tell main we are ready */
|
||||||
logger.cleanup_end();
|
logger.cleanup_end();
|
||||||
|
@ -108,7 +108,7 @@ void sys_var_end()
|
|||||||
my_hash_free(&system_variable_hash);
|
my_hash_free(&system_variable_hash);
|
||||||
|
|
||||||
for (sys_var *var=all_sys_vars.first; var; var= var->next)
|
for (sys_var *var=all_sys_vars.first; var; var= var->next)
|
||||||
var->~sys_var();
|
var->cleanup();
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
@ -92,10 +92,9 @@ public:
|
|||||||
on_check_function on_check_func, on_update_function on_update_func,
|
on_check_function on_check_func, on_update_function on_update_func,
|
||||||
uint deprecated_version, const char *substitute, int parse_flag);
|
uint deprecated_version, const char *substitute, int parse_flag);
|
||||||
/**
|
/**
|
||||||
The instance should only be destroyed on shutdown, as it doesn't unlink
|
All the cleanup procedures should be performed here
|
||||||
itself from the chain.
|
|
||||||
*/
|
*/
|
||||||
virtual ~sys_var() {}
|
virtual void cleanup() {}
|
||||||
/**
|
/**
|
||||||
downcast for sys_var_pluginvar. Returns this if it's an instance
|
downcast for sys_var_pluginvar. Returns this if it's an instance
|
||||||
of sys_var_pluginvar, and 0 otherwise.
|
of sys_var_pluginvar, and 0 otherwise.
|
||||||
|
@ -385,7 +385,7 @@ public:
|
|||||||
DBUG_ASSERT(scope() == GLOBAL);
|
DBUG_ASSERT(scope() == GLOBAL);
|
||||||
DBUG_ASSERT(size == sizeof(char *));
|
DBUG_ASSERT(size == sizeof(char *));
|
||||||
}
|
}
|
||||||
~Sys_var_charptr()
|
void cleanup()
|
||||||
{
|
{
|
||||||
if (flags & ALLOCATED)
|
if (flags & ALLOCATED)
|
||||||
my_free(global_var(char*));
|
my_free(global_var(char*));
|
||||||
|
Reference in New Issue
Block a user