summaryrefslogtreecommitdiff
path: root/mysql-test/main/flush_read_lock_kill.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/main/flush_read_lock_kill.test')
-rw-r--r--mysql-test/main/flush_read_lock_kill.test80
1 files changed, 80 insertions, 0 deletions
diff --git a/mysql-test/main/flush_read_lock_kill.test b/mysql-test/main/flush_read_lock_kill.test
new file mode 100644
index 00000000000..d83e5b3f1df
--- /dev/null
+++ b/mysql-test/main/flush_read_lock_kill.test
@@ -0,0 +1,80 @@
+# Let's see if FLUSH TABLES WITH READ LOCK can be killed when waiting
+# for running commits to finish (in the past it could not)
+# This will not be a meaningful test on non-debug servers so will be
+# skipped.
+
+# This also won't work with the embedded server test
+--source include/not_embedded.inc
+
+--source include/have_debug.inc
+
+# This test needs transactional engine as otherwise COMMIT
+# won't block FLUSH TABLES WITH GLOBAL READ LOCK.
+--source include/have_innodb.inc
+
+# Save the initial number of concurrent sessions
+--source include/count_sessions.inc
+
+connect (con1,localhost,root,,);
+connect (con2,localhost,root,,);
+connection con1;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+SET DEBUG_SYNC= 'RESET';
+CREATE TABLE t1 (kill_id INT) engine = InnoDB;
+INSERT INTO t1 VALUES(connection_id());
+
+connection default;
+--echo # Start transaction.
+BEGIN;
+INSERT INTO t1 VALUES(connection_id());
+--echo # Ensure that COMMIT will pause once it acquires protection
+--echo # against its global read lock.
+SET DEBUG_SYNC='ha_commit_trans_after_acquire_commit_lock SIGNAL acquired WAIT_FOR go';
+
+--echo # Sending:
+--send COMMIT
+
+connection con1;
+--echo # Wait till COMMIT acquires protection against global read
+--echo # lock and pauses.
+SET DEBUG_SYNC='now WAIT_FOR acquired';
+--echo # Sending:
+send FLUSH TABLES WITH READ LOCK;
+
+connection con2;
+SELECT ((@id := kill_id) - kill_id) FROM t1 LIMIT 1;
+
+--echo # Wait till FLUSH TABLES WITH READ LOCK blocks due
+--echo # to active COMMIT
+let $wait_condition=
+ select count(*) = 1 from information_schema.processlist
+ where state = "Waiting for commit lock"
+ and info = "flush tables with read lock";
+--source include/wait_condition.inc
+
+--echo # Kill connection 'con1'.
+KILL CONNECTION @id;
+
+connection con1;
+--echo # Try to reap FLUSH TABLES WITH READ LOCK,
+--echo # it fail due to killed statement and connection.
+--error 1317,2013
+reap;
+
+connection con2;
+--echo # Resume COMMIT.
+SET DEBUG_SYNC='now SIGNAL go';
+
+connection default;
+--echo # Reaping COMMIT.
+--reap
+disconnect con2;
+DROP TABLE t1;
+SET DEBUG_SYNC= 'RESET';
+
+# Wait till all disconnects are completed
+--source include/wait_until_count_sessions.inc
+