Commit e1aa1f87 authored by Marko Mäkelä's avatar Marko Mäkelä

Bug#11753728 45225: Locking: hang if drop table with no timeout

Re-enable a test that was disabled as collateral damage.

Starting with MySQL 5.5, queries will acquire and hold a shared meta-data lock
(MDL) on tables they process, until the transaction is committed or
rolled back. This will prevent DDL operations on the tables, such as creating
an index.

innodb-index.test: Use a second table for creating the index. The index will
still be "too new" for the transaction that was started before the index
creation was started.
parent c75e8aa6
...@@ -1085,3 +1085,43 @@ t2 CREATE TABLE `t2` ( ...@@ -1085,3 +1085,43 @@ t2 CREATE TABLE `t2` (
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a INT, b CHAR(1)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (3,'a'),(3,'b'),(1,'c'),(0,'d'),(1,'e');
CREATE TABLE t2 SELECT * FROM t1;
BEGIN;
SELECT * FROM t1;
a b
3 a
3 b
1 c
0 d
1 e
SET lock_wait_timeout=1;
CREATE INDEX t1a ON t1(a);
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE INDEX t2a ON t2(a);
SELECT * FROM t2;
a b
3 a
3 b
1 c
0 d
1 e
SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
ERROR HY000: Table definition has changed, please retry transaction
SELECT * FROM t2;
a b
3 a
3 b
1 c
0 d
1 e
COMMIT;
SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
a b
0 d
1 c
1 e
3 a
3 b
DROP TABLE t1,t2;
...@@ -516,34 +516,34 @@ SHOW CREATE TABLE t2; ...@@ -516,34 +516,34 @@ SHOW CREATE TABLE t2;
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; DROP TABLE t1;
# The following tests are disabled because of the introduced timeouts for connect (a,localhost,root,,);
# metadata locks at the MySQL level as part of the fix for connect (b,localhost,root,,);
# Bug#45225 Locking: hang if drop table with no timeout connection a;
# The following CREATE INDEX t1a ON t1(a); causes a lock wait timeout CREATE TABLE t1 (a INT, b CHAR(1)) ENGINE=InnoDB;
# start disabled45225_2 INSERT INTO t1 VALUES (3,'a'),(3,'b'),(1,'c'),(0,'d'),(1,'e');
#connect (a,localhost,root,,); CREATE TABLE t2 SELECT * FROM t1;
#connect (b,localhost,root,,); connection b;
#connection a; BEGIN;
#CREATE TABLE t1 (a INT, b CHAR(1)) ENGINE=InnoDB; # This acquires a MDL lock on t1 until commit.
#INSERT INTO t1 VALUES (3,'a'),(3,'b'),(1,'c'),(0,'d'),(1,'e'); SELECT * FROM t1;
#connection b; connection a;
#BEGIN; # This times out before of the MDL lock held by connection b.
#SELECT * FROM t1; SET lock_wait_timeout=1;
#connection a; --error ER_LOCK_WAIT_TIMEOUT
#CREATE INDEX t1a ON t1(a); CREATE INDEX t1a ON t1(a);
#connection b; CREATE INDEX t2a ON t2(a);
#SELECT * FROM t1; connection b;
#--error ER_TABLE_DEF_CHANGED SELECT * FROM t2;
#SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a; --error ER_TABLE_DEF_CHANGED
#SELECT * FROM t1; SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
#COMMIT; SELECT * FROM t2;
#SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a; COMMIT;
#connection default; SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
#disconnect a; connection default;
#disconnect b; disconnect a;
# disconnect b;
#DROP TABLE t1;
# end disabled45225_2 DROP TABLE t1,t2;
# #
# restore environment to the state it was before this test execution # restore environment to the state it was before this test execution
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment