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
parent b6273bfc
...@@ -511,16 +511,18 @@ bool MYSQL_LOG::is_active(const char* log_file_name) ...@@ -511,16 +511,18 @@ bool MYSQL_LOG::is_active(const char* log_file_name)
return inited && !strcmp(log_file_name, this->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 // only rotate open logs that are marked non-rotatable
// (binlog with constant name are non-rotatable) // (binlog with constant name are non-rotatable)
if (is_open() && ! no_rotate) if (is_open() && ! no_rotate)
{ {
char new_name[FN_REFLEN], *old_name=name; char new_name[FN_REFLEN], *old_name=name;
if (!inside_mutex)
VOID(pthread_mutex_lock(&LOCK_log)); VOID(pthread_mutex_lock(&LOCK_log));
if (generate_new_name(new_name, name)) if (generate_new_name(new_name, name))
{ {
if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
return; // Something went wrong return; // Something went wrong
} }
...@@ -540,6 +542,7 @@ void MYSQL_LOG::new_file() ...@@ -540,6 +542,7 @@ void MYSQL_LOG::new_file()
my_free(old_name,MYF(0)); my_free(old_name,MYF(0));
last_time=query_start=0; last_time=query_start=0;
write_error=0; write_error=0;
if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
} }
} }
...@@ -695,9 +698,9 @@ err: ...@@ -695,9 +698,9 @@ err:
if (file == &log_file) if (file == &log_file)
VOID(pthread_cond_broadcast(&COND_binlog_update)); VOID(pthread_cond_broadcast(&COND_binlog_update));
} }
if (should_rotate)
new_file(1); // inside mutex
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
if(should_rotate)
new_file();
return error; return error;
} }
...@@ -782,11 +785,13 @@ bool MYSQL_LOG::write(Load_log_event* event_info) ...@@ -782,11 +785,13 @@ bool MYSQL_LOG::write(Load_log_event* event_info)
VOID(pthread_cond_broadcast(&COND_binlog_update)); VOID(pthread_cond_broadcast(&COND_binlog_update));
} }
} }
if(should_rotate)
new_file(1); // inside mutex
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
} }
if(should_rotate)
new_file();
return error; return error;
} }
......
...@@ -1477,6 +1477,13 @@ static void open_log(MYSQL_LOG *log, const char *hostname, ...@@ -1477,6 +1477,13 @@ static void open_log(MYSQL_LOG *log, const char *hostname,
strmov(strcend(tmp,'.'),extension); strmov(strcend(tmp,'.'),extension);
opt_name=tmp; 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); log->open(opt_name,type);
} }
......
...@@ -189,6 +189,11 @@ static void free_string_array(DYNAMIC_ARRAY *a) ...@@ -189,6 +189,11 @@ static void free_string_array(DYNAMIC_ARRAY *a)
void end_slave() 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); end_master_info(&glob_mi);
if(do_table_inited) if(do_table_inited)
hash_free(&replicate_do_table); hash_free(&replicate_do_table);
......
...@@ -74,7 +74,7 @@ public: ...@@ -74,7 +74,7 @@ public:
void init(enum_log_type log_type_arg); void init(enum_log_type log_type_arg);
void open(const char *log_name,enum_log_type log_type, void open(const char *log_name,enum_log_type log_type,
const char *new_name=0); const char *new_name=0);
void new_file(void); void new_file(bool inside_mutex = 0);
bool open_index(int options); bool open_index(int options);
void close_index(); void close_index();
bool write(THD *thd, enum enum_server_command command,const char *format,...); bool write(THD *thd, enum enum_server_command command,const char *format,...);
......
...@@ -274,6 +274,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags) ...@@ -274,6 +274,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags)
int left_events = max_binlog_dump_events; int left_events = max_binlog_dump_events;
#endif #endif
DBUG_ENTER("mysql_binlog_send"); DBUG_ENTER("mysql_binlog_send");
bzero((char*) &log,sizeof(log));
#ifndef DBUG_OFF #ifndef DBUG_OFF
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2)) 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) ...@@ -283,7 +284,6 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags)
} }
#endif #endif
bzero((char*) &log,sizeof(log));
if(!mysql_bin_log.is_open()) if(!mysql_bin_log.is_open())
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment