From 3d0775e9af2fcf3fe92b7f19e299ea23068eca1e Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 27 Mar 2012 16:16:44 +0200 Subject: mdev-201 - Assertion `!thd->spcont' failed in net_send_error on server shutdown bug in semisync plugin. It didn't check thd->killed before waiting on mysys->current_cond, and thus an attepmt to kill the thread (on shutdown) was lost plugin/semisync/semisync_master.cc: mdev:201 lp:962540 --- plugin/semisync/semisync_master.cc | 5 +++-- sql/sql_class.cc | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc index 7504697a21f..9e857f83d39 100644 --- a/plugin/semisync/semisync_master.cc +++ b/plugin/semisync/semisync_master.cc @@ -626,7 +626,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name, (int)is_on()); } - while (is_on()) + while (is_on() && !thd_killed(NULL)) { if (reply_file_name_inited_) { @@ -743,7 +743,8 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name, At this point, the binlog file and position of this transaction must have been removed from ActiveTranx. */ - assert(!active_tranxs_->is_tranx_end_pos(trx_wait_binlog_name, + assert(thd_killed(NULL) || + !active_tranxs_->is_tranx_end_pos(trx_wait_binlog_name, trx_wait_binlog_pos)); /* Update the status counter. */ diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d7d0c8d3f68..988c8b48c64 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3735,6 +3735,9 @@ void THD::restore_backup_open_tables_state(Open_tables_backup *backup) extern "C" int thd_killed(const MYSQL_THD thd) { + if (!thd) + thd= current_thd; + if (!(thd->killed & KILL_HARD_BIT)) return 0; return thd->killed; -- cgit v1.2.1