summaryrefslogtreecommitdiff
path: root/storage/innobase/srv
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-01-26 16:39:56 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-01-27 15:45:39 +0200
commite71e6133535da8d5eab86e504f0b116a03680780 (patch)
tree160adf5e0ded57571fa18e376534953f2602d1e8 /storage/innobase/srv
parent7f1ab8f742ac42e82dd39a6e11390254cb72319c (diff)
downloadmariadb-git-e71e6133535da8d5eab86e504f0b116a03680780.tar.gz
MDEV-24671: Replace lock_wait_timeout_task with mysql_cond_timedwait()
lock_wait(): Replaces lock_wait_suspend_thread(). Wait for the lock to be granted or the transaction to be killed using mysql_cond_timedwait() or mysql_cond_wait(). lock_wait_end(): Replaces que_thr_end_lock_wait() and lock_wait_release_thread_if_suspended(). lock_wait_timeout_task: Remove. The operating system kernel will resume the mysql_cond_timedwait() in lock_wait(). An added benefit is that innodb_lock_wait_timeout no longer has a 'jitter' of 1 second, which was caused by this wake-up task waking up only once per second, and then waking up any threads for which the timeout (which was only measured in seconds) was exceeded. innobase_kill_query(): Set trx->error_state=DB_INTERRUPTED, so that a call trx_is_interrupted(trx) in lock_wait() can be avoided. We will protect things more consistently with lock_sys.wait_mutex, which will be moved below lock_sys.mutex in the latching order. trx_lock_t::cond: Condition variable for !wait_lock, used with lock_sys.wait_mutex. srv_slot_t: Remove. Replaced by trx_lock_t::cond, lock_grant_after_reset(): Merged to to lock_grant(). lock_rec_get_index_name(): Remove. lock_sys_t: Introduce wait_pending, wait_count, wait_time, wait_time_max that are protected by wait_mutex. trx_lock_t::que_state: Remove. que_thr_state_t: Remove QUE_THR_COMMAND_WAIT, QUE_THR_LOCK_WAIT. que_thr_t: Remove is_active, start_running(), stop_no_error(). que_fork_t::n_active_thrs, trx_lock_t::n_active_thrs: Remove.
Diffstat (limited to 'storage/innobase/srv')
-rw-r--r--storage/innobase/srv/srv0mon.cc20
-rw-r--r--storage/innobase/srv/srv0srv.cc28
-rw-r--r--storage/innobase/srv/srv0start.cc8
3 files changed, 26 insertions, 30 deletions
diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc
index febbfa089f6..4ccd0adb360 100644
--- a/storage/innobase/srv/srv0mon.cc
+++ b/storage/innobase/srv/srv0mon.cc
@@ -1719,32 +1719,38 @@ srv_mon_process_existing_counter(
/* innodb_row_lock_current_waits */
case MONITOR_OVLD_ROW_LOCK_CURRENT_WAIT:
- value = srv_stats.n_lock_wait_current_count;
+ // dirty read without lock_sys.wait_mutex
+ value = lock_sys.get_wait_pending();
break;
/* innodb_row_lock_time */
case MONITOR_OVLD_LOCK_WAIT_TIME:
- value = srv_stats.n_lock_wait_time / 1000;
+ // dirty read without lock_sys.wait_mutex
+ value = lock_sys.get_wait_time_cumulative() / 1000;
break;
/* innodb_row_lock_time_max */
case MONITOR_OVLD_LOCK_MAX_WAIT_TIME:
- value = lock_sys.n_lock_max_wait_time / 1000;
+ // dirty read without lock_sys.wait_mutex
+ value = lock_sys.get_wait_time_max() / 1000;
break;
/* innodb_row_lock_time_avg */
case MONITOR_OVLD_LOCK_AVG_WAIT_TIME:
- if (srv_stats.n_lock_wait_count > 0) {
- value = srv_stats.n_lock_wait_time / 1000
- / srv_stats.n_lock_wait_count;
+ mysql_mutex_lock(&lock_sys.wait_mutex);
+ if (auto count = lock_sys.get_wait_cumulative()) {
+ value = lock_sys.get_wait_time_cumulative() / 1000
+ / count;
} else {
value = 0;
}
+ mysql_mutex_unlock(&lock_sys.wait_mutex);
break;
/* innodb_row_lock_waits */
case MONITOR_OVLD_ROW_LOCK_WAIT:
- value = srv_stats.n_lock_wait_count;
+ // dirty read without lock_sys.wait_mutex
+ value = lock_sys.get_wait_cumulative();
break;
case MONITOR_RSEG_HISTORY_LEN:
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index e71f725c660..6d8fcd8acde 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -1106,25 +1106,21 @@ srv_export_innodb_status(void)
export_vars.innodb_pages_written = buf_pool.stat.n_pages_written;
- export_vars.innodb_row_lock_waits = srv_stats.n_lock_wait_count;
+ mysql_mutex_lock(&lock_sys.wait_mutex);
+ export_vars.innodb_row_lock_waits = lock_sys.get_wait_cumulative();
- export_vars.innodb_row_lock_current_waits =
- srv_stats.n_lock_wait_current_count;
+ export_vars.innodb_row_lock_current_waits= lock_sys.get_wait_pending();
- export_vars.innodb_row_lock_time = srv_stats.n_lock_wait_time / 1000;
+ export_vars.innodb_row_lock_time = lock_sys.get_wait_time_cumulative()
+ / 1000;
+ export_vars.innodb_row_lock_time_max = lock_sys.get_wait_time_max()
+ / 1000;
+ mysql_mutex_unlock(&lock_sys.wait_mutex);
- if (srv_stats.n_lock_wait_count > 0) {
-
- export_vars.innodb_row_lock_time_avg = (ulint)
- (srv_stats.n_lock_wait_time
- / 1000 / srv_stats.n_lock_wait_count);
-
- } else {
- export_vars.innodb_row_lock_time_avg = 0;
- }
-
- export_vars.innodb_row_lock_time_max =
- lock_sys.n_lock_max_wait_time / 1000;
+ export_vars.innodb_row_lock_time_avg= export_vars.innodb_row_lock_waits
+ ? static_cast<ulint>(export_vars.innodb_row_lock_time
+ / export_vars.innodb_row_lock_waits)
+ : 0;
export_vars.innodb_rows_read = srv_stats.n_rows_read;
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index cdb96981996..ab4728de9ef 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -3,7 +3,7 @@
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2008, Google Inc.
Copyright (c) 2009, Percona Inc.
-Copyright (c) 2013, 2020, MariaDB Corporation.
+Copyright (c) 2013, 2021, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -825,7 +825,6 @@ static void srv_shutdown_threads()
ut_ad(!srv_undo_sources);
srv_shutdown_state = SRV_SHUTDOWN_EXIT_THREADS;
ut_d(srv_master_thread_enable());
- lock_sys.timeout_timer.reset();
srv_master_timer.reset();
if (purge_sys.enabled()) {
@@ -1787,11 +1786,6 @@ file_checked:
srv_startup_is_before_trx_rollback_phase = false;
if (!srv_read_only_mode) {
- /* timer task which watches the timeouts
- for lock waits */
- lock_sys.timeout_timer.reset(srv_thread_pool->create_timer(
- lock_wait_timeout_task));
-
DBUG_EXECUTE_IF("innodb_skip_monitors", goto skip_monitors;);
/* Create the task which warns of long semaphore waits */
srv_start_periodic_timer(srv_monitor_timer, srv_monitor_task,