1
0
mirror of https://github.com/MariaDB/server.git synced 2025-04-18 21:44:20 +03:00

SAMU-292 INSERT and DELETE transactions on sys_mutex/ire_mutex tables active for 600+ seconds

Test case is added. The test case is not full, but can be used for
debugging. If we need test case for commit in 10.4 trunk, we need to
grep error log with the following sequence of mtr commands:

--let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err
--let SEARCH_PATTERN= "some regex"
--source include/search_pattern_in_file.inc
This commit is contained in:
Vlad Lesin 2025-04-16 18:39:13 +03:00
parent 575493eec7
commit 89eae6930f
3 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,38 @@
CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB, STATS_PERSISTENT=0;
INSERT INTO t VALUES (1),(2),(3),(4),(5),(6),(7),(8);
BEGIN;
SELECT * FROM t WHERE a = 1 FOR UPDATE;
a
1
connect con1,localhost,root;
BEGIN;
SELECT * FROM t WHERE a = 2 FOR UPDATE;
a
2
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
SELECT * FROM t WHERE a = 1 FOR UPDATE;
connect con2,localhost,root;
SET DEBUG_SYNC="now WAIT_FOR select_locked";
BEGIN;
SELECT * FROM t WHERE a = 3 FOR UPDATE;
a
3
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
SELECT * FROM t WHERE a = 2 FOR UPDATE;
connect con3,localhost,root;
SET DEBUG_SYNC="now WAIT_FOR select_locked";
BEGIN;
SELECT * FROM t WHERE a = 4 FOR UPDATE;
a
4
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
SELECT * FROM t WHERE a = 3 FOR UPDATE;
connection default;
SELECT * FROM t WHERE a = 4 FOR UPDATE;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
### See error log
disconnect con1;
disconnect con2;
disconnect con3;
SET DEBUG_SYNC="RESET";
DROP TABLE t;

View File

@ -0,0 +1 @@
--innodb-print-all-deadlocks=1

View File

@ -0,0 +1,44 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
--source include/count_sessions.inc
CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB, STATS_PERSISTENT=0;
INSERT INTO t VALUES (1),(2),(3),(4),(5),(6),(7),(8);
#1
BEGIN; SELECT * FROM t WHERE a = 1 FOR UPDATE;
--connect con1,localhost,root
#2
BEGIN; SELECT * FROM t WHERE a = 2 FOR UPDATE;
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
--send SELECT * FROM t WHERE a = 1 FOR UPDATE
--connect con2,localhost,root
SET DEBUG_SYNC="now WAIT_FOR select_locked";
#3
BEGIN; SELECT * FROM t WHERE a = 3 FOR UPDATE;
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
--send SELECT * FROM t WHERE a = 2 FOR UPDATE
--connect con3,localhost,root
SET DEBUG_SYNC="now WAIT_FOR select_locked";
#4
BEGIN; SELECT * FROM t WHERE a = 4 FOR UPDATE;
SET DEBUG_SYNC="lock_wait_suspend_thread_enter SIGNAL select_locked";
--send SELECT * FROM t WHERE a = 3 FOR UPDATE
--connection default
#1->4->3->2->1 loop
--error 1213
SELECT * FROM t WHERE a = 4 FOR UPDATE;
--echo ### See error log
--disconnect con1
--disconnect con2
--disconnect con3
SET DEBUG_SYNC="RESET";
DROP TABLE t;
--source include/wait_until_count_sessions.inc