mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
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.
This commit is contained in:
parent
4b26365c1d
commit
7769a22622
2 changed files with 68 additions and 28 deletions
|
@ -1085,3 +1085,43 @@ t2 CREATE TABLE `t2` (
|
|||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t2;
|
||||
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;
|
|||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
|
||||
# The following tests are disabled because of the introduced timeouts for
|
||||
# metadata locks at the MySQL level as part of the fix for
|
||||
# Bug#45225 Locking: hang if drop table with no timeout
|
||||
# The following CREATE INDEX t1a ON t1(a); causes a lock wait timeout
|
||||
# start disabled45225_2
|
||||
#connect (a,localhost,root,,);
|
||||
#connect (b,localhost,root,,);
|
||||
#connection a;
|
||||
#CREATE TABLE t1 (a INT, b CHAR(1)) ENGINE=InnoDB;
|
||||
#INSERT INTO t1 VALUES (3,'a'),(3,'b'),(1,'c'),(0,'d'),(1,'e');
|
||||
#connection b;
|
||||
#BEGIN;
|
||||
#SELECT * FROM t1;
|
||||
#connection a;
|
||||
#CREATE INDEX t1a ON t1(a);
|
||||
#connection b;
|
||||
#SELECT * FROM t1;
|
||||
#--error ER_TABLE_DEF_CHANGED
|
||||
#SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a;
|
||||
#SELECT * FROM t1;
|
||||
#COMMIT;
|
||||
#SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a;
|
||||
#connection default;
|
||||
#disconnect a;
|
||||
#disconnect b;
|
||||
#
|
||||
#DROP TABLE t1;
|
||||
# end disabled45225_2
|
||||
connect (a,localhost,root,,);
|
||||
connect (b,localhost,root,,);
|
||||
connection a;
|
||||
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;
|
||||
connection b;
|
||||
BEGIN;
|
||||
# This acquires a MDL lock on t1 until commit.
|
||||
SELECT * FROM t1;
|
||||
connection a;
|
||||
# This times out before of the MDL lock held by connection b.
|
||||
SET lock_wait_timeout=1;
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
CREATE INDEX t1a ON t1(a);
|
||||
CREATE INDEX t2a ON t2(a);
|
||||
connection b;
|
||||
SELECT * FROM t2;
|
||||
--error ER_TABLE_DEF_CHANGED
|
||||
SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
|
||||
SELECT * FROM t2;
|
||||
COMMIT;
|
||||
SELECT * FROM t2 FORCE INDEX(t2a) ORDER BY a;
|
||||
connection default;
|
||||
disconnect a;
|
||||
disconnect b;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# restore environment to the state it was before this test execution
|
||||
|
|
Loading…
Reference in a new issue