mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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.
This commit is contained in:
@ -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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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);
|
|||||||
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;
|
|||||||
# 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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
# 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;
|
|||||||
# 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;
|
|||||||
# 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
|
|||||||
--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;
|
|||||||
reap;
|
reap;
|
||||||
connection locker;
|
connection locker;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
# End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Reference in New Issue
Block a user