diff options
Diffstat (limited to 'sql/slave.cc')
-rw-r--r-- | sql/slave.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sql/slave.cc b/sql/slave.cc index 31bd9372a14..e712e8a7010 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -4520,6 +4520,7 @@ pthread_handler_t handle_slave_io(void *arg) uint retry_count; bool suppress_warnings; int ret; + int err_stopping_semisync; rpl_io_thread_info io_info; #ifndef DBUG_OFF mi->dbug_do_disconnect= false; @@ -4848,6 +4849,7 @@ Stopping slave I/O thread due to out-of-memory error from master"); not cause the slave IO thread to stop, and the error messages are already reported. */ + DBUG_EXECUTE_IF("simulate_delay_semisync_slave_reply", my_sleep(800000);); (void)repl_semisync_slave.slave_reply(mi); } @@ -4919,7 +4921,7 @@ err: tmp.c_ptr_safe()); sql_print_information("master was %s:%d", mi->host, mi->port); } - repl_semisync_slave.slave_stop(mi); + err_stopping_semisync= repl_semisync_slave.slave_stop(mi); thd->reset_query(); thd->reset_db(&null_clex_str); if (mysql) @@ -4935,7 +4937,14 @@ err: #ifdef SIGNAL_WITH_VIO_CLOSE thd->clear_active_vio(); #endif - mysql_close(mysql); + /* + Don't close the connection if it is semi-sync and failed to close + gracefully in `repl_semisync_slave.slave_stop`, e.g. if the master is + shutting down and force killed the kill_mysql connection before issuing + `KILL {mysql->thread_id}`. Let it time out instead. + */ + if (!err_stopping_semisync) + mysql_close(mysql); mi->mysql=0; } write_ignored_events_info_to_relay_log(thd, mi); |