summaryrefslogtreecommitdiffstats
path: root/mysql-test/main/flush_block_commit.test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
commit3f619478f796eddbba6e39502fe941b285dd97b1 (patch)
treee2c7b5777f728320e5b5542b6213fd3591ba51e2 /mysql-test/main/flush_block_commit.test
parentInitial commit. (diff)
downloadmariadb-3f619478f796eddbba6e39502fe941b285dd97b1.tar.xz
mariadb-3f619478f796eddbba6e39502fe941b285dd97b1.zip
Adding upstream version 1:10.11.6.upstream/1%10.11.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mysql-test/main/flush_block_commit.test')
-rw-r--r--mysql-test/main/flush_block_commit.test98
1 files changed, 98 insertions, 0 deletions
diff --git a/mysql-test/main/flush_block_commit.test b/mysql-test/main/flush_block_commit.test
new file mode 100644
index 00000000..0280aedf
--- /dev/null
+++ b/mysql-test/main/flush_block_commit.test
@@ -0,0 +1,98 @@
+# Let's see if FLUSH TABLES WITH READ LOCK blocks COMMIT of existing
+# transactions.
+# We verify that we did not introduce a deadlock.
+# This is intended to mimick how mysqldump and innobackup work.
+
+# And it requires InnoDB
+--source include/have_innodb.inc
+
+--echo # Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+connect (con1,localhost,root,,);
+connect (con2,localhost,root,,);
+connect (con3,localhost,root,,);
+connection con1;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+
+# blocks COMMIT ?
+
+BEGIN;
+INSERT INTO t1 VALUES(1);
+connection con2;
+FLUSH TABLES WITH READ LOCK;
+connection con1;
+--echo # Sending:
+--send COMMIT
+connection con2;
+--echo # Wait until COMMIT gets blocked.
+let $wait_condition=
+ select count(*) = 1 from information_schema.processlist
+ where state = "Waiting for backup lock" and info = "COMMIT";
+--source include/wait_condition.inc
+--echo # Verify that 'con1' was blocked and data did not move.
+SELECT * FROM t1;
+UNLOCK TABLES;
+connection con1;
+--echo # Reaping COMMIT
+--reap
+
+# No deadlock ?
+
+connection con1;
+BEGIN;
+SELECT * FROM t1 FOR UPDATE;
+connection con2;
+BEGIN;
+send SELECT * FROM t1 FOR UPDATE; # blocked by con1
+sleep 1;
+connection con3;
+send FLUSH TABLES WITH READ LOCK; # blocked by con2
+connection con1;
+COMMIT; # should not be blocked by con3
+connection con2;
+reap;
+COMMIT;
+connection con3;
+reap;
+UNLOCK TABLES;
+
+# Bug#6732 FLUSH TABLES WITH READ LOCK + COMMIT hangs later FLUSH TABLES
+# WITH READ LOCK
+
+connection con2;
+COMMIT; # unlock InnoDB row locks to allow insertions
+connection con1;
+BEGIN;
+INSERT INTO t1 VALUES(10);
+FLUSH TABLES WITH READ LOCK;
+connection con2;
+FLUSH TABLES WITH READ LOCK; # bug caused hang here
+UNLOCK TABLES;
+
+# Bug#7358 SHOW CREATE DATABASE fails if open transaction
+
+BEGIN;
+SELECT * FROM t1;
+SHOW CREATE DATABASE test;
+COMMIT;
+
+
+--echo # Cleanup
+connection default;
+disconnect con1;
+disconnect con2;
+disconnect con3;
+
+--echo # We commit open transactions when we disconnect: only then we can
+--echo # drop the table.
+DROP TABLE t1;
+--echo # End of 4.1 tests
+
+--echo # Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+