summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorAndrei Elkin <aelkin@mysql.com>2009-06-23 12:10:04 +0300
committerAndrei Elkin <aelkin@mysql.com>2009-06-23 12:10:04 +0300
commite2ac8c07bdd2e58f5f7b4919a76a0d1881f3ed5e (patch)
tree56e72dd0dbb12bfe48e2228710ee7c8d2f46792f /sql/slave.cc
parentf3bdd56fe66736b7776e2c80b001ce3dc198cfa2 (diff)
downloadmariadb-git-e2ac8c07bdd2e58f5f7b4919a76a0d1881f3ed5e.tar.gz
Bug #38240 Crash in safe_mutex_lock () thr_mutex.c line 97 on rotate_relay_log
The reason for the crash was rotate_relay_log (mi=0x0) did not verify the passed value of active_mi. There are more cases where active_mi is supposed to be non-zero e.g change_master(), stop_slave(), and it's reasonable to protect from a similar crash all of them with common fixes. Fixed with spliting end_slave() in slave threads release and slave data clean-up parts (a new close_active_mi()). The new function is invoked at the very end of close_connections() so that all users of active_mi are proven to have left. sql/mysqld.cc: added the 2nd part (data) of the slave's clean up. sql/slave.cc: end_slave() is split in two part to release the slave threads and the remained resources separately. The new close_active_mi() should be called after all possible users ofactive_mi has left, i.e at the very end of close_connections(). sql/slave.h: interface to the new end_active_mi() function is added.
Diffstat (limited to 'sql/slave.cc')
-rw-r--r--sql/slave.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/sql/slave.cc b/sql/slave.cc
index 043b0e3fed5..5570a07c02d 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -668,7 +668,7 @@ static int end_slave_on_walk(Master_info* mi, uchar* /*unused*/)
/*
- Free all resources used by slave
+ Release slave threads at time of executing shutdown.
SYNOPSIS
end_slave()
@@ -694,15 +694,32 @@ void end_slave()
once multi-master code is ready.
*/
terminate_slave_threads(active_mi,SLAVE_FORCE_ALL);
+ }
+ pthread_mutex_unlock(&LOCK_active_mi);
+ DBUG_VOID_RETURN;
+}
+
+/**
+ Free all resources used by slave threads at time of executing shutdown.
+ The routine must be called after all possible users of @c active_mi
+ have left.
+
+ SYNOPSIS
+ close_active_mi()
+
+*/
+void close_active_mi()
+{
+ pthread_mutex_lock(&LOCK_active_mi);
+ if (active_mi)
+ {
end_master_info(active_mi);
delete active_mi;
active_mi= 0;
}
pthread_mutex_unlock(&LOCK_active_mi);
- DBUG_VOID_RETURN;
}
-
static bool io_slave_killed(THD* thd, Master_info* mi)
{
DBUG_ENTER("io_slave_killed");