Commit 9c72c3df authored by kostja@bodhi.(none)'s avatar kostja@bodhi.(none)

A fix for Bug#29049 lock_multi fails in rare case.

The patch changes the test case only.
The fix is to replace all 'sleep's with wait_condition. This makes
the test deterministic and also ~300 times faster.
parent 8f9168df
...@@ -13,9 +13,9 @@ insert into t1 values (1); ...@@ -13,9 +13,9 @@ insert into t1 values (1);
lock tables t1 read; lock tables t1 read;
update low_priority t1 set n = 4; update low_priority t1 set n = 4;
select n from t1; select n from t1;
unlock tables;
n n
1 1
unlock tables;
drop table t1; drop table t1;
create table t1 (a int, b int); create table t1 (a int, b int);
create table t2 (c int, d int); create table t2 (c int, d int);
...@@ -43,6 +43,7 @@ insert t1 select * from t2; ...@@ -43,6 +43,7 @@ insert t1 select * from t2;
drop table t2; drop table t2;
ERROR 42S02: Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
drop table t1; drop table t1;
End of 4.1 tests
create table t1(a int); create table t1(a int);
lock tables t1 write; lock tables t1 write;
show columns from t1; show columns from t1;
...@@ -91,10 +92,11 @@ DROP DATABASE mysqltest_1; ...@@ -91,10 +92,11 @@ DROP DATABASE mysqltest_1;
ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist
create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb; create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb;
lock tables t1 write; lock tables t1 write;
alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // alter table t1 auto_increment=0;
alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // alter table t1 auto_increment=0;
unlock tables; unlock tables;
drop table t1; drop table t1;
End of 5.0 tests
create table t1 (i int); create table t1 (i int);
lock table t1 read; lock table t1 read;
update t1 set i= 10;; update t1 set i= 10;;
......
...@@ -16,10 +16,16 @@ lock tables t1 write; ...@@ -16,10 +16,16 @@ lock tables t1 write;
connection writer; connection writer;
send update low_priority t1 set n = 4; send update low_priority t1 set n = 4;
connection reader; connection reader;
--sleep 2 let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
--source include/wait_condition.inc
send select n from t1; send select n from t1;
connection locker; connection locker;
--sleep 2 let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "select n from t1";
--source include/wait_condition.inc
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
...@@ -34,15 +40,15 @@ lock tables t1 read; ...@@ -34,15 +40,15 @@ lock tables t1 read;
connection writer; connection writer;
send update low_priority t1 set n = 4; send update low_priority t1 set n = 4;
connection reader; connection reader;
--sleep 2 let $wait_condition=
send select n from t1; select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
--source include/wait_condition.inc
select n from t1;
connection locker; connection locker;
--sleep 2
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
connection reader;
reap;
drop table t1; drop table t1;
# #
...@@ -58,13 +64,9 @@ insert into t1 values(2,2); ...@@ -58,13 +64,9 @@ insert into t1 values(2,2);
insert into t2 values(1,2); insert into t2 values(1,2);
lock table t1 read; lock table t1 read;
connection writer; connection writer;
--sleep 2 update t1,t2 set c=a where b=d;
send update t1,t2 set c=a where b=d;
connection reader; connection reader;
--sleep 2
select c from t2; select c from t2;
connection writer;
reap;
connection locker; connection locker;
drop table t1; drop table t1;
drop table t2; drop table t2;
...@@ -73,7 +75,7 @@ drop table t2; ...@@ -73,7 +75,7 @@ drop table t2;
# Test problem when using locks on many tables and droping a table that # Test problem when using locks on many tables and droping a table that
# is to-be-locked by another thread # is to-be-locked by another thread
# #
#
connection locker; connection locker;
create table t1 (a int); create table t1 (a int);
create table t2 (a int); create table t2 (a int);
...@@ -81,6 +83,10 @@ lock table t1 write, t2 write; ...@@ -81,6 +83,10 @@ lock table t1 write, t2 write;
connection reader; connection reader;
send insert t1 select * from t2; send insert t1 select * from t2;
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "insert t1 select * from t2";
--source include/wait_condition.inc
drop table t2; drop table t2;
connection reader; connection reader;
--error 1146 --error 1146
...@@ -99,6 +105,10 @@ lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write; ...@@ -99,6 +105,10 @@ lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write;
connection reader; connection reader;
send insert t1 select * from t2; send insert t1 select * from t2;
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "insert t1 select * from t2";
--source include/wait_condition.inc
drop table t2; drop table t2;
connection reader; connection reader;
--error 1146 --error 1146
...@@ -107,7 +117,7 @@ connection locker; ...@@ -107,7 +117,7 @@ connection locker;
drop table t1; drop table t1;
# End of 4.1 tests --echo End of 4.1 tests
# #
# BUG#9998 - MySQL client hangs on USE "database" # BUG#9998 - MySQL client hangs on USE "database"
...@@ -131,15 +141,18 @@ connection locker; ...@@ -131,15 +141,18 @@ connection locker;
use mysql; use mysql;
LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE; LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE;
FLUSH TABLES; FLUSH TABLES;
--sleep 1
# #
connection reader; connection reader;
use mysql; use mysql;
#NOTE: This must be a multi-table select, otherwise the deadlock will not occur #NOTE: This must be a multi-table select, otherwise the deadlock will not occur
send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1; send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
--sleep 1
# #
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info =
"SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1";
--source include/wait_condition.inc
# Make test case independent from earlier grants. # Make test case independent from earlier grants.
--replace_result "Table is already up to date" "OK" --replace_result "Table is already up to date" "OK"
OPTIMIZE TABLES columns_priv, db, host, user; OPTIMIZE TABLES columns_priv, db, host, user;
...@@ -163,10 +176,13 @@ LOCK TABLE t1 WRITE; ...@@ -163,10 +176,13 @@ LOCK TABLE t1 WRITE;
# This waits until t1 is unlocked. # This waits until t1 is unlocked.
connection locker; connection locker;
send FLUSH TABLES WITH READ LOCK; send FLUSH TABLES WITH READ LOCK;
--sleep 1
# #
# This must not block.
connection writer; connection writer;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
--source include/wait_condition.inc
# This must not block.
CREATE TABLE t2 (c1 int); CREATE TABLE t2 (c1 int);
UNLOCK TABLES; UNLOCK TABLES;
# #
...@@ -187,10 +203,13 @@ LOCK TABLE t1 WRITE; ...@@ -187,10 +203,13 @@ LOCK TABLE t1 WRITE;
# This waits until t1 is unlocked. # This waits until t1 is unlocked.
connection locker; connection locker;
send FLUSH TABLES WITH READ LOCK; send FLUSH TABLES WITH READ LOCK;
--sleep 1
# #
# This must not block. # This must not block.
connection writer; connection writer;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
--source include/wait_condition.inc
--error 1100 --error 1100
CREATE TABLE t2 AS SELECT * FROM t1; CREATE TABLE t2 AS SELECT * FROM t1;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -219,11 +238,15 @@ FLUSH TABLES WITH READ LOCK; ...@@ -219,11 +238,15 @@ FLUSH TABLES WITH READ LOCK;
# wait in wait_if_global_read_lock(). # wait in wait_if_global_read_lock().
connection con2; connection con2;
send DROP DATABASE mysqltest_1; send DROP DATABASE mysqltest_1;
--sleep 1
# #
# With bug in place: try to acquire LOCK_mysql_create_table... # With bug in place: try to acquire LOCK_mysql_create_table...
# When fixed: Reject dropping db because of the read lock. # When fixed: Reject dropping db because of the read lock.
connection con1; connection con1;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for release of readlock"
and info = "DROP DATABASE mysqltest_1";
--source include/wait_condition.inc
--error ER_CANT_UPDATE_WITH_READLOCK --error ER_CANT_UPDATE_WITH_READLOCK
DROP DATABASE mysqltest_1; DROP DATABASE mysqltest_1;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -249,17 +272,18 @@ create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) e ...@@ -249,17 +272,18 @@ create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) e
--enable_warnings --enable_warnings
lock tables t1 write; lock tables t1 write;
connection writer; connection writer;
--sleep 2 send alter table t1 auto_increment=0;
delimiter //;
send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
delimiter ;//
connection reader; connection reader;
--sleep 2 let $wait_condition=
delimiter //; select count(*) = 1 from information_schema.processlist
send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // where state = "Locked" and info = "alter table t1 auto_increment=0";
delimiter ;// --source include/wait_condition.inc
send alter table t1 auto_increment=0;
connection locker; connection locker;
--sleep 2 let $wait_condition=
select count(*) = 2 from information_schema.processlist
where state = "Locked" and info = "alter table t1 auto_increment=0";
--source include/wait_condition.inc
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
...@@ -267,8 +291,8 @@ connection reader; ...@@ -267,8 +291,8 @@ connection reader;
reap; reap;
connection locker; connection locker;
drop table t1; drop table t1;
#
# End of 5.0 tests --echo End of 5.0 tests
# #
......
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