summaryrefslogtreecommitdiff
path: root/innobase/srv
diff options
context:
space:
mode:
authorunknown <heikki@hundin.mysql.fi>2003-07-13 18:50:43 +0300
committerunknown <heikki@hundin.mysql.fi>2003-07-13 18:50:43 +0300
commitd1b9076e5102ffcffa86b488ecfcb26fd03b8884 (patch)
treece067721f7541c66b1dd9d82660d85224010c2db /innobase/srv
parent706dc59f587a5dce1b784d20554ac8ecad8b8078 (diff)
downloadmariadb-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.c25
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++) {