diff options
author | unknown <heikki@hundin.mysql.fi> | 2003-07-13 18:50:43 +0300 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2003-07-13 18:50:43 +0300 |
commit | d1b9076e5102ffcffa86b488ecfcb26fd03b8884 (patch) | |
tree | ce067721f7541c66b1dd9d82660d85224010c2db /innobase/srv | |
parent | 706dc59f587a5dce1b784d20554ac8ecad8b8078 (diff) | |
download | mariadb-git-d1b9076e5102ffcffa86b488ecfcb26fd03b8884.tar.gz |
srv0srv.c:
Put back a 50 millisecond sleep in too high concurrency situations which I removed in the previous push; count also such sleeping threads to the InnoDB queue in SHOW INNODB STATUS
innobase/srv/srv0srv.c:
Put back a 50 millisecond sleep in too high concurrency situations which I removed in the previous push; count also such sleeping threads to the InnoDB queue in SHOW INNODB STATUS
Diffstat (limited to 'innobase/srv')
-rw-r--r-- | innobase/srv/srv0srv.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 66819a747dc..f81b2d0a60e 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -1739,6 +1739,7 @@ srv_conc_enter_innodb( trx_t* trx) /* in: transaction object associated with the thread */ { + ibool has_slept = FALSE; srv_conc_slot_t* slot; ulint i; char err_buf[1000]; @@ -1759,7 +1760,7 @@ srv_conc_enter_innodb( } os_fast_mutex_lock(&srv_conc_mutex); - +retry: if (trx->declared_to_be_inside_innodb) { ut_print_timestamp(stderr); @@ -1784,6 +1785,28 @@ srv_conc_enter_innodb( return; } + /* If the transaction is not holding resources, let it sleep for 50 + milliseconds, and try again then */ + + if (!has_slept && !trx->has_search_latch + && NULL == UT_LIST_GET_FIRST(trx->trx_locks)) { + + has_slept = TRUE; /* We let is sleep only once to avoid + starvation */ + + srv_conc_n_waiting_threads++; + + os_fast_mutex_unlock(&srv_conc_mutex); + + os_thread_sleep(50000); + + os_fast_mutex_lock(&srv_conc_mutex); + + srv_conc_n_waiting_threads--; + + goto retry; + } + /* Too many threads inside: put the current thread to a queue */ for (i = 0; i < OS_THREAD_MAX_N; i++) { |