diff options
Diffstat (limited to 'mysql-test/suite/maria/maria-recovery.test')
-rw-r--r-- | mysql-test/suite/maria/maria-recovery.test | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/mysql-test/suite/maria/maria-recovery.test b/mysql-test/suite/maria/maria-recovery.test new file mode 100644 index 00000000..04f5f665 --- /dev/null +++ b/mysql-test/suite/maria/maria-recovery.test @@ -0,0 +1,234 @@ +--source include/not_embedded.inc +# Don't test this under valgrind, memory leaks will occur as we crash +--source include/not_valgrind.inc +# Binary must be compiled with debug for crash to occur +--source include/have_debug.inc +--source include/have_maria.inc +--source include/default_charset.inc + +set global aria_log_file_size=4294959104; +let $MARIA_LOG=../../tmp; + +--disable_warnings +drop database if exists mysqltest; +--enable_warnings +create database mysqltest; +let $mms_tname=t; + +# Include scripts can perform SQL. For it to not influence the main test +# they use a separate connection. This way if they use a DDL it would +# not autocommit in the main test. +connect (admin, localhost, root,,mysqltest,,); +--enable_reconnect + +connection default; +use mysqltest; +--enable_reconnect + +# A sample test +-- source include/maria_empty_logs.inc +let $mms_tables=1; +create table t1 (a varchar(1000)) engine=aria; + +--echo * TEST of REDO: see if recovery can reconstruct if we give it an old table + +-- source include/maria_make_snapshot_for_feeding_recovery.inc +# Your committed statements here, which we expect to +# be reconstructed from the log +insert into t1 values ("00000000"); +-- source include/maria_make_snapshot_for_comparison.inc +# we want recovery to run on the first snapshot made above +let $mvr_restore_old_snapshot=1; +# As we did only committed work, we test REDO applying, which could +# produce a physically identical table. +let $mms_compare_physically=1; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +# the script below will trigger recovery and compare checksums +-- source include/maria_verify_recovery.inc +let $mms_compare_physically=0; +# so a SELECT like this is pure visual effect, brings nothing. +select * from t1; + +--echo * TEST of REDO+UNDO: normal recovery test (no moving tables under its feet) + +# different types of crash => a loop; here are loop control variables +let $crash_no_flush=1; +let $crash_flush_whole_page_cache=0; +let $crash_flush_states=0; +let $crash_flush_whole_log=0; +let $crash_loop=1; + +# we want recovery to use the tables as they were at time of crash +let $mvr_restore_old_snapshot=0; +# UNDO phase prevents physical comparison, normally, +# so we'll only use checksums to compare. +let $mms_compare_physically=0; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; + +# Note that we don't remove logs between iterations. Test is +# cumulative (each new recovery processes more log records than the previous). + +while ($crash_loop) +{ + if ($crash_flush_whole_log) + { + let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; + # set up what next iteration should do: + let $crash_flush_whole_log=0; + let $crash_loop=0; + } + if ($crash_flush_states) + { + let $mvr_debug_option="+d,maria_flush_states,maria_flush_whole_log,maria_crash"; + let $crash_flush_states=0; + let $crash_flush_whole_log=1; + } + if ($crash_flush_whole_page_cache) + { + let $mvr_debug_option="+d,maria_flush_whole_page_cache,maria_crash"; + let $crash_flush_whole_page_cache=0; + let $crash_flush_states=1; + } + if ($crash_no_flush) + { + let $mvr_debug_option="+d,maria_crash"; + let $crash_no_flush=0; + let $crash_flush_whole_page_cache=1; + } + # Your committed statements here + insert into t1 values ("00000000"); + -- source include/maria_make_snapshot_for_comparison.inc + # Your statements which we expect to be rolled back + lock tables t1 write; + insert into t1 values ("aaaaaaaaa"); + -- source include/maria_verify_recovery.inc + select * from t1; +} + +drop table t1; + +# what did we compare above: +# - checksum: tells that the tables contain the same amount of rows +# and same data in rows +# - index: no, neither state nor pages were compared +# - bitmap pages: the REPAIR QUICK done above very probably checks +# that bitmap reflects page occupation; do we need to do physical +# compare? +# - page LSN: not compared; we should compare that page's LSN in new +# table is >= page's LSN in old table (it can be >, due to UNDO phase) +# we had a bug where new page's LSN was 0... todo. + +# +# Test for this bug: an UPDATE purges and rewrites a tail page, and +# recovery applied the purge, stamped page with UNDO's LSN, thus +# the rewrite was ignored. +# + +--echo * TEST of two REDOs for same page in one REDO group +-- source include/maria_empty_logs.inc +let $mms_tables=1; +CREATE TABLE t1 ( + i int, + b blob default NULL, + c varchar(6000) default NULL +) ENGINE=ARIA CHECKSUM=1; +-- source include/maria_make_snapshot_for_feeding_recovery.inc +INSERT INTO t1 VALUES (1, REPEAT('a', 5000), REPEAT('b', 5000)); +UPDATE t1 SET i=3, b=CONCAT(b,'c') WHERE i=1; +SELECT LENGTH(b) FROM t1 WHERE i=3; +-- source include/maria_make_snapshot_for_comparison.inc +# we want recovery to run on the first snapshot made above +let $mvr_restore_old_snapshot=1; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +-- source include/maria_verify_recovery.inc +SELECT LENGTH(b) FROM t1 WHERE i=3; +drop table t1; + +# Test that INSERT's effect on auto-increment is recovered +--echo * TEST of INSERT vs state.auto_increment +-- source include/maria_empty_logs.inc +let $mms_tables=1; +CREATE TABLE t1 ( + i int auto_increment primary key, + c varchar(6), + key(c) +) ENGINE=ARIA; +insert into t1 values(null,"b"); +-- source include/maria_make_snapshot_for_feeding_recovery.inc +insert into t1 values(null,"a"), (null,"c"), (null,"d"); +# With this DELETE we also verify that Recovery cares only about INSERTs +delete from t1 where c="d"; +-- source include/maria_make_snapshot_for_comparison.inc +let $mvr_restore_old_snapshot=1; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +-- source include/maria_verify_recovery.inc +show create table t1; + +# Test that UPDATE's effect on auto-increment is recovered +--echo * TEST of UPDATE vs state.auto_increment +-- source include/maria_make_snapshot_for_feeding_recovery.inc +update t1 set i=15 where c="a"; +-- source include/maria_make_snapshot_for_comparison.inc +let $mvr_restore_old_snapshot=1; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +-- source include/maria_verify_recovery.inc +show create table t1; + +# Test that INSERT's rollback does not set auto-increment counter to 1 +# (BUG#34106) +--echo * TEST of INSERT's rollback vs state.auto_increment +-- source include/maria_make_snapshot_for_comparison.inc +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +lock tables t1 write; +insert into t1 values(null, "e"); +-- source include/maria_verify_recovery.inc +show create table t1; +insert into t1 values(null, "f"); +drop table t1; + +--echo Test that bulk insert works with recovery +let $mms_tables=2; + +CREATE TABLE t1 (i int, key(i)) TRANSACTIONAL=1 ENGINE=ARIA; +CREATE TABLE t2 (i int, key(i)) TRANSACTIONAL=1 ENGINE=ARIA; +-- source include/maria_make_snapshot_for_feeding_recovery.inc +insert into t2 values + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (3), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); +insert into t1 select * from t2; +insert into t2 select * from t2; +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash"; +let $mvr_crash_statement= set global aria_checkpoint_interval=1; +let $mms_tables=0; +-- source include/maria_verify_recovery.inc +select count(*) from t1; +select count(*) from t2; +check table t2; +drop table t1,t2; + +# clean up everything +let $mms_purpose=feeding_recovery; +eval drop database mysqltest_for_$mms_purpose; +let $mms_purpose=comparison; +eval drop database mysqltest_for_$mms_purpose; +drop database mysqltest; |