diff options
author | heikki@hundin.mysql.fi <> | 2002-11-07 14:47:25 +0200 |
---|---|---|
committer | heikki@hundin.mysql.fi <> | 2002-11-07 14:47:25 +0200 |
commit | b31f909d7b756813993cc0f8f0d4d707aa2c2d20 (patch) | |
tree | 55c72cdc1d8c91f0b56057c2e2c01f7ce3c93883 /innobase/srv/srv0srv.c | |
parent | aa4e1658080ef50072f796773d2723e723d01ff0 (diff) | |
download | mariadb-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.c | 19 |
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 && |