Backport of revno: 2617.65.1
Bug #22876 Four-way deadlock This bug was fixed as a part of Bug#989 "If DROP TABLE while there's an active transaction, wrong binlog order" A statement which would have caused circular wait will now be aborted with ER_LOCK_DEADLOCK. Test case based on bug description added to innodb_mysql_lock.test. Note that innodb_lock_wait_timeout is set to 5 mins to prevent race conditions in the test.
This commit is contained in:
parent
4f48b423c2
commit
502b4ea47f
24
mysql-test/r/innodb_mysql_lock.result
Normal file
24
mysql-test/r/innodb_mysql_lock.result
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Bug #22876 Four-way deadlock
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# Connection 1
|
||||
set @@autocommit=0;
|
||||
CREATE TABLE t1(s1 INT UNIQUE) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
# Connection 2
|
||||
set @@autocommit=0;
|
||||
INSERT INTO t1 VALUES (2);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
# Connection 3
|
||||
set @@autocommit=0;
|
||||
DROP TABLE t1;
|
||||
# Connection 1
|
||||
# Connection 1 is now holding the lock.
|
||||
# Issuing insert from connection 1 while connection 2&3
|
||||
# is waiting for the lock should give a deadlock error.
|
||||
INSERT INTO t1 VALUES (2);
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
# Cleanup
|
||||
commit;
|
||||
commit;
|
1
mysql-test/t/innodb_mysql_lock-master.opt
Normal file
1
mysql-test/t/innodb_mysql_lock-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--innodb_lock_wait_timeout=300
|
58
mysql-test/t/innodb_mysql_lock.test
Normal file
58
mysql-test/t/innodb_mysql_lock.test
Normal file
@ -0,0 +1,58 @@
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # Bug #22876 Four-way deadlock
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
connect (con1,localhost,root,,);
|
||||
connect (con2,localhost,root,,);
|
||||
connect (con3,localhost,root,,);
|
||||
|
||||
--echo # Connection 1
|
||||
connection con1;
|
||||
set @@autocommit=0;
|
||||
CREATE TABLE t1(s1 INT UNIQUE) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
--echo # Connection 2
|
||||
connection con2;
|
||||
set @@autocommit=0;
|
||||
INSERT INTO t1 VALUES (2);
|
||||
--send INSERT INTO t1 VALUES (1)
|
||||
|
||||
--echo # Connection 3
|
||||
connection con3;
|
||||
set @@autocommit=0;
|
||||
--send DROP TABLE t1
|
||||
|
||||
--echo # Connection 1
|
||||
connection con1;
|
||||
let $wait_condition=
|
||||
SELECT COUNT(*) = 1 FROM information_schema.processlist
|
||||
WHERE info = "INSERT INTO t1 VALUES (1)" and
|
||||
state = "update";
|
||||
--source include/wait_condition.inc
|
||||
let $wait_condition=
|
||||
SELECT COUNT(*) = 1 FROM information_schema.processlist
|
||||
WHERE info = "DROP TABLE t1" and
|
||||
state = "Waiting for table";
|
||||
--source include/wait_condition.inc
|
||||
--echo # Connection 1 is now holding the lock.
|
||||
--echo # Issuing insert from connection 1 while connection 2&3
|
||||
--echo # is waiting for the lock should give a deadlock error.
|
||||
--error ER_LOCK_DEADLOCK
|
||||
INSERT INTO t1 VALUES (2);
|
||||
|
||||
--echo # Cleanup
|
||||
connection con2;
|
||||
--reap
|
||||
commit;
|
||||
connection con1;
|
||||
commit;
|
||||
connection con3;
|
||||
--reap
|
||||
connection default;
|
Loading…
x
Reference in New Issue
Block a user