1# Let's see if FLUSH TABLES WITH READ LOCK blocks COMMIT of existing 2# transactions. 3# We verify that we did not introduce a deadlock. 4# This is intended to mimick how mysqldump and innobackup work. 5 6# And it requires InnoDB 7--source include/have_innodb.inc 8 9--echo # Save the initial number of concurrent sessions 10--source include/count_sessions.inc 11 12connect (con1,localhost,root,,); 13connect (con2,localhost,root,,); 14connect (con3,localhost,root,,); 15connection con1; 16 17--disable_warnings 18DROP TABLE IF EXISTS t1; 19--enable_warnings 20CREATE TABLE t1 (a INT) ENGINE=innodb; 21 22# blocks COMMIT ? 23 24BEGIN; 25INSERT INTO t1 VALUES(1); 26connection con2; 27FLUSH TABLES WITH READ LOCK; 28connection con1; 29--echo # Sending: 30--send COMMIT 31connection con2; 32--echo # Wait until COMMIT gets blocked. 33let $wait_condition= 34 select count(*) = 1 from information_schema.processlist 35 where state = "Waiting for backup lock" and info = "COMMIT"; 36--source include/wait_condition.inc 37--echo # Verify that 'con1' was blocked and data did not move. 38SELECT * FROM t1; 39UNLOCK TABLES; 40connection con1; 41--echo # Reaping COMMIT 42--reap 43 44# No deadlock ? 45 46connection con1; 47BEGIN; 48SELECT * FROM t1 FOR UPDATE; 49connection con2; 50BEGIN; 51send SELECT * FROM t1 FOR UPDATE; # blocked by con1 52sleep 1; 53connection con3; 54send FLUSH TABLES WITH READ LOCK; # blocked by con2 55connection con1; 56COMMIT; # should not be blocked by con3 57connection con2; 58reap; 59COMMIT; 60connection con3; 61reap; 62UNLOCK TABLES; 63 64# Bug#6732 FLUSH TABLES WITH READ LOCK + COMMIT hangs later FLUSH TABLES 65# WITH READ LOCK 66 67connection con2; 68COMMIT; # unlock InnoDB row locks to allow insertions 69connection con1; 70BEGIN; 71INSERT INTO t1 VALUES(10); 72FLUSH TABLES WITH READ LOCK; 73connection con2; 74FLUSH TABLES WITH READ LOCK; # bug caused hang here 75UNLOCK TABLES; 76 77# Bug#7358 SHOW CREATE DATABASE fails if open transaction 78 79BEGIN; 80SELECT * FROM t1; 81SHOW CREATE DATABASE test; 82COMMIT; 83 84 85--echo # Cleanup 86connection default; 87disconnect con1; 88disconnect con2; 89disconnect con3; 90 91--echo # We commit open transactions when we disconnect: only then we can 92--echo # drop the table. 93DROP TABLE t1; 94--echo # End of 4.1 tests 95 96--echo # Wait till all disconnects are completed 97--source include/wait_until_count_sessions.inc 98 99