mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
WL#3072 Maria recovery:
fix for bug: if a crash happened right after writing a REDO like this: REDO - UNDO - REDO*, then recovery would ignore the last REDO* (ok), rollback: REDO - UNDO - REDO* - REDO - CLR, and a next recovery would thus execute REDO* instead of skipping it again. Recovery now logs LOGREC_INCOMPLETE_GROUP when it meets REDO* for the first time, to draw a boundary and ensure it is always skipped. Tested by hand. Note: ma_test_all fails "maria_chk: error: Key 1 - Found too many records" not due to this patch (failed before). BitKeeper/triggers/post-commit: no truncation of the commit mail, or how to review patches? mysql-test/include/maria_verify_recovery.inc: let caller choose the statement used to crash (sometimes we want the crash to happen at special places) mysql-test/t/maria-recovery.test: user of maria_verify_recovery.inc now specifies statement which the script should use for crashing. storage/maria/ma_bitmap.c: it's easier to search for all places using functions from the bitmap module (like in ma_blockrec.c) if those exported functions all start with "_ma_bitmap": renaming some of them. Assertion that when we read a bitmap page, overwriting bitmap->map, we are not losing information (i.e. bitmap->changed is false). storage/maria/ma_blockrec.c: update to new names. Adding code (disabled, protected by a #ifdef) that I use to test certain crash scenarios (more to come). storage/maria/ma_blockrec.h: update to new names storage/maria/ma_checkpoint.c: update to new names storage/maria/ma_extra.c: update to new names storage/maria/ma_loghandler.c: new LOGREC_INCOMPLETE_GROUP storage/maria/ma_loghandler.h: new LOGREC_INCOMPLETE_GROUP storage/maria/ma_recovery.c: When at the end of the REDO phase we have identified some transactions with incomplete REDO groups (REDOs without an UNDO or CLR_END), for each of them we log LOGREC_INCOMPLETE_GROUP. This way, the upcoming UNDO phase can write more records for such transaction, a future recovery won't pair the incomplete group with the CLR_END (as there is LOGREC_INCOMPLETE_GROUP to draw a boundary).
This commit is contained in:
@ -4,11 +4,11 @@
|
||||
# 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
|
||||
# 3) set $mvr_crash_statement to the statement which will trigger a crash
|
||||
# 4) 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
|
||||
# 5) 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;
|
||||
@ -34,7 +34,7 @@ system echo wait-maria_verify_recovery.inc >> $MYSQLTEST_VARDIR/tmp/master0.expe
|
||||
eval SET SESSION debug=$mvr_debug_option;
|
||||
--echo * crashing mysqld intentionally
|
||||
--error 2013
|
||||
set global maria_checkpoint_interval=1; # this will crash (DBUG magic)
|
||||
eval $mvr_crash_statement; # this will crash (DBUG magic)
|
||||
|
||||
if ($mvr_restore_old_snapshot)
|
||||
{
|
||||
|
Reference in New Issue
Block a user