Browse Source
Merge bk-internal.mysql.com:/home/bk/mysql-maria
Merge bk-internal.mysql.com:/home/bk/mysql-maria
into mysql.com:/home/my/mysql-maria storage/maria/ha_maria.cc: Auto merged storage/maria/ma_bitmap.c: Auto merged storage/maria/ma_checkpoint.c: Auto merged storage/maria/ma_close.c: Auto merged storage/maria/ma_loghandler.c: Auto merged storage/maria/ma_loghandler.h: Auto merged storage/maria/ma_open.c: Auto merged storage/maria/ma_pagecache.h: Auto merged storage/maria/ma_write.c: Auto merged storage/maria/maria_def.h: Auto merged storage/maria/unittest/ma_pagecache_single.c: Auto merged storage/maria/ma_blockrec.c: Manual merge storage/maria/ma_page.c: Manual merge storage/maria/ma_pagecache.c: Manual merge storage/maria/ma_preload.c: Manual merge storage/maria/ma_recovery.c: Manual merge Add _ma_unpin_all_pages() to all new UNDO redo_exec_hook'spull/374/head
31 changed files with 1087 additions and 160 deletions
-
33mysql-test/include/maria_empty_logs.inc
-
48mysql-test/include/maria_make_snapshot.inc
-
30mysql-test/include/maria_make_snapshot_for_comparison.inc
-
35mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc
-
97mysql-test/include/maria_verify_recovery.inc
-
6mysql-test/include/wait_until_connected_again.inc
-
34mysql-test/lib/mtr_process.pl
-
167mysql-test/r/maria-recovery.result
-
2mysql-test/t/maria-recovery-master.opt
-
146mysql-test/t/maria-recovery.test
-
38storage/maria/ha_maria.cc
-
29storage/maria/ma_bitmap.c
-
76storage/maria/ma_blockrec.c
-
107storage/maria/ma_checkpoint.c
-
5storage/maria/ma_close.c
-
15storage/maria/ma_loghandler.c
-
1storage/maria/ma_loghandler.h
-
2storage/maria/ma_open.c
-
5storage/maria/ma_page.c
-
94storage/maria/ma_pagecache.c
-
9storage/maria/ma_pagecache.h
-
3storage/maria/ma_preload.c
-
197storage/maria/ma_recovery.c
-
2storage/maria/ma_recovery.h
-
7storage/maria/ma_write.c
-
4storage/maria/maria_def.h
-
16storage/maria/maria_read_log.c
-
4storage/maria/unittest/ma_pagecache_consist.c
-
22storage/maria/unittest/ma_pagecache_single.c
-
11storage/maria/unittest/ma_test_loghandler-t.c
-
2storage/maria/unittest/ma_test_loghandler_pagecache-t.c
@ -0,0 +1,33 @@ |
|||
# Maria help script. |
|||
# Cleans up all logs to give recovery a fresh start. |
|||
|
|||
# API: none, just uses vardir, port and socket. |
|||
|
|||
connection admin; |
|||
|
|||
-- echo * shut down mysqld, removed logs, restarted it |
|||
append_file $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
wait-maria_empty_logs.inc |
|||
EOF |
|||
|
|||
--exec $MYSQLADMIN --no-defaults -S $MASTER_MYSOCK -P $MASTER_MYPORT -u root --password= shutdown 2>&1; |
|||
|
|||
remove_file $MYSQLTEST_VARDIR/master-data/maria_log_control; |
|||
remove_file $MYSQLTEST_VARDIR/master-data/maria_log.00000001; |
|||
-- error 0,1 # maybe there is just one log |
|||
remove_file $MYSQLTEST_VARDIR/master-data/maria_log.00000002; |
|||
# Hope there were not more than these logs. |
|||
|
|||
-- error 0,1 |
|||
remove_file $MYSQLTEST_VARDIR/master-data/maria_recovery.trace; |
|||
|
|||
append_file $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
restart-maria_empty_logs.inc |
|||
EOF |
|||
|
|||
--source include/wait_until_connected_again.inc |
|||
|
|||
connection default; |
|||
# the effect of "use" is lost after a restart so we are back into db "test", |
|||
# because connection 'default' was created with db "test". |
|||
use mysqltest; |
|||
@ -0,0 +1,48 @@ |
|||
# Maria helper script |
|||
# Copies table' data and index file to other directory, or back, or compares. |
|||
# The other directory looks like a database directory, so that we can |
|||
# read copies from inside mysqld, that's also why we copy the frm. |
|||
|
|||
# "mms" is a namespace for Maria_Make_Snapshot |
|||
|
|||
# API: |
|||
# 1) set one of |
|||
# $mms_copy : to copy table from database to spare directory |
|||
# $mms_reverse : to copy it back |
|||
# $mms_compare_physically : to compare both byte-for-byte |
|||
# 2) set $mms_table_to_use to a number N: table will be mysqltest.tN |
|||
# 3) set $mms_purpose to say what this copy is for (influences the naming |
|||
# of the spare directory). |
|||
|
|||
if ($mms_copy) |
|||
{ |
|||
--echo * copied t$mms_table_to_use for $mms_purpose |
|||
copy_file $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAD $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAD; |
|||
copy_file $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAI $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAI; |
|||
copy_file $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.frm $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.frm; |
|||
} |
|||
|
|||
if ($mms_reverse_copy) |
|||
{ |
|||
# do not call this without flushing target table first! |
|||
--echo * copied t$mms_table_to_use back for $mms_purpose |
|||
-- error 0,1 |
|||
remove_file $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAD; |
|||
copy_file $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAD $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAD; |
|||
-- error 0,1 |
|||
remove_file $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAI; |
|||
copy_file $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAI $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAI; |
|||
} |
|||
|
|||
if ($mms_compare_physically) |
|||
{ |
|||
# After the UNDO phase this is normally impossible |
|||
# (UNDO execution has created new log records => pages have new LSNs). |
|||
# So, do this only when testing REDO phase. |
|||
# If UNDO phase, we nevertheless compare checksums |
|||
# (see maria_verify_recovery.inc). |
|||
--echo * compared t$mms_table_to_use to old version |
|||
diff_files $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAD $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAD; |
|||
# index file not yet recovered |
|||
# diff_files $MYSQLTEST_VARDIR/master-data/mysqltest/t$mms_table_to_use.MAI $MYSQLTEST_VARDIR/master-data/mysqltest_for_$mms_purpose/t$mms_table_to_use.MAI; |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
# Maria helper script |
|||
# Copies clean tables' data and index file to other directory |
|||
# Tables are t1...t[$mms_tables] |
|||
# They are later used as a reference to see if recovery works. |
|||
|
|||
# API: |
|||
# set $mms_tables to N, the script will cover tables mysqltest.t1,...tN |
|||
|
|||
connection admin; |
|||
|
|||
let $mms_table_to_use=$mms_tables; |
|||
let $mms_purpose=comparison; |
|||
let $mms_copy=1; |
|||
|
|||
--disable_query_log |
|||
--disable_warnings |
|||
eval drop database if exists mysqltest_for_$mms_purpose; |
|||
--enable_warnings |
|||
eval create database mysqltest_for_$mms_purpose; |
|||
--enable_query_log |
|||
|
|||
while ($mms_table_to_use) |
|||
{ |
|||
# to serve as a reference, table must be in a clean state |
|||
eval flush table t$mms_table_to_use; |
|||
-- source include/maria_make_snapshot.inc |
|||
dec $mms_table_to_use; |
|||
} |
|||
let $mms_copy=0; |
|||
connection default; |
|||
@ -0,0 +1,35 @@ |
|||
# Maria helper script |
|||
# Copies tables' data and index file to other directory, and control file. |
|||
# Tables are t1...t[$mms_tables]. |
|||
# Later, mysqld is shutdown, and that snapshot is put back into the |
|||
# datadir, control file too ("flashing recovery's brain"), and recovery is let |
|||
# to run on it (see maria_verify_recovery.inc). |
|||
|
|||
# API: |
|||
# set $mms_tables to N, the script will cover tables mysqltest.t1,...tN |
|||
|
|||
connection admin; |
|||
|
|||
let $mms_table_to_use=$mms_tables; |
|||
let $mms_purpose=feeding_recovery; |
|||
let $mms_copy=1; |
|||
|
|||
--disable_query_log |
|||
--disable_warnings |
|||
eval drop database if exists mysqltest_for_$mms_purpose; |
|||
--enable_warnings |
|||
eval create database mysqltest_for_$mms_purpose; |
|||
--enable_query_log |
|||
|
|||
while ($mms_table_to_use) |
|||
{ |
|||
-- source include/maria_make_snapshot.inc |
|||
dec $mms_table_to_use; |
|||
} |
|||
let $mms_copy=0; |
|||
|
|||
-- error 0,1 |
|||
remove_file $MYSQLTEST_VARDIR/tmp/mms_for_$mms_purpose.maria_log_control; |
|||
copy_file $MYSQLTEST_VARDIR/master-data/maria_log_control $MYSQLTEST_VARDIR/tmp/mms_for_$mms_purpose.maria_log_control; |
|||
|
|||
connection default; |
|||
@ -0,0 +1,97 @@ |
|||
# Maria helper script. |
|||
# Runs recovery, compare with expected table data. |
|||
|
|||
# API: |
|||
# 1) set $mms_tables to N, the script will cover tables mysqltest.t1,...tN |
|||
# 2) set $mvr_debug_option to the crash way |
|||
# 3) set $mvr_restore_old_snapshot to 1 if you want recovery to run on |
|||
# an old copy of tables and of the control file, 0 for normal recovery. |
|||
# 4) set $mms_compare_physically to 1 if you want a physical byte-for-byte |
|||
# comparison with expected table. Checksum comparison is always done. |
|||
|
|||
# "mvr" is a namespace for Maria_Verify_Recovery |
|||
|
|||
connection admin; |
|||
|
|||
# we may do a copy-back of tables before comparison, so save comparison |
|||
# request made by caller: |
|||
let $mms_compare_physically_save=$mms_compare_physically; |
|||
let $mms_compare_physically=0; |
|||
|
|||
# warn mtr that mysqld is going to die and should not be restarted immediately |
|||
#append_file $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
#wait-maria_verify_recovery.inc |
|||
#EOF |
|||
# todo: remove this "system" and uncomment above when BUG#32296 is fixed |
|||
system echo wait-maria_verify_recovery.inc >> $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
|
|||
# flush page cache and log, only log, or nothing, and kill mysqld with |
|||
# abort(). |
|||
# When we restore an old snapshot, we could just kill mysqld nicely, |
|||
# but that would implicitely commit all work, which the tester may |
|||
# not want (tester may want to observe rollback happening). |
|||
|
|||
eval SET SESSION debug=$mvr_debug_option; |
|||
--echo * crashing mysqld intentionally |
|||
--error 2013 |
|||
set global maria_checkpoint_interval=1; # this will crash (DBUG magic) |
|||
|
|||
if ($mvr_restore_old_snapshot) |
|||
{ |
|||
|
|||
# copy snapshot made by maria_make_snapshot_for_feeding_recovery back |
|||
# into datadir. |
|||
|
|||
let $mms_table_to_use=$mms_tables; |
|||
let $mms_purpose=feeding_recovery; |
|||
let $mms_reverse_copy=1; |
|||
while ($mms_table_to_use) |
|||
{ |
|||
-- source include/maria_make_snapshot.inc |
|||
dec $mms_table_to_use; |
|||
} |
|||
let $mms_reverse_copy=0; |
|||
|
|||
# also copy back control file, to force recovery to start from an early |
|||
# point, ignoring further checkpoints. |
|||
-- error 0,1 |
|||
remove_file $MYSQLTEST_VARDIR/master-data/maria_log_control; |
|||
copy_file $MYSQLTEST_VARDIR/tmp/mms_for_$mms_purpose.maria_log_control $MYSQLTEST_VARDIR/master-data/maria_log_control; |
|||
} |
|||
|
|||
--echo * recovery happens |
|||
# let mtr restart mysqld (and thus execute the maria log) |
|||
#append_file $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
#restart-maria_verify_recovery.inc |
|||
#EOF |
|||
system echo restart-maria_verify_recovery.inc >> $MYSQLTEST_VARDIR/tmp/master0.expect; |
|||
|
|||
--source include/wait_until_connected_again.inc |
|||
|
|||
# Compare that tables of $mms_tables are identical to old. |
|||
# We always compare with CHECKSUM TABLE, and if requested (which makes sense |
|||
# only for testing the REDO phase, as UNDO phase generates new records so new |
|||
# LSNs on pages.) with a physical byte-for-byte comparison. |
|||
let $mms_table_to_use=$mms_tables; |
|||
let $mms_purpose=comparison; |
|||
let $mms_compare_physically=$mms_compare_physically_save; |
|||
while ($mms_table_to_use) |
|||
{ |
|||
# Todo: remove this REPAIR when we have index recovery working. |
|||
# It is a quick repair, so that it will fail if data file is corrupted. |
|||
--echo * rebuilding index (until we have recovery of index) |
|||
eval repair table t$mms_table_to_use quick; |
|||
--echo * testing that checksum after recovery is as expected |
|||
let $new_checksum=`CHECKSUM TABLE t$mms_table_to_use`; |
|||
let $old_checksum=`CHECKSUM TABLE mysqltest_for_$mms_purpose.t$mms_table_to_use`; |
|||
# the $ text variables above are of the form "db.tablename\tchecksum", |
|||
# as db differs, we use substring(). |
|||
eval select if(substring("$new_checksum",instr("$new_checksum",".t1")) = substring("$old_checksum",instr("$old_checksum",".t1")),"ok","failure"); |
|||
# this script may compare physically or do nothing |
|||
-- source include/maria_make_snapshot.inc |
|||
dec $mms_table_to_use; |
|||
} |
|||
|
|||
connection default; |
|||
# the effect of "use" is lost after a restart so we are back into db "test" |
|||
use mysqltest; |
|||
@ -0,0 +1,167 @@ |
|||
drop database if exists mysqltest; |
|||
create database mysqltest; |
|||
use mysqltest; |
|||
* shut down mysqld, removed logs, restarted it |
|||
use mysqltest; |
|||
create table t1 (a varchar(1000)) engine=maria; |
|||
* TEST of REDO: see if recovery can reconstruct if we give it an old table |
|||
* copied t1 for feeding_recovery |
|||
insert into t1 values ("00000000"); |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
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 |
|||
* copied t1 back for feeding_recovery |
|||
* recovery happens |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 488070860",instr("mysqltest.t1 488070860",".t1")) = substring("mysqltest_for_comparison.t1 488070860",instr("mysqltest_for_comparison.t1 488070860",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 488070860",instr("mysqltest.t1 488070860",".t1")) = substring("mysqltest_for_comparison.t1 488070860",instr("mysqltest_for_comparison.t1 488070860",".t1")),"ok","failure") |
|||
ok |
|||
* compared t1 to old version |
|||
use mysqltest; |
|||
select * from t1; |
|||
a |
|||
00000000 |
|||
* TEST of REDO+UNDO: normal recovery test (no moving tables under its feet) |
|||
insert into t1 values ("00000000"); |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
lock tables t1 write; |
|||
insert into t1 values ("aaaaaaaaa"); |
|||
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 |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 976141720",instr("mysqltest.t1 976141720",".t1")) = substring("mysqltest_for_comparison.t1 976141720",instr("mysqltest_for_comparison.t1 976141720",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 976141720",instr("mysqltest.t1 976141720",".t1")) = substring("mysqltest_for_comparison.t1 976141720",instr("mysqltest_for_comparison.t1 976141720",".t1")),"ok","failure") |
|||
ok |
|||
use mysqltest; |
|||
select * from t1; |
|||
a |
|||
00000000 |
|||
00000000 |
|||
insert into t1 values ("00000000"); |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
lock tables t1 write; |
|||
insert into t1 values ("aaaaaaaaa"); |
|||
SET SESSION debug="+d,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 |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 1464212580",instr("mysqltest.t1 1464212580",".t1")) = substring("mysqltest_for_comparison.t1 1464212580",instr("mysqltest_for_comparison.t1 1464212580",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 1464212580",instr("mysqltest.t1 1464212580",".t1")) = substring("mysqltest_for_comparison.t1 1464212580",instr("mysqltest_for_comparison.t1 1464212580",".t1")),"ok","failure") |
|||
ok |
|||
use mysqltest; |
|||
select * from t1; |
|||
a |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
insert into t1 values ("00000000"); |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
lock tables t1 write; |
|||
insert into t1 values ("aaaaaaaaa"); |
|||
SET SESSION debug="+d,maria_flush_states,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 |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 1952283440",instr("mysqltest.t1 1952283440",".t1")) = substring("mysqltest_for_comparison.t1 1952283440",instr("mysqltest_for_comparison.t1 1952283440",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 1952283440",instr("mysqltest.t1 1952283440",".t1")) = substring("mysqltest_for_comparison.t1 1952283440",instr("mysqltest_for_comparison.t1 1952283440",".t1")),"ok","failure") |
|||
ok |
|||
use mysqltest; |
|||
select * from t1; |
|||
a |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
insert into t1 values ("00000000"); |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
lock tables t1 write; |
|||
insert into t1 values ("aaaaaaaaa"); |
|||
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 |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 2440354300",instr("mysqltest.t1 2440354300",".t1")) = substring("mysqltest_for_comparison.t1 2440354300",instr("mysqltest_for_comparison.t1 2440354300",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 2440354300",instr("mysqltest.t1 2440354300",".t1")) = substring("mysqltest_for_comparison.t1 2440354300",instr("mysqltest_for_comparison.t1 2440354300",".t1")),"ok","failure") |
|||
ok |
|||
use mysqltest; |
|||
select * from t1; |
|||
a |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
00000000 |
|||
drop table t1; |
|||
* shut down mysqld, removed logs, restarted it |
|||
use mysqltest; |
|||
CREATE TABLE t1 ( |
|||
i int, |
|||
b blob default NULL, |
|||
c varchar(6000) default NULL |
|||
) ENGINE=MARIA CHECKSUM=1; |
|||
* copied t1 for feeding_recovery |
|||
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; |
|||
LENGTH(b) |
|||
5001 |
|||
flush table t1; |
|||
* copied t1 for comparison |
|||
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 |
|||
* copied t1 back for feeding_recovery |
|||
* recovery happens |
|||
* rebuilding index (until we have recovery of index) |
|||
repair table t1 quick; |
|||
Table Op Msg_type Msg_text |
|||
mysqltest.t1 repair status OK |
|||
* testing that checksum after recovery is as expected |
|||
select if(substring("mysqltest.t1 3472399915",instr("mysqltest.t1 3472399915",".t1")) = substring("mysqltest_for_comparison.t1 3472399915",instr("mysqltest_for_comparison.t1 3472399915",".t1")),"ok","failure"); |
|||
if(substring("mysqltest.t1 3472399915",instr("mysqltest.t1 3472399915",".t1")) = substring("mysqltest_for_comparison.t1 3472399915",instr("mysqltest_for_comparison.t1 3472399915",".t1")),"ok","failure") |
|||
ok |
|||
use mysqltest; |
|||
SELECT LENGTH(b) FROM t1 WHERE i=3; |
|||
LENGTH(b) |
|||
5001 |
|||
drop table t1; |
|||
drop database mysqltest_for_feeding_recovery; |
|||
drop database mysqltest_for_comparison; |
|||
drop database mysqltest; |
|||
@ -0,0 +1,2 @@ |
|||
--skip-stack-trace --skip-core-file |
|||
|
|||
@ -0,0 +1,146 @@ |
|||
--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 |
|||
|
|||
--disable_warnings |
|||
drop database if exists mysqltest; |
|||
--enable_warnings |
|||
create database mysqltest; |
|||
|
|||
# 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 |
|||
|
|||
# A sample test |
|||
-- source include/maria_empty_logs.inc |
|||
let $mms_tables=1; |
|||
create table t1 (a varchar(1000)) engine=maria; |
|||
|
|||
--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"; |
|||
# 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; |
|||
|
|||
# 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. |
|||
# |
|||
|
|||
-- 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=MARIA 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"; |
|||
-- source include/maria_verify_recovery.inc |
|||
SELECT LENGTH(b) FROM t1 WHERE i=3; |
|||
drop table t1; |
|||
|
|||
# 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; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue