polardbxengine/mysql-test/suite/xengine_main/t/rename_debug.test

255 lines
8.0 KiB
Plaintext

--source include/have_debug.inc
--source include/have_debug_sync.inc
# Some parts of the test require enabled binary log.
--source include/have_log_bin.inc
--echo #
--echo # Bug#22653180:ASSERT DD::CACHE::SHARED_MULTI_MAP<T>::
--echo # PUT(CONST K*, CONST T*, DD::CACHE::CACHE
--echo #
CREATE TABLE t1(i int);
--echo # Force rename_table to fail after update has been applied to dd cache
SET SESSION debug="+d,abort_rename_after_update";
--echo # rename table will fail with dummy error
--error ER_ERROR_ON_WRITE
RENAME TABLE t1 to t2;
SET SESSION debug="-d,abort_rename_after_update";
SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # Part of test coverage for WL#9826 "Allow RENAME TABLES under
--echo # LOCK TABLES" which needs debug build and debug_sync facility.
--echo #
--echo # The main part of coverage for this WL resides in rename.test.
--echo # This file only contains subtests which require debug/debug_sync
--echo # facilities, hence their odd numbering.
--enable_connect_log
SET @old_lock_wait_timeout= @@lock_wait_timeout;
connect (con1, localhost, root,,);
SET @old_lock_wait_timeout= @@lock_wait_timeout;
connection default;
--echo #
--echo # 1) Requirements on table locking for tables renamed and
--echo # target table names.
--echo #
--echo #
--echo # 1.2) Locking of target table.
CREATE TABLE t1 (i INT);
CREATE TABLE t2 (j INT);
--echo # RENAME TABLE under LOCK TABLES acquires X metadata
--echo # lock on target table name.
connection con1;
--echo # Ensure that table is cached in Table and Table Definition Caches.
SELECT * FROM t1;
SET DEBUG_SYNC='open_tables_after_open_and_process_table SIGNAL opened WAIT_FOR go';
--send SHOW CREATE TABLE t1
connection default;
--echo # Wait until SHOW CREATE TABLE acquires SH MDL on t1 and
--echo # starts waiting.
SET DEBUG_SYNC='now WAIT_FOR opened';
LOCK TABLES t2 WRITE;
--echo # RENAME TABLE fails due to lock timeout since it tries
--echo # to acquire X metadata lock on t1, on which SH metadata
--echo # lock is held in con1.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE t2 TO t1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
UNLOCK TABLES;
--echo #
--echo # 2) Failure to acquire/upgrade locks on tables involved.
--echo #
--echo # Failure to upgrade metadata lock on source table to X mode.
--echo # (note that con1 still holds SH lock on it).
LOCK TABLE t1 WRITE;
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE t1 TO t3;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
UNLOCK TABLES;
--echo #
--echo # Failure to acquire X metadata lock on target table name.
LOCK TABLES t2 WRITE;
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE t2 TO t1;
UNLOCK TABLES;
--echo # Unblock and reap SHOW CREATE TABLE.
SET DEBUG_SYNC='now SIGNAL go';
connection con1;
--reap
connection default;
SET DEBUG_SYNC='RESET';
DROP TABLES t1, t2;
--echo #
--echo # 4) Effects of failed RENAME TABLES on set of locked tables and
--echo # metadata locks held.
--echo #
--echo # 4.1) Atomic RENAME TABLES which fails at late stage should be
--echo # fully rolled back.
CREATE TABLE t1 (i INT) ENGINE=XENGINE;
CREATE TABLE t2 (j INT) ENGINE=XENGINE;
CREATE TABLE t0 (m INT) ENGINE=MyISAM;
--echo #
--echo # 4.3) Non-atomic RENAME TABLES which fails at late stage and
--echo # is NOT fully reverted. Tables involved are removed
--echo # from the set of locked tables. Metadata locks on both
--echo # old and new table names are kept.
LOCK TABLES t1 WRITE, t2 WRITE, t0 WRITE;
SET @@debug='+d,injecting_fault_writing';
--replace_regex /(errno: .*)/(errno: #)/
--error ER_ERROR_ON_WRITE
RENAME TABLES t0 TO t00, t1 TO t01;
SET @@debug='-d,injecting_fault_writing';
--echo # Tables are not available under both old and new names.
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t0;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t00;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t1;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t01;
--echo # Untouched table is still available.
SELECT * FROM t2;
connection con1;
--echo # Access by old and new names from other connections should be
--echo # blocked.
# Disable prepared statements, since for them the below check
# works differently. The prepare phase of statements execution
# acquires weaker S metadata lock (which do not conflict with
# SNRW locks held by LOCK TABLE WRITE) and manages to discover
# that tables with old name don't exist.
--disable_ps_protocol
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t0;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t00;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t01;
--echo # And access to untouched table too.
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t2;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--enable_ps_protocol
connection default;
UNLOCK TABLES;
DROP TABLES t00, t01, t2;
--echo #
--echo # 5) RENAME TABLES under LOCK TABLES and views.
--echo #
--echo # 5.1) Requirements on locking is similar to tables.
CREATE TABLE t1 (i INT);
CREATE TABLE t2 (j INT);
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE VIEW v2 AS SELECT * FROM t2;
--echo #
--echo # RENAME TABLE on view under LOCK TABLES acquires X metadata
--echo # lock on target name.
connection con1;
SET DEBUG_SYNC='open_tables_after_open_and_process_table SIGNAL opened WAIT_FOR go';
--send SHOW CREATE VIEW v2
connection default;
--echo # Wait until SHOW CREATE VIEW acquires SH MDL on v2 and
--echo # starts waiting.
SET DEBUG_SYNC='now WAIT_FOR opened';
LOCK TABLES v1 WRITE;
--echo # RENAME TABLE fails due to lock timeout since it tries
--echo # to acquire X metadata lock on v2, on which SH metadata
--echo # lock is held in con1.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE v1 TO v2;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
UNLOCK TABLES;
--echo # Unblock and reap SHOW CREATE VIEW.
SET DEBUG_SYNC='now SIGNAL go';
connection con1;
--reap
connection default;
SET DEBUG_SYNC='RESET';
DROP VIEW v1;
DROP VIEW v2;
DROP TABLES t1, t2;
--echo #
--echo # 7) RENAME TABLES under LOCK TABLES which moves tables
--echo # between schemas.
--echo #
--echo #
--echo # 7.4) Non-atomic RENAME TABLES which moves table to different chema,
--echo # fails at late stage and is NOT fully reverted. Tables involved
--echo # are removed from the set of locked tables. Metadata locks on
--echo # old, new table name and new schema are kept.
CREATE TABLE t1 (i INT) ENGINE=XENGINE;
CREATE TABLE t0 (l INT) ENGINE=MyISAM;
CREATE DATABASE mysqltest;
LOCK TABLES t0 WRITE, t1 WRITE;
SET @@debug='+d,injecting_fault_writing';
--replace_regex /(errno: .*)/(errno: #)/
--error ER_ERROR_ON_WRITE
RENAME TABLES t0 TO mysqltest.t0, t1 TO t01;
SET @@debug='-d,injecting_fault_writing';
--echo # Tables are not available under both old and new names.
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t0;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM mysqltest.t0;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t1;
--error ER_TABLE_NOT_LOCKED
SELECT * FROM t01;
connection con1;
--echo # Access by old and new names from other connections should be
--echo # blocked.
# Disable prepared statements, since for them the below check
# works differently. The prepare phase of statements execution
# acquires weaker S metadata lock (which do not conflict with
# SNRW locks held by LOCK TABLE WRITE) and manages to discover
# that tables with old name don't exist.
--disable_ps_protocol
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t0;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM mysqltest.t0;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t01;
--echo # New schema is IX locked.
--error ER_LOCK_WAIT_TIMEOUT
ALTER DATABASE mysqltest CHARACTER SET latin1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--enable_ps_protocol
connection default;
UNLOCK TABLES;
DROP TABLES t01;
DROP DATABASE mysqltest;
--echo # Clean-up.
connection con1;
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--disable_connect_log
--source suite/xengine/include/check_xengine_log_error.inc