diff options
author | unknown <rafal@quant.(none)> | 2007-03-01 10:03:42 +0100 |
---|---|---|
committer | unknown <rafal@quant.(none)> | 2007-03-01 10:03:42 +0100 |
commit | b3c7224c3b82a3cbe0661c59ceabb9b7343d0319 (patch) | |
tree | 2b62ffb4727b6b39cd0e6b2094a3e1c2fd02643f | |
parent | 58e93b1f9fee89b589a4cfed4f45182015a083e4 (diff) | |
parent | 9c8637dc4cb97f97eec964f64aaefe906d65f614 (diff) | |
download | mariadb-git-b3c7224c3b82a3cbe0661c59ceabb9b7343d0319.tar.gz |
Merge quant.(none):/ext/mysql/bk/mysql-5.0-bug25306
into quant.(none):/ext/mysql/bkroot/mysql-5.1-new-rpl
sql/sql_repl.cc:
Auto merged
sql/slave.cc:
Manual merge of patch for BUG#25306 from 5.0-rpl tree
-rw-r--r-- | sql/slave.cc | 29 | ||||
-rw-r--r-- | sql/sql_repl.cc | 8 |
2 files changed, 28 insertions, 9 deletions
diff --git a/sql/slave.cc b/sql/slave.cc index 3a9cde42059..bb2aa11626e 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -2205,11 +2205,16 @@ err: THD_CHECK_SENTRY(thd); delete thd; pthread_mutex_unlock(&LOCK_thread_count); - mi->abort_slave = 0; - mi->slave_running = 0; - mi->io_thd = 0; - pthread_mutex_unlock(&mi->run_lock); + mi->abort_slave= 0; + mi->slave_running= 0; + mi->io_thd= 0; + /* + 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); my_thread_end(); pthread_exit(0); DBUG_RETURN(0); // Can't return anything here @@ -2455,9 +2460,21 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \ THD_CHECK_SENTRY(thd); delete thd; pthread_mutex_unlock(&LOCK_thread_count); +#ifndef DBUG_OFF + /* + Bug #19938 Valgrind error (race) in handle_slave_sql() + Read the value of rli->event_till_abort before releasing the mutex + */ + const int eta= rli->events_till_abort; +#endif + /* + 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); - // tell the world we are done - pthread_mutex_unlock(&rli->run_lock); + pthread_mutex_unlock(&rli->run_lock); // tell the world we are done + my_thread_end(); pthread_exit(0); DBUG_RETURN(0); // Can't return anything here diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 1a8446a86e9..debc9a7b572 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -886,12 +886,14 @@ int start_slave(THD* thd , MASTER_INFO* mi, bool net_report) int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report ) { + DBUG_ENTER("stop_slave"); + int slave_errno; if (!thd) thd = current_thd; if (check_access(thd, SUPER_ACL, any_db,0,0,0,0)) - return 1; + DBUG_RETURN(1); thd->proc_info = "Killing slave"; int thread_mask; lock_slave_threads(mi); @@ -925,12 +927,12 @@ int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report ) { if (net_report) my_message(slave_errno, ER(slave_errno), MYF(0)); - return 1; + DBUG_RETURN(1); } else if (net_report) send_ok(thd); - return 0; + DBUG_RETURN(0); } |