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