Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MDEV-34489 innodb.innodb_row_lock_time_ms fails #3809

Open
wants to merge 1 commit into
base: 10.6
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions mysql-test/suite/innodb/r/innodb_row_lock_time_ms.result
Original file line number Diff line number Diff line change
@@ -1,40 +1,46 @@
CREATE TABLE `t`(`id` INT, PRIMARY KEY(`id`)) ENGINE=InnoDB STATS_PERSISTENT=0;
INSERT INTO t VALUES (1);
SET GLOBAL innodb_monitor_reset = "module_innodb";
SET GLOBAL innodb_monitor_disable="lock_row_lock_time";
SET GLOBAL innodb_monitor_disable="lock_row_lock_time_max";
SET GLOBAL innodb_monitor_reset_all='lock_row_lock_time';
SET GLOBAL innodb_monitor_reset_all='lock_row_lock_time_max';
SET GLOBAL innodb_monitor_enable="lock_row_lock_time";
SET GLOBAL innodb_monitor_enable="lock_row_lock_time_max";
BEGIN;
SELECT * FROM t FOR UPDATE;
id
1
SELECT @innodb_row_lock_time_before := variable_value
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time';
connect con1,localhost,root,,;
SET innodb_lock_wait_timeout = 1;
SELECT * FROM t FOR UPDATE;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
disconnect con1;
connection default;
COMMIT;
SELECT variable_value > 100 FROM information_schema.global_status
SELECT variable_value - @innodb_row_lock_time_before > 100
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time';
variable_value > 100
variable_value - @innodb_row_lock_time_before > 100
1
SELECT variable_value > 100 FROM information_schema.global_status
SELECT variable_value > 100
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time_max';
variable_value > 100
1
SELECT variable_value > 100 FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time_avg';
variable_value > 100
1
SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time";
count_reset > 100
1
SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time_max";
SELECT count_reset > 100
FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME='lock_row_lock_time';
count_reset > 100
1
SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time_avg";
SELECT count_reset > 100
FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME='lock_row_lock_time_max';
count_reset > 100
1
DROP TABLE t;
SET GLOBAL innodb_monitor_reset=default;
SET GLOBAL innodb_monitor_enable=default;
SET GLOBAL innodb_monitor_disable=default;
SET GLOBAL innodb_monitor_reset_all=default;
45 changes: 32 additions & 13 deletions mysql-test/suite/innodb/t/innodb_row_lock_time_ms.test
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,26 @@ CREATE TABLE `t`(`id` INT, PRIMARY KEY(`id`)) ENGINE=InnoDB STATS_PERSISTENT=0;

INSERT INTO t VALUES (1);

SET GLOBAL innodb_monitor_reset = "module_innodb";
SET GLOBAL innodb_monitor_disable="lock_row_lock_time";
SET GLOBAL innodb_monitor_disable="lock_row_lock_time_max";
SET GLOBAL innodb_monitor_reset_all='lock_row_lock_time';
SET GLOBAL innodb_monitor_reset_all='lock_row_lock_time_max';
SET GLOBAL innodb_monitor_enable="lock_row_lock_time";
SET GLOBAL innodb_monitor_enable="lock_row_lock_time_max";

BEGIN;
SELECT * FROM t FOR UPDATE;

# We can't predict (innodb/lock)_row_lock_time_avg value, because it's counted
# as the whole waiting time divided by the amount of waits. The
# corresponding counters in lock_sys can't be reset with any query.

--disable_result_log
SELECT @innodb_row_lock_time_before := variable_value
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time';
--enable_result_log

--connect(con1,localhost,root,,)
SET innodb_lock_wait_timeout = 1;
--error ER_LOCK_WAIT_TIMEOUT
Expand All @@ -19,24 +34,28 @@ SELECT * FROM t FOR UPDATE;
--connection default
COMMIT;

SELECT variable_value > 100 FROM information_schema.global_status
SELECT variable_value - @innodb_row_lock_time_before > 100
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time';
SELECT variable_value > 100 FROM information_schema.global_status
# We can't use 'variable_value - @innodb_row_lock_time_max_before' trick for
# innodb_row_lock_time_max, because we can't reset it, and we don't know the
# initial value at the moment of the test execution.
SELECT variable_value > 100
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time_max';
SELECT variable_value > 100 FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_row_lock_time_avg';

SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time";
SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time_max";
SELECT count_reset > 100 FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME="lock_row_lock_time_avg";
SELECT count_reset > 100
FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME='lock_row_lock_time';
SELECT count_reset > 100
FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME='lock_row_lock_time_max';

DROP TABLE t;

--disable_warnings
SET GLOBAL innodb_monitor_reset=default;
SET GLOBAL innodb_monitor_enable=default;
SET GLOBAL innodb_monitor_disable=default;
SET GLOBAL innodb_monitor_reset_all=default;
--enable_warnings

--source include/wait_until_count_sessions.inc