summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-07-11 19:29:23 -0600
committerunknown <sasha@mysql.sashanet.com>2001-07-11 19:29:23 -0600
commit1f41db29053228298bb80ffacbda2baa255820a0 (patch)
tree55c353c4e3afb198a61de2adba223531191957c6
parent2560b327e2127752d5fa54ce325086eed7bbd39d (diff)
downloadmariadb-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.cc21
-rw-r--r--sql/mysqld.cc7
-rw-r--r--sql/slave.cc5
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_repl.cc2
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())
{