summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-11-13 13:09:59 +0400
committerunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-11-13 13:09:59 +0400
commitb88cfbad684ed57b058a3e6b63d458516b41db85 (patch)
tree64e928dcd500f0ca2361229714c5e70e64d1678f
parent5f5696b65a7526ab014d5fe9eba907db2c739c11 (diff)
downloadmariadb-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--.bzrignore4
-rw-r--r--libmysqld/lib_sql.cc1
-rw-r--r--sql/mysqld.cc3
-rw-r--r--sql/sql_table.cc13
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;
}