From d38e62634f4763d84d5bc54929c2c0c1595d51d2 Mon Sep 17 00:00:00 2001 From: Andrei Elkin Date: Tue, 28 Apr 2009 14:46:07 +0300 Subject: Bug #38694 Race condition in replication thread shutdown The issue of the current bug is unguarded access to mi->slave_running by the shutdown thread calling end_slave() that is bug#29968 (alas happened not to be cross-linked with the current bug) Fixed: with removing the unguarded read of the running status and perform reading it in terminate_slave_thread() at time run_lock is taken (mostly bug#29968 backporting, still with some improvements over that patch - see the error reporting from terminate_slave_thread()). Issue of bug#38716 is fixed here for 5.0 branch as well. Note: There has been a separate artifact identified - a race condition between init_slave() and end_slave() - reported as Bug#44467. mysql-test/r/rpl_bug38694.result: a new results file is added. mysql-test/t/rpl_bug38694-slave.opt: simulating delay at slave threads shutdown. mysql-test/t/rpl_bug38694.test: A new test to check if a delay at the termination phase of slave threads could cause any issue. sql/slave.cc: The unguarded read of the running status is removed. Its reading is done in terminate_slave_thread() at time run_lock is taken; Calling terminate_slave_threads(skip_lock := !need_slave_mutex) in the failing branch of start_slave_threads() which is bug#38716 issue. sql/slave.h: removing terminate_slave_thread() out of the global interface scope. --- sql/slave.h | 4 ---- 1 file changed, 4 deletions(-) (limited to 'sql/slave.h') diff --git a/sql/slave.h b/sql/slave.h index da548e145d3..5ae596f1eb5 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -504,10 +504,6 @@ bool flush_relay_log_info(RELAY_LOG_INFO* rli); int register_slave_on_master(MYSQL* mysql); int terminate_slave_threads(MASTER_INFO* mi, int thread_mask, bool skip_lock = 0); -int terminate_slave_thread(THD* thd, pthread_mutex_t* term_mutex, - pthread_mutex_t* cond_lock, - pthread_cond_t* term_cond, - volatile uint* slave_running); int start_slave_threads(bool need_slave_mutex, bool wait_for_start, MASTER_INFO* mi, const char* master_info_fname, const char* slave_info_fname, int thread_mask); -- cgit v1.2.1