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:
unknown 2008-03-11 14:42:54 +01:00
parent 0e679ab782
commit 1836625fb4
2 changed files with 14 additions and 7 deletions

View File

@ -699,7 +699,20 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock,
while (*slave_running) // Should always be true while (*slave_running) // Should always be true
{ {
DBUG_PRINT("loop", ("killing slave thread")); 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 There is a small chance that slave thread might miss the first
alarm. To protect againts it, resend the signal until it reacts alarm. To protect againts it, resend the signal until it reacts

View File

@ -35,12 +35,6 @@ extern I_List<i_string> binlog_do_db, binlog_ignore_db;
extern int max_binlog_dump_events; extern int max_binlog_dump_events;
extern my_bool opt_sporadic_binlog_dump_fail; 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 start_slave(THD* thd, MASTER_INFO* mi, bool net_report);
int stop_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); bool change_master(THD* thd, MASTER_INFO* mi);