summaryrefslogtreecommitdiff
path: root/sql/sql_insert.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2021-08-03 07:00:34 +0300
committerJan Lindström <jan.lindstrom@mariadb.com>2021-08-16 15:48:53 +0300
commit2736e9054e9d9ddddba931f57966e44a0cedd0c7 (patch)
treee08d41f3a4736632ab111b762c945ab3a027fd8d /sql/sql_insert.cc
parent4cd063b9e40cfb77413bcd44bc7d922c6228f810 (diff)
downloadmariadb-git-10.2-MDEV-25114.tar.gz
MDEV-24114 : Crash: WSREP: invalid state ROLLED_BACK (FATAL)10.2-MDEV-25114
Reverts fix for MDEV-23328 i.e. commit 29bbcac0ee841 In this fix we try to modify normal SQL KILL in a following way: trx_id= thd_to_trx(victim_thd)->id; mutex_unlock(victim_thd->LOCK_thd_data); mutex_unlock(victim_thd->LOCK_thd_kill); lock_mutex_enter trx=find_and_lock_trx_by_id(trx_id) mytex_lock(trx->mysql_thd->LOCK_thd_kill); mutex_lock(trx->mysql_thd->LOCK_thd_data) For THD::awake() we use: mutex_lock(thd->LOCK_thd_kill); mutex_lock(thd->LOCK_thd_data); thd->awake(); mutex_unlock(thd->LOCK_thd_data); mutex_unlock(thd->LOCK_thd_kill); For THD::set_killed in most cases we use mutex_lock(thd->LOCK_thd_kill); mutex_lock(thd->LOCK_thd_data); thd->set_killed_no_mutex(...); mutex_unlock(thd->LOCK_thd_data); mutex_unlock(thd->LOCK_thd_kill);
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r--sql/sql_insert.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 51b2c84cfea..f6135e8b168 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2752,9 +2752,10 @@ void kill_delayed_threads(void)
Delayed_insert *di;
while ((di= it++))
{
+ mysql_mutex_lock(&di->thd.LOCK_thd_kill);
mysql_mutex_lock(&di->thd.LOCK_thd_data);
if (di->thd.killed < KILL_CONNECTION)
- di->thd.set_killed(KILL_CONNECTION);
+ di->thd.set_killed_no_mutex(KILL_CONNECTION);
if (di->thd.mysys_var)
{
mysql_mutex_lock(&di->thd.mysys_var->mutex);
@@ -2773,6 +2774,7 @@ void kill_delayed_threads(void)
mysql_mutex_unlock(&di->thd.mysys_var->mutex);
}
mysql_mutex_unlock(&di->thd.LOCK_thd_data);
+ mysql_mutex_unlock(&di->thd.LOCK_thd_kill);
}
mysql_mutex_unlock(&LOCK_delayed_insert); // For unlink from list
DBUG_VOID_RETURN;
@@ -3139,10 +3141,12 @@ pthread_handler_t handle_delayed_insert(void *arg)
THD::notify_shared_lock() dosn't try to access open tables after
this.
*/
+ mysql_mutex_lock(&thd->LOCK_thd_kill);
mysql_mutex_lock(&thd->LOCK_thd_data);
- thd->set_killed(KILL_CONNECTION_HARD); // If error
+ thd->set_killed_no_mutex(KILL_CONNECTION_HARD); // If error
thd->mdl_context.set_needs_thr_lock_abort(0);
mysql_mutex_unlock(&thd->LOCK_thd_data);
+ mysql_mutex_unlock(&thd->LOCK_thd_kill);
close_thread_tables(thd); // Free the table
thd->release_transactional_locks();