# 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 --source include/have_debug_sync.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 backup 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