diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-07-11 19:29:23 -0600 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-07-11 19:29:23 -0600 |
commit | 1f41db29053228298bb80ffacbda2baa255820a0 (patch) | |
tree | 55c353c4e3afb198a61de2adba223531191957c6 | |
parent | 2560b327e2127752d5fa54ce325086eed7bbd39d (diff) | |
download | mariadb-git-1f41db29053228298bb80ffacbda2baa255820a0.tar.gz |
fixed race condition in automatic binlog rotation
remove extension from binary log if the user specifies one to avoid
non-rotatable logs
fixed possible use of unitialized IO_CACHE in debug mode
sql/log.cc:
fixed race condition in automatic binlog rotation
sql/mysqld.cc:
remove extension from binary log if the user specifies one to avoid
non-rotatable logs
sql/slave.cc:
fixed race condition with slave thread during server shutdown
sql/sql_class.h:
new_file() needed an argument to know if it was called withing the
log mutex or not
sql/sql_repl.cc:
fixed possible use of unitialized IO_CACHE in debug mode
-rw-r--r-- | sql/log.cc | 21 | ||||
-rw-r--r-- | sql/mysqld.cc | 7 | ||||
-rw-r--r-- | sql/slave.cc | 5 | ||||
-rw-r--r-- | sql/sql_class.h | 2 | ||||
-rw-r--r-- | sql/sql_repl.cc | 2 |
5 files changed, 27 insertions, 10 deletions
diff --git a/sql/log.cc b/sql/log.cc index 1654f711af8..33e6ba1de45 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -511,17 +511,19 @@ bool MYSQL_LOG::is_active(const char* log_file_name) return inited && !strcmp(log_file_name, this->log_file_name); } -void MYSQL_LOG::new_file() +void MYSQL_LOG::new_file(bool inside_mutex) { // only rotate open logs that are marked non-rotatable // (binlog with constant name are non-rotatable) if (is_open() && ! no_rotate) { char new_name[FN_REFLEN], *old_name=name; - VOID(pthread_mutex_lock(&LOCK_log)); + if (!inside_mutex) + VOID(pthread_mutex_lock(&LOCK_log)); if (generate_new_name(new_name, name)) { - VOID(pthread_mutex_unlock(&LOCK_log)); + if (!inside_mutex) + VOID(pthread_mutex_unlock(&LOCK_log)); return; // Something went wrong } if (log_type == LOG_BIN) @@ -540,7 +542,8 @@ void MYSQL_LOG::new_file() my_free(old_name,MYF(0)); last_time=query_start=0; write_error=0; - VOID(pthread_mutex_unlock(&LOCK_log)); + if (!inside_mutex) + VOID(pthread_mutex_unlock(&LOCK_log)); } } @@ -695,9 +698,9 @@ err: if (file == &log_file) VOID(pthread_cond_broadcast(&COND_binlog_update)); } + if (should_rotate) + new_file(1); // inside mutex VOID(pthread_mutex_unlock(&LOCK_log)); - if(should_rotate) - new_file(); return error; } @@ -782,11 +785,13 @@ bool MYSQL_LOG::write(Load_log_event* event_info) VOID(pthread_cond_broadcast(&COND_binlog_update)); } } + + if(should_rotate) + new_file(1); // inside mutex + VOID(pthread_mutex_unlock(&LOCK_log)); } - if(should_rotate) - new_file(); return error; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index deec34d6754..12fa557635f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1477,6 +1477,13 @@ static void open_log(MYSQL_LOG *log, const char *hostname, strmov(strcend(tmp,'.'),extension); opt_name=tmp; } + // get rid of extention if the log is binary to avoid problems + if (type == LOG_BIN) + { + char* p = strrchr(opt_name, FN_EXTCHAR); + if (p) + *p = 0; + } log->open(opt_name,type); } diff --git a/sql/slave.cc b/sql/slave.cc index 9814f707d93..d758db1abd1 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -189,6 +189,11 @@ static void free_string_array(DYNAMIC_ARRAY *a) void end_slave() { + pthread_mutex_lock(&LOCK_slave); + while (slave_running) + pthread_cond_wait(&COND_slave_stopped, &LOCK_slave); + pthread_mutex_unlock(&LOCK_slave); + end_master_info(&glob_mi); if(do_table_inited) hash_free(&replicate_do_table); diff --git a/sql/sql_class.h b/sql/sql_class.h index 438898ca294..a092de2602d 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -74,7 +74,7 @@ public: void init(enum_log_type log_type_arg); void open(const char *log_name,enum_log_type log_type, const char *new_name=0); - void new_file(void); + void new_file(bool inside_mutex = 0); bool open_index(int options); void close_index(); bool write(THD *thd, enum enum_server_command command,const char *format,...); diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index b0c7e64a5e0..3cb805ed796 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -274,6 +274,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags) int left_events = max_binlog_dump_events; #endif DBUG_ENTER("mysql_binlog_send"); + bzero((char*) &log,sizeof(log)); #ifndef DBUG_OFF if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2)) @@ -283,7 +284,6 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags) } #endif - bzero((char*) &log,sizeof(log)); if(!mysql_bin_log.is_open()) { |