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()) {