mirror of
https://github.com/MariaDB/server.git
synced 2026-05-05 06:35:33 +02:00
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
2 changed files with 14 additions and 7 deletions
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue