--echo # --echo # Inject failures in order to get code coverage. --echo # Use explicit undo tablespaces and make the implicit spaces inactive. --echo # --source include/have_debug.inc --source include/have_innodb_default_undo_tablespaces.inc LET $MYSQLD_DATADIR = `select @@datadir`; # Do a slow shutdown and restart to clear out the undo logs SET GLOBAL innodb_fast_shutdown = 0; --let $shutdown_server_timeout = 300 --source include/restart_mysqld.inc --disable_query_log call mtr.add_suppression("\\[Warning\\] .* Failed to truncate undo tablespace"); call mtr.add_suppression("\\[Warning\\] .* Purge reached the head of the history list"); call mtr.add_suppression("\\[ERROR\\] .* Error 65 opening newly created undo tablespace"); call mtr.add_suppression("\\[ERROR\\] .* Cannot create truncate log for undo tablespace"); --enable_query_log CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu'; CREATE UNDO TABLESPACE undo_004 ADD DATAFILE 'undo_004.ibu'; CREATE UNDO TABLESPACE undo_005 ADD DATAFILE 'undo_005.ibu'; ALTER UNDO TABLESPACE innodb_undo_001 SET INACTIVE; let $inactive_undo_space = innodb_undo_001; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE innodb_undo_002 SET INACTIVE; let $inactive_undo_space = innodb_undo_002; source include/wait_until_undo_space_is_empty.inc; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME; --echo # --echo # Bug#28966457: IF CREATE UNDO TABLESPACE FAILS, INCOMPLETE UNDO --echo # TABLESPACE SHOULD BE CLEANED UP --echo # --list_files $MYSQLD_DATADIR/ undo_006.ibu SET GLOBAL DEBUG="+d,ib_undo_tablespace_create_fail"; --error ER_CREATE_FILEGROUP_FAILED CREATE UNDO TABLESPACE undo_006 ADD DATAFILE 'undo_006.ibu'; SET GLOBAL DEBUG="-d,ib_undo_tablespace_create_fail"; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME; --echo # Make sure file is not left behind in datadir --list_files $MYSQLD_DATADIR/ undo_006.ibu --echo # --echo # Inject a failure to open an undo tablespace after it is created. --echo # The file remains on disk along with the truncate log file. --echo # --list_files $MYSQLD_DATADIR/ undo_006.ibu SET GLOBAL DEBUG="+d,ib_undo_tablespace_open_fail"; --error ER_CREATE_FILEGROUP_FAILED CREATE UNDO TABLESPACE undo_006 ADD DATAFILE 'undo_006.ibu'; SET GLOBAL DEBUG="-d,ib_undo_tablespace_open_fail"; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME; --echo # Make sure file is not left behind in datadir --list_files $MYSQLD_DATADIR/ undo_006.ibu --echo # --echo # Inject a failure to get the MDL during undo truncate. --echo # SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_get_mdl"; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_003 SET ACTIVE; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; --echo # --echo # Inject a failure to locate the undo space during undo truncate. --echo # SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_marked_space"; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_003 SET ACTIVE; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; --echo # --echo # Inject a failure to write the undo trunc log file. --echo # SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_start_logging"; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_003 SET ACTIVE; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; --echo # --echo # Inject a simulated fast shutdown during undo truncate. The injection --echo # does't really shutdown, it just does not finish the truncate. --echo # SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_fast_shutdown"; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_003 SET ACTIVE; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; --echo # --echo # Inject a failure to actually truncate the undo space. --echo # SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_truncate"; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_003 SET ACTIVE; SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE_TYPE = 'Undo' ORDER BY NAME; --echo # --echo # Cleanup --echo # SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_get_mdl"; SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_marked_space"; SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_start_logging"; SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_fast_shutdown"; SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_truncate"; ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE; ALTER UNDO TABLESPACE innodb_undo_002 SET ACTIVE; ALTER UNDO TABLESPACE undo_003 SET INACTIVE; ALTER UNDO TABLESPACE undo_004 SET INACTIVE; ALTER UNDO TABLESPACE undo_005 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; let $inactive_undo_space = undo_004; source include/wait_until_undo_space_is_empty.inc; let $inactive_undo_space = undo_005; source include/wait_until_undo_space_is_empty.inc; DROP UNDO TABLESPACE undo_003; DROP UNDO TABLESPACE undo_004; DROP UNDO TABLESPACE undo_005;