mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #31868 mysql_server_init crash when language path is not correctly set.
When mysql_server_init() interrupts on some error (wrong errmsg file for example) in the middle of it's execution, it doesn't call execute_ddl_log_recovery() so LOCK_gdl mutex isn't init-ed. In this case we shouldn't execute release_ddl_log during cleanup as it uses that mutex inside.
This commit is contained in:
@ -3004,3 +3004,7 @@ win/vs71cache.txt
|
|||||||
win/vs8cache.txt
|
win/vs8cache.txt
|
||||||
zlib/*.ds?
|
zlib/*.ds?
|
||||||
zlib/*.vcproj
|
zlib/*.vcproj
|
||||||
|
libmysqld/scheduler.cc
|
||||||
|
libmysqld/sql_connect.cc
|
||||||
|
libmysqld/sql_tablespace.cc
|
||||||
|
libmysql_r/client_settings.h
|
||||||
|
@ -551,7 +551,6 @@ void end_embedded_server()
|
|||||||
{
|
{
|
||||||
my_free((char*) copy_arguments_ptr, MYF(MY_ALLOW_ZERO_PTR));
|
my_free((char*) copy_arguments_ptr, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
copy_arguments_ptr=0;
|
copy_arguments_ptr=0;
|
||||||
release_ddl_log();
|
|
||||||
clean_up(0);
|
clean_up(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1164,6 +1164,8 @@ void clean_up(bool print_message)
|
|||||||
if (cleanup_done++)
|
if (cleanup_done++)
|
||||||
return; /* purecov: inspected */
|
return; /* purecov: inspected */
|
||||||
|
|
||||||
|
release_ddl_log();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
make sure that handlers finish up
|
make sure that handlers finish up
|
||||||
what they have that is dependent on the binlog
|
what they have that is dependent on the binlog
|
||||||
@ -3995,7 +3997,6 @@ we force server id to 2, but this MySQL server will not act as a slave.");
|
|||||||
pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
|
pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
|
||||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
|
|
||||||
release_ddl_log();
|
|
||||||
#if defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
|
#if defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
|
||||||
if (Service.IsNT() && start_mode)
|
if (Service.IsNT() && start_mode)
|
||||||
Service.Stop();
|
Service.Stop();
|
||||||
|
@ -279,7 +279,7 @@ uint build_tmptable_filename(THD* thd, char *buff, size_t bufflen)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
typedef struct st_global_ddl_log
|
struct st_global_ddl_log
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
We need to adjust buffer size to be able to handle downgrades/upgrades
|
We need to adjust buffer size to be able to handle downgrades/upgrades
|
||||||
@ -297,10 +297,12 @@ typedef struct st_global_ddl_log
|
|||||||
uint name_len;
|
uint name_len;
|
||||||
uint io_size;
|
uint io_size;
|
||||||
bool inited;
|
bool inited;
|
||||||
|
bool do_release;
|
||||||
bool recovery_phase;
|
bool recovery_phase;
|
||||||
} GLOBAL_DDL_LOG;
|
st_global_ddl_log() : inited(false), do_release(false) {}
|
||||||
|
};
|
||||||
|
|
||||||
GLOBAL_DDL_LOG global_ddl_log;
|
st_global_ddl_log global_ddl_log;
|
||||||
|
|
||||||
pthread_mutex_t LOCK_gdl;
|
pthread_mutex_t LOCK_gdl;
|
||||||
|
|
||||||
@ -460,6 +462,7 @@ static uint read_ddl_log_header()
|
|||||||
global_ddl_log.first_used= NULL;
|
global_ddl_log.first_used= NULL;
|
||||||
global_ddl_log.num_entries= 0;
|
global_ddl_log.num_entries= 0;
|
||||||
VOID(pthread_mutex_init(&LOCK_gdl, MY_MUTEX_INIT_FAST));
|
VOID(pthread_mutex_init(&LOCK_gdl, MY_MUTEX_INIT_FAST));
|
||||||
|
global_ddl_log.do_release= true;
|
||||||
DBUG_RETURN(entry_no);
|
DBUG_RETURN(entry_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1150,6 +1153,9 @@ void release_ddl_log()
|
|||||||
DDL_LOG_MEMORY_ENTRY *used_list= global_ddl_log.first_used;
|
DDL_LOG_MEMORY_ENTRY *used_list= global_ddl_log.first_used;
|
||||||
DBUG_ENTER("release_ddl_log");
|
DBUG_ENTER("release_ddl_log");
|
||||||
|
|
||||||
|
if (!global_ddl_log.do_release)
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_gdl);
|
pthread_mutex_lock(&LOCK_gdl);
|
||||||
while (used_list)
|
while (used_list)
|
||||||
{
|
{
|
||||||
@ -1167,6 +1173,7 @@ void release_ddl_log()
|
|||||||
global_ddl_log.inited= 0;
|
global_ddl_log.inited= 0;
|
||||||
pthread_mutex_unlock(&LOCK_gdl);
|
pthread_mutex_unlock(&LOCK_gdl);
|
||||||
VOID(pthread_mutex_destroy(&LOCK_gdl));
|
VOID(pthread_mutex_destroy(&LOCK_gdl));
|
||||||
|
global_ddl_log.do_release= false;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user