summaryrefslogtreecommitdiff
path: root/sql/service_wsrep.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2020-05-14 09:17:14 +0300
committerJan Lindström <jan.lindstrom@mariadb.com>2020-05-15 09:04:02 +0300
commit523d67a272ca37bf6c1972bae09f59d72a78d99c (patch)
tree080619db9c8cd5266d28540685a241b6068a0c5d /sql/service_wsrep.cc
parent3bfe305c5cd678a8563f7a76d6ed59095129007e (diff)
downloadmariadb-git-523d67a272ca37bf6c1972bae09f59d72a78d99c.tar.gz
MDEV-22494 : Galera assertion lock_sys.mutex.is_owned() at lock_trx_handle_wait_low
Problem was that trx->lock.was_chosen_as_wsrep_victim variable was not set back to false after it was set true. wsrep_thd_bf_abort Add assertions for correct mutex status and take necessary mutexes before calling thd->awake_no_mutex(). innobase_rollback_trx() Reset trx->lock.was_chosen_as_wsrep_victim wsrep_abort_slave_trx() Removed unused function. wsrep_innobase_kill_one_trx() Added function comment, removed unnecessary parameters and added debug assertions to enforce correct usage. Added more debug output to help out on error analysis. wsrep_abort_transaction() Added debug assertions and removed unused variables. trx0trx.h Removed assert_trx_is_free macro and replaced it with assert_freed() member function. trx_create() Use above assert_free() and initialize wsrep variables. trx_free() Use assert_free() trx_t::commit_in_memory() Reset lock.was_chosen_as_wsrep_victim trx_rollback_for_mysql() Reset trx->lock.was_chosen_as_wsrep_victim Add test case galera_bf_kill
Diffstat (limited to 'sql/service_wsrep.cc')
-rw-r--r--sql/service_wsrep.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc
index 6634bfa7e7a..7cac2bf741b 100644
--- a/sql/service_wsrep.cc
+++ b/sql/service_wsrep.cc
@@ -207,7 +207,15 @@ extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd,
as RSU has paused the provider.
*/
if ((ret || !wsrep_on(victim_thd)) && signal)
- victim_thd->awake(KILL_QUERY);
+ {
+ mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_data);
+ mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_kill);
+ mysql_mutex_lock(&victim_thd->LOCK_thd_data);
+ mysql_mutex_lock(&victim_thd->LOCK_thd_kill);
+ victim_thd->awake_no_mutex(KILL_QUERY);
+ mysql_mutex_unlock(&victim_thd->LOCK_thd_kill);
+ mysql_mutex_unlock(&victim_thd->LOCK_thd_data);
+ }
return ret;
}