summaryrefslogtreecommitdiff
path: root/innobase/srv/srv0srv.c
diff options
context:
space:
mode:
authorheikki@hundin.mysql.fi <>2002-11-07 14:47:25 +0200
committerheikki@hundin.mysql.fi <>2002-11-07 14:47:25 +0200
commitb31f909d7b756813993cc0f8f0d4d707aa2c2d20 (patch)
tree55c72cdc1d8c91f0b56057c2e2c01f7ce3c93883 /innobase/srv/srv0srv.c
parentaa4e1658080ef50072f796773d2723e723d01ff0 (diff)
downloadmariadb-git-b31f909d7b756813993cc0f8f0d4d707aa2c2d20.tar.gz
Many files:
Fix hang introduced by selective deadlock resolution srv0srv.c, row0mysql.c: Fix hang introduced by selective deadlock resolution + corruption caused by lock timeout or sel deadl res in ON DELETE CASCADE
Diffstat (limited to 'innobase/srv/srv0srv.c')
-rw-r--r--innobase/srv/srv0srv.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c
index 51d7878fd29..f9eba721cbc 100644
--- a/innobase/srv/srv0srv.c
+++ b/innobase/srv/srv0srv.c
@@ -2082,13 +2082,24 @@ srv_suspend_mysql_thread(
if (thr->state == QUE_THR_RUNNING) {
- /* The lock has already been released: no need to suspend */
+ ut_ad(thr->is_active == TRUE);
+
+ /* The lock has already been released or this transaction
+ was chosen as a deadlock victim: no need to suspend */
+
+ if (trx->was_chosen_as_deadlock_victim) {
+
+ trx->error_state = DB_DEADLOCK;
+ trx->was_chosen_as_deadlock_victim = FALSE;
+ }
mutex_exit(&kernel_mutex);
return;
}
+ ut_ad(thr->is_active == FALSE);
+
slot = srv_table_reserve_slot_for_mysql();
event = slot->event;
@@ -2142,6 +2153,12 @@ srv_suspend_mysql_thread(
wait_time = ut_difftime(ut_time(), slot->suspend_time);
+ if (trx->was_chosen_as_deadlock_victim) {
+
+ trx->error_state = DB_DEADLOCK;
+ trx->was_chosen_as_deadlock_victim = FALSE;
+ }
+
mutex_exit(&kernel_mutex);
if (srv_lock_wait_timeout < 100000000 &&