diff options
author | unknown <holyfoot/hf@mysql.com/hfmain.(none)> | 2007-11-13 13:09:59 +0400 |
---|---|---|
committer | unknown <holyfoot/hf@mysql.com/hfmain.(none)> | 2007-11-13 13:09:59 +0400 |
commit | b88cfbad684ed57b058a3e6b63d458516b41db85 (patch) | |
tree | 64e928dcd500f0ca2361229714c5e70e64d1678f | |
parent | 5f5696b65a7526ab014d5fe9eba907db2c739c11 (diff) | |
download | mariadb-git-b88cfbad684ed57b058a3e6b63d458516b41db85.tar.gz |
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.
BitKeeper/etc/ignore:
Added libmysqld/scheduler.cc libmysqld/sql_connect.cc libmysqld/sql_tablespace.cc libmysql_r/client_settings.h to the ignore list
libmysqld/lib_sql.cc:
Bug #31868 mysql_server_init crash when language path is not correctly set.
line moved to clean_up()
sql/mysqld.cc:
Bug #31868 mysql_server_init crash when language path is not correctly set.
release_ddl_log() now can be called from common 'clean_up()'
sql/sql_table.cc:
Bug #31868 mysql_server_init crash when language path is not correctly set.
do_release flag added to the global_ddl_log and the construcntor to
set it's initial value.
Also now release_ddl_log() checks for that flag.
-rw-r--r-- | .bzrignore | 4 | ||||
-rw-r--r-- | libmysqld/lib_sql.cc | 1 | ||||
-rw-r--r-- | sql/mysqld.cc | 3 | ||||
-rw-r--r-- | sql/sql_table.cc | 13 |
4 files changed, 16 insertions, 5 deletions
diff --git a/.bzrignore b/.bzrignore index e1ad5a89015..b3cdfeefb4f 100644 --- a/.bzrignore +++ b/.bzrignore @@ -3004,3 +3004,7 @@ win/vs71cache.txt win/vs8cache.txt zlib/*.ds? zlib/*.vcproj +libmysqld/scheduler.cc +libmysqld/sql_connect.cc +libmysqld/sql_tablespace.cc +libmysql_r/client_settings.h diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 4e525f8447f..e9c54a3bd5c 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -551,7 +551,6 @@ void end_embedded_server() { my_free((char*) copy_arguments_ptr, MYF(MY_ALLOW_ZERO_PTR)); copy_arguments_ptr=0; - release_ddl_log(); clean_up(0); } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a355c560996..09fe7fc1f2e 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1164,6 +1164,8 @@ void clean_up(bool print_message) if (cleanup_done++) return; /* purecov: inspected */ + release_ddl_log(); + /* make sure that handlers finish up 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); (void) pthread_mutex_unlock(&LOCK_thread_count); - release_ddl_log(); #if defined(__WIN__) && !defined(EMBEDDED_LIBRARY) if (Service.IsNT() && start_mode) Service.Stop(); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 86d1fe79a00..a8efdac57dc 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -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 @@ -297,10 +297,12 @@ typedef struct st_global_ddl_log uint name_len; uint io_size; bool inited; + bool do_release; 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; @@ -460,6 +462,7 @@ static uint read_ddl_log_header() global_ddl_log.first_used= NULL; global_ddl_log.num_entries= 0; VOID(pthread_mutex_init(&LOCK_gdl, MY_MUTEX_INIT_FAST)); + global_ddl_log.do_release= true; DBUG_RETURN(entry_no); } @@ -1150,6 +1153,9 @@ void release_ddl_log() DDL_LOG_MEMORY_ENTRY *used_list= global_ddl_log.first_used; DBUG_ENTER("release_ddl_log"); + if (!global_ddl_log.do_release) + DBUG_VOID_RETURN; + pthread_mutex_lock(&LOCK_gdl); while (used_list) { @@ -1167,6 +1173,7 @@ void release_ddl_log() global_ddl_log.inited= 0; pthread_mutex_unlock(&LOCK_gdl); VOID(pthread_mutex_destroy(&LOCK_gdl)); + global_ddl_log.do_release= false; DBUG_VOID_RETURN; } |