BUG#31024: STOP SLAVE does not stop attempted connect()s
Problem: if the IO slave thread is attempting to connect, STOP SLAVE waits for the attempt to finish. It may take a long time. Fix: don't wait, stop the slave immediately. sql/slave.cc: Send a SIGALRM signal to the slave thread when stopping it (using pthread_kill()). This breaks current socket(), connect(), poll() etc. calls, and makes the subsequent thd->awake() call effective. Also, move the definition of KICK_SLAVE to slave.cc. sql/sql_repl.h: Removed KICK_SLAVE and inlined it in slave.cc because: - it was only called once, so better to make it local to where it is used - it needed to include a preprocessor conditional in the middle
This commit is contained in:
parent
0e679ab782
commit
1836625fb4
15
sql/slave.cc
15
sql/slave.cc
@ -699,7 +699,20 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock,
|
||||
while (*slave_running) // Should always be true
|
||||
{
|
||||
DBUG_PRINT("loop", ("killing slave thread"));
|
||||
KICK_SLAVE(thd);
|
||||
|
||||
pthread_mutex_lock(&thd->LOCK_delete);
|
||||
#ifndef DONT_USE_THR_ALARM
|
||||
/*
|
||||
Error codes from pthread_kill are:
|
||||
EINVAL: invalid signal number (can't happen)
|
||||
ESRCH: thread already killed (can happen, should be ignored)
|
||||
*/
|
||||
IF_DBUG(int err= ) pthread_kill(thd->real_id, thr_client_alarm);
|
||||
DBUG_ASSERT(err != EINVAL);
|
||||
#endif
|
||||
thd->awake(THD::NOT_KILLED);
|
||||
pthread_mutex_unlock(&thd->LOCK_delete);
|
||||
|
||||
/*
|
||||
There is a small chance that slave thread might miss the first
|
||||
alarm. To protect againts it, resend the signal until it reacts
|
||||
|
@ -35,12 +35,6 @@ extern I_List<i_string> binlog_do_db, binlog_ignore_db;
|
||||
extern int max_binlog_dump_events;
|
||||
extern my_bool opt_sporadic_binlog_dump_fail;
|
||||
|
||||
#define KICK_SLAVE(thd) do { \
|
||||
pthread_mutex_lock(&(thd)->LOCK_delete); \
|
||||
(thd)->awake(THD::NOT_KILLED); \
|
||||
pthread_mutex_unlock(&(thd)->LOCK_delete); \
|
||||
} while(0)
|
||||
|
||||
int start_slave(THD* thd, MASTER_INFO* mi, bool net_report);
|
||||
int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report);
|
||||
bool change_master(THD* thd, MASTER_INFO* mi);
|
||||
|
Loading…
x
Reference in New Issue
Block a user