From 6559f5c229a082a695a728be1c23a4d59f7b3d9b Mon Sep 17 00:00:00 2001 From: Guilhem Bichot Date: Mon, 30 Jun 2008 11:34:58 +0200 Subject: [PATCH] cutting test in two because it takes many things mysql-test/r/maria-recovery.result: cutting test in two mysql-test/r/maria-recovery2.result: cutting test in two mysql-test/t/maria-recovery.test: cutting test in two mysql-test/t/maria-recovery2-master.opt: cutting test in two mysql-test/t/maria-recovery2.test: cutting test in two --- mysql-test/r/maria-recovery.result | 139 --------------------- mysql-test/r/maria-recovery2.result | 145 +++++++++++++++++++++ mysql-test/t/maria-recovery.test | 123 ------------------ mysql-test/t/maria-recovery2-master.opt | 1 + mysql-test/t/maria-recovery2.test | 159 ++++++++++++++++++++++++ 5 files changed, 305 insertions(+), 262 deletions(-) create mode 100644 mysql-test/r/maria-recovery2.result create mode 100644 mysql-test/t/maria-recovery2-master.opt create mode 100644 mysql-test/t/maria-recovery2.test diff --git a/mysql-test/r/maria-recovery.result b/mysql-test/r/maria-recovery.result index a46e96b1a9b..b0440489cd1 100644 --- a/mysql-test/r/maria-recovery.result +++ b/mysql-test/r/maria-recovery.result @@ -237,145 +237,6 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MARIA AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 insert into t1 values(null, "f"); drop table t1; -* TEST of removing logs manually -* shut down mysqld, removed logs, restarted it -* TEST of UNDO_ROW_DELETE preserving rowid -create table t1(a int) engine=maria; -insert into t1 values(1),(2); -flush table t1; -* copied t1 for comparison -lock tables t1 write; -insert into t1 values(3); -delete from t1 where a in (1,2,3); -SET SESSION debug="+d,maria_flush_whole_log,maria_crash"; -* crashing mysqld intentionally -set global maria_checkpoint_interval=1; -ERROR HY000: Lost connection to MySQL server during query -* recovery happens -check table t1 extended; -Table Op Msg_type Msg_text -mysqltest.t1 check status OK -* testing that checksum after recovery is as expected -Checksum-check -ok -use mysqltest; -drop table t1; -* TEST of checkpoint -set global debug="+d,info,query,enter,exit,loop,maria_checkpoint_indirect"; -set global maria_checkpoint_interval=10000; -create table t1(a int, b varchar(10), index(a,b)) engine=maria; -insert into t1 values(1,"a"),(2,"b"),(3,"c"); -delete from t1 where b="b"; -update t1 set b="d" where a=1; -flush table t1; -* copied t1 for comparison -lock tables t1 write; -insert into t1 values(4,"e"),(5,"f"),(6,"g"); -update t1 set b="h" where a=5; -delete from t1 where b="g"; -show status like "Maria_pagecache_blocks_not_flushed"; -Variable_name Value -Maria_pagecache_blocks_not_flushed 3 -set global maria_checkpoint_interval=10000; -update t1 set b="i" where a=5; -SET SESSION debug="+d,maria_crash"; -* crashing mysqld intentionally -set global maria_checkpoint_interval=1; -ERROR HY000: Lost connection to MySQL server during query -* recovery happens -check table t1 extended; -Table Op Msg_type Msg_text -mysqltest.t1 check status OK -* testing that checksum after recovery is as expected -Checksum-check -ok -use mysqltest; -drop table t1; -Test of REPAIR's implicit commit -create table t1 (a varchar(100), key(a)) engine=maria; -insert into t1 values(3); -flush table t1; -* copied t1 for comparison -lock tables t1 write; -insert into t1 values (1); -repair table t1; -Table Op Msg_type Msg_text -mysqltest.t1 repair status OK -insert into t1 values(2); -select * from t1; -a -1 -2 -3 -SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; -* crashing mysqld intentionally -set global maria_checkpoint_interval=1; -ERROR HY000: Lost connection to MySQL server during query -* recovery happens -check table t1 extended; -Table Op Msg_type Msg_text -mysqltest.t1 check status OK -* testing that checksum after recovery is as expected -Checksum-check -failure -use mysqltest; -select * from t1; -a -1 -3 -drop table t1; -* TEST of recovery when crash before bulk-insert-with-repair is committed -create table t1 (a varchar(100), key(a)) engine=maria; -create table t2 (a varchar(100)) engine=myisam; -set rand_seed1=12, rand_seed2=254; -insert into t2 values (rand()); -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t1 values(30); -flush table t1; -* copied t1 for comparison -lock tables t1 write, t2 read; -delete from t1 limit 1; -insert into t1 select * from t2; -SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; -* crashing mysqld intentionally -set global maria_checkpoint_interval=1; -ERROR HY000: Lost connection to MySQL server during query -* recovery happens -check table t1 extended; -Table Op Msg_type Msg_text -mysqltest.t1 check status OK -* testing that checksum after recovery is as expected -Checksum-check -ok -use mysqltest; -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 1 a 1 a A 1 NULL NULL YES BTREE -drop table t1; -* TEST of recovery when OPTIMIZE has replaced the index file and crash -create table t_corrupted1 (a varchar(100), key(a)) engine=maria; -insert into t_corrupted1 select (rand()) from t2; -flush table t_corrupted1; -* copied t_corrupted1 for comparison -SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash_sort_index"; -* crashing mysqld intentionally -optimize table t_corrupted1; -ERROR HY000: Lost connection to MySQL server during query -* recovery happens -check table t_corrupted1 extended; -Table Op Msg_type Msg_text -mysqltest.t_corrupted1 check warning Table is marked as crashed and last repair failed -mysqltest.t_corrupted1 check status OK -* testing that checksum after recovery is as expected -Checksum-check -ok -use mysqltest; -drop table t_corrupted1, t2; drop database mysqltest_for_feeding_recovery; drop database mysqltest_for_comparison; drop database mysqltest; diff --git a/mysql-test/r/maria-recovery2.result b/mysql-test/r/maria-recovery2.result new file mode 100644 index 00000000000..223b5578921 --- /dev/null +++ b/mysql-test/r/maria-recovery2.result @@ -0,0 +1,145 @@ +set global maria_log_file_size=4294967295; +drop database if exists mysqltest; +create database mysqltest; +use mysqltest; +* TEST of removing logs manually +* shut down mysqld, removed logs, restarted it +* TEST of UNDO_ROW_DELETE preserving rowid +create table t1(a int) engine=maria; +insert into t1 values(1),(2); +flush table t1; +* copied t1 for comparison +lock tables t1 write; +insert into t1 values(3); +delete from t1 where a in (1,2,3); +SET SESSION debug="+d,maria_flush_whole_log,maria_crash"; +* crashing mysqld intentionally +set global maria_checkpoint_interval=1; +ERROR HY000: Lost connection to MySQL server during query +* recovery happens +check table t1 extended; +Table Op Msg_type Msg_text +mysqltest.t1 check status OK +* testing that checksum after recovery is as expected +Checksum-check +ok +use mysqltest; +drop table t1; +* TEST of checkpoint +set global debug="+d,info,query,enter,exit,loop,maria_checkpoint_indirect"; +set global maria_checkpoint_interval=10000; +create table t1(a int, b varchar(10), index(a,b)) engine=maria; +insert into t1 values(1,"a"),(2,"b"),(3,"c"); +delete from t1 where b="b"; +update t1 set b="d" where a=1; +flush table t1; +* copied t1 for comparison +lock tables t1 write; +insert into t1 values(4,"e"),(5,"f"),(6,"g"); +update t1 set b="h" where a=5; +delete from t1 where b="g"; +show status like "Maria_pagecache_blocks_not_flushed"; +Variable_name Value +Maria_pagecache_blocks_not_flushed 3 +set global maria_checkpoint_interval=10000; +update t1 set b="i" where a=5; +SET SESSION debug="+d,maria_crash"; +* crashing mysqld intentionally +set global maria_checkpoint_interval=1; +ERROR HY000: Lost connection to MySQL server during query +* recovery happens +check table t1 extended; +Table Op Msg_type Msg_text +mysqltest.t1 check status OK +* testing that checksum after recovery is as expected +Checksum-check +ok +use mysqltest; +drop table t1; +Test of REPAIR's implicit commit +create table t1 (a varchar(100), key(a)) engine=maria; +insert into t1 values(3); +flush table t1; +* copied t1 for comparison +lock tables t1 write; +insert into t1 values (1); +repair table t1; +Table Op Msg_type Msg_text +mysqltest.t1 repair status OK +insert into t1 values(2); +select * from t1; +a +1 +2 +3 +SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; +* crashing mysqld intentionally +set global maria_checkpoint_interval=1; +ERROR HY000: Lost connection to MySQL server during query +* recovery happens +check table t1 extended; +Table Op Msg_type Msg_text +mysqltest.t1 check status OK +* testing that checksum after recovery is as expected +Checksum-check +failure +use mysqltest; +select * from t1; +a +1 +3 +drop table t1; +* TEST of recovery when crash before bulk-insert-with-repair is committed +create table t1 (a varchar(100), key(a)) engine=maria; +create table t2 (a varchar(100)) engine=myisam; +set rand_seed1=12, rand_seed2=254; +insert into t2 values (rand()); +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t1 values(30); +flush table t1; +* copied t1 for comparison +lock tables t1 write, t2 read; +delete from t1 limit 1; +insert into t1 select * from t2; +SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; +* crashing mysqld intentionally +set global maria_checkpoint_interval=1; +ERROR HY000: Lost connection to MySQL server during query +* recovery happens +check table t1 extended; +Table Op Msg_type Msg_text +mysqltest.t1 check status OK +* testing that checksum after recovery is as expected +Checksum-check +ok +use mysqltest; +show keys from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +t1 1 a 1 a A 1 NULL NULL YES BTREE +drop table t1; +* TEST of recovery when OPTIMIZE has replaced the index file and crash +create table t_corrupted1 (a varchar(100), key(a)) engine=maria; +insert into t_corrupted1 select (rand()) from t2; +flush table t_corrupted1; +* copied t_corrupted1 for comparison +SET SESSION debug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash_sort_index"; +* crashing mysqld intentionally +optimize table t_corrupted1; +ERROR HY000: Lost connection to MySQL server during query +* recovery happens +check table t_corrupted1 extended; +Table Op Msg_type Msg_text +mysqltest.t_corrupted1 check warning Table is marked as crashed and last repair failed +mysqltest.t_corrupted1 check status OK +* testing that checksum after recovery is as expected +Checksum-check +ok +use mysqltest; +drop table t_corrupted1, t2; +drop database mysqltest_for_comparison; +drop database mysqltest; diff --git a/mysql-test/t/maria-recovery.test b/mysql-test/t/maria-recovery.test index cbd5cf2bb4c..acc70302842 100644 --- a/mysql-test/t/maria-recovery.test +++ b/mysql-test/t/maria-recovery.test @@ -195,129 +195,6 @@ show create table t1; insert into t1 values(null, "f"); drop table t1; -# Test of removing logs manually ---echo * TEST of removing logs manually -let $mel_keep_control_file=1; -# this will shut mysqld down cleanly (so, take a checkpoint) and -# remove only logs; at restart Maria will create a new log with a high -# number --- source include/maria_empty_logs.inc -let $mel_keep_control_file=0; -# next test will help us verify that a next recovery is ok - ---echo * TEST of UNDO_ROW_DELETE preserving rowid -# 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 maria_checkpoint_interval=1; -create table t1(a int) engine=maria; -insert into t1 values(1),(2); --- source include/maria_make_snapshot_for_comparison.inc -lock tables t1 write; -insert into t1 values(3); -delete from t1 where a in (1,2,3); --- source include/maria_verify_recovery.inc -drop table t1; - -# A basic checkpoint test ---echo * TEST of checkpoint -# Don't take a full checkpoints, we want to test checkpoint vs dirty pages -set global debug="+d,info,query,enter,exit,loop,maria_checkpoint_indirect"; -# restart checkpoint thread for it to notice the above -set global maria_checkpoint_interval=10000; -create table t1(a int, b varchar(10), index(a,b)) engine=maria; -insert into t1 values(1,"a"),(2,"b"),(3,"c"); -delete from t1 where b="b"; -update t1 set b="d" where a=1; --- source include/maria_make_snapshot_for_comparison.inc -lock tables t1 write; -insert into t1 values(4,"e"),(5,"f"),(6,"g"); -update t1 set b="h" where a=5; -delete from t1 where b="g"; -show status like "Maria_pagecache_blocks_not_flushed"; -# force a checkpoint; there should be dirty pages and an open transaction -set global maria_checkpoint_interval=10000; -# do some more work -update t1 set b="i" where a=5; -let $mvr_restore_old_snapshot=0; -let $mms_compare_physically=0; -let $mvr_debug_option="+d,maria_crash"; -let $mvr_crash_statement= set global maria_checkpoint_interval=1; -# Now we have a recovery, which should use the checkpoint record -# and its dirty pages list. --- source include/maria_verify_recovery.inc -drop table t1; - ---echo Test of REPAIR's implicit commit -let $mms_tables=1; -create table t1 (a varchar(100), key(a)) engine=maria; -let $mvr_restore_old_snapshot=0; -let $mms_compare_physically=0; -let $mvr_crash_statement= set global maria_checkpoint_interval=1; - -let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; -insert into t1 values(3); --- source include/maria_make_snapshot_for_comparison.inc -lock tables t1 write; -insert into t1 values (1); -repair table t1; -insert into t1 values(2); -select * from t1; - -# checksum comparison failure is expected, SELECT output matters --- source include/maria_verify_recovery.inc -# 2 should be missing (rolled back) but 1 should be committed -select * from t1; -drop table t1; - ---echo * TEST of recovery when crash before bulk-insert-with-repair is committed -create table t1 (a varchar(100), key(a)) engine=maria; -create table t2 (a varchar(100)) engine=myisam; -let $mvr_restore_old_snapshot=0; -let $mms_compare_physically=0; -let $mvr_crash_statement= set global maria_checkpoint_interval=1; -let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; -set rand_seed1=12, rand_seed2=254; # repeatable -insert into t2 values (rand()); -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t2 select (rand()) from t2; -insert into t1 values(30); --- source include/maria_make_snapshot_for_comparison.inc -lock tables t1 write, t2 read; -delete from t1 limit 1; -# 127 rows in t2, >100, so this will use repair-at-end -insert into t1 select * from t2; --- source include/maria_verify_recovery.inc -show keys from t1; # should be enabled -drop table t1; - ---echo * TEST of recovery when OPTIMIZE has replaced the index file and crash -create table t_corrupted1 (a varchar(100), key(a)) engine=maria; -# we use a special name because this test portion will generate -# corruption warnings, which we tell mtr_report.pl to ignore by -# putting the message in mtr_report.pl, but we don't want to it ignore -# corruption messages of other tests, hence the special name -# 't_corrupted' and not just 't'. -let $mms_tname=t_corrupted; -let $mvr_restore_old_snapshot=0; -let $mms_compare_physically=0; -let $mvr_crash_statement= optimize table t_corrupted1; -let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash_sort_index"; -insert into t_corrupted1 select (rand()) from t2; --- source include/maria_make_snapshot_for_comparison.inc -# Recovery will not fix the table, but we expect to see it marked -# "crashed on repair". -# Because crash is mild, the table is actually not corrupted, so the -# "check table extended" done below fixes the table. --- source include/maria_verify_recovery.inc -drop table t_corrupted1, t2; - # clean up everything let $mms_purpose=feeding_recovery; eval drop database mysqltest_for_$mms_purpose; diff --git a/mysql-test/t/maria-recovery2-master.opt b/mysql-test/t/maria-recovery2-master.opt new file mode 100644 index 00000000000..7fece2f8c1b --- /dev/null +++ b/mysql-test/t/maria-recovery2-master.opt @@ -0,0 +1 @@ +--skip-stack-trace --skip-core-file --maria-log-dir-path=../tmp diff --git a/mysql-test/t/maria-recovery2.test b/mysql-test/t/maria-recovery2.test new file mode 100644 index 00000000000..8ce601625f6 --- /dev/null +++ b/mysql-test/t/maria-recovery2.test @@ -0,0 +1,159 @@ +--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 + +set global maria_log_file_size=4294967295; +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, 127.0.0.1, root,,mysqltest,,); +--enable_reconnect + +connection default; +use mysqltest; +--enable_reconnect + +let $mms_tables=1; +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 maria_checkpoint_interval=1; + +# Test of removing logs manually +--echo * TEST of removing logs manually +let $mel_keep_control_file=1; +# this will shut mysqld down cleanly (so, take a checkpoint) and +# remove only logs; at restart Maria will create a new log with a high +# number +-- source include/maria_empty_logs.inc +let $mel_keep_control_file=0; +# next test will help us verify that a next recovery is ok + +--echo * TEST of UNDO_ROW_DELETE preserving rowid +# 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 maria_checkpoint_interval=1; +create table t1(a int) engine=maria; +insert into t1 values(1),(2); +-- source include/maria_make_snapshot_for_comparison.inc +lock tables t1 write; +insert into t1 values(3); +delete from t1 where a in (1,2,3); +-- source include/maria_verify_recovery.inc +drop table t1; + +# A basic checkpoint test +--echo * TEST of checkpoint +# Don't take a full checkpoints, we want to test checkpoint vs dirty pages +set global debug="+d,info,query,enter,exit,loop,maria_checkpoint_indirect"; +# restart checkpoint thread for it to notice the above +set global maria_checkpoint_interval=10000; +create table t1(a int, b varchar(10), index(a,b)) engine=maria; +insert into t1 values(1,"a"),(2,"b"),(3,"c"); +delete from t1 where b="b"; +update t1 set b="d" where a=1; +-- source include/maria_make_snapshot_for_comparison.inc +lock tables t1 write; +insert into t1 values(4,"e"),(5,"f"),(6,"g"); +update t1 set b="h" where a=5; +delete from t1 where b="g"; +show status like "Maria_pagecache_blocks_not_flushed"; +# force a checkpoint; there should be dirty pages and an open transaction +set global maria_checkpoint_interval=10000; +# do some more work +update t1 set b="i" where a=5; +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_debug_option="+d,maria_crash"; +let $mvr_crash_statement= set global maria_checkpoint_interval=1; +# Now we have a recovery, which should use the checkpoint record +# and its dirty pages list. +-- source include/maria_verify_recovery.inc +drop table t1; + +--echo Test of REPAIR's implicit commit +let $mms_tables=1; +create table t1 (a varchar(100), key(a)) engine=maria; +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_crash_statement= set global maria_checkpoint_interval=1; + +let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; +insert into t1 values(3); +-- source include/maria_make_snapshot_for_comparison.inc +lock tables t1 write; +insert into t1 values (1); +repair table t1; +insert into t1 values(2); +select * from t1; + +# checksum comparison failure is expected, SELECT output matters +-- source include/maria_verify_recovery.inc +# 2 should be missing (rolled back) but 1 should be committed +select * from t1; +drop table t1; + +--echo * TEST of recovery when crash before bulk-insert-with-repair is committed +create table t1 (a varchar(100), key(a)) engine=maria; +create table t2 (a varchar(100)) engine=myisam; +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_crash_statement= set global maria_checkpoint_interval=1; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; +set rand_seed1=12, rand_seed2=254; # repeatable +insert into t2 values (rand()); +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t2 select (rand()) from t2; +insert into t1 values(30); +-- source include/maria_make_snapshot_for_comparison.inc +lock tables t1 write, t2 read; +delete from t1 limit 1; +# 127 rows in t2, >100, so this will use repair-at-end +insert into t1 select * from t2; +-- source include/maria_verify_recovery.inc +show keys from t1; # should be enabled +drop table t1; + +--echo * TEST of recovery when OPTIMIZE has replaced the index file and crash +create table t_corrupted1 (a varchar(100), key(a)) engine=maria; +# we use a special name because this test portion will generate +# corruption warnings, which we tell mtr_report.pl to ignore by +# putting the message in mtr_report.pl, but we don't want to it ignore +# corruption messages of other tests, hence the special name +# 't_corrupted' and not just 't'. +let $mms_tname=t_corrupted; +let $mvr_restore_old_snapshot=0; +let $mms_compare_physically=0; +let $mvr_crash_statement= optimize table t_corrupted1; +let $mvr_debug_option="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash_sort_index"; +insert into t_corrupted1 select (rand()) from t2; +-- source include/maria_make_snapshot_for_comparison.inc +# Recovery will not fix the table, but we expect to see it marked +# "crashed on repair". +# Because crash is mild, the table is actually not corrupted, so the +# "check table extended" done below fixes the table. +-- source include/maria_verify_recovery.inc +drop table t_corrupted1, t2; + +# clean up everything +let $mms_purpose=comparison; +eval drop database mysqltest_for_$mms_purpose; +drop database mysqltest;