summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorunknown <rafal@quant.(none)>2007-02-23 01:28:24 +0100
committerunknown <rafal@quant.(none)>2007-02-23 01:28:24 +0100
commit44bdb07028c797963775549f8a181f5aa0801be0 (patch)
tree7ea5cd00d7cb57b18e1f313f35d2efdadf7a9032 /sql/slave.cc
parent9dfb1d9011cf5b31d139d3904a0bf3afae91ad24 (diff)
parentd51d6adca7947c3fde0263b9f8da78788dc5b3f5 (diff)
downloadmariadb-git-44bdb07028c797963775549f8a181f5aa0801be0.tar.gz
Merge quant.(none):/ext/mysql/bkroot/mysql-5.0-rpl
into quant.(none):/ext/mysql/bk/mysql-5.0-bug25306 sql/slave.cc: Auto merged
Diffstat (limited to 'sql/slave.cc')
-rw-r--r--sql/slave.cc19
1 files changed, 14 insertions, 5 deletions
diff --git a/sql/slave.cc b/sql/slave.cc
index 37c782a42c3..4ea6592b565 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -3758,8 +3758,13 @@ err:
mi->abort_slave= 0;
mi->slave_running= 0;
mi->io_thd= 0;
- pthread_mutex_unlock(&mi->run_lock);
+ /*
+ Note: the order of the two following calls (first broadcast, then unlock)
+ is important. Otherwise a killer_thread can execute between the calls and
+ delete the mi structure leading to a crash! (see BUG#25306 for details)
+ */
pthread_cond_broadcast(&mi->stop_cond); // tell the world we are done
+ pthread_mutex_unlock(&mi->run_lock);
#ifndef DBUG_OFF
if (abort_slave_event_count && !events_till_abort)
goto slave_begin;
@@ -3977,8 +3982,13 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \
THD_CHECK_SENTRY(thd);
delete thd;
pthread_mutex_unlock(&LOCK_thread_count);
- pthread_cond_broadcast(&rli->stop_cond);
+ /*
+ Note: the order of the broadcast and unlock calls below (first broadcast, then unlock)
+ is important. Otherwise a killer_thread can execute between the calls and
+ delete the mi structure leading to a crash! (see BUG#25306 for details)
+ */
+ pthread_cond_broadcast(&rli->stop_cond);
#ifndef DBUG_OFF
/*
Bug #19938 Valgrind error (race) in handle_slave_sql()
@@ -3986,9 +3996,8 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \
*/
const int eta= rli->events_till_abort;
#endif
-
- // tell the world we are done
- pthread_mutex_unlock(&rli->run_lock);
+ pthread_mutex_unlock(&rli->run_lock); // tell the world we are done
+
#ifndef DBUG_OFF // TODO: reconsider the code below
if (abort_slave_event_count && !eta)
goto slave_begin;