Commit d5330f34 authored by Alexey Botchkov's avatar Alexey Botchkov

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
parent 68b34ff1
...@@ -481,6 +481,10 @@ int init_embedded_server(int argc, char **argv, char **groups) ...@@ -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); ...@@ -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) ...@@ -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() ...@@ -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 @@ class sys_var ...@@ -92,10 +92,9 @@ class sys_var
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 @@ class Sys_var_charptr: public sys_var ...@@ -385,7 +385,7 @@ class Sys_var_charptr: public sys_var
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*));
......
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