2011-04-25 17:22:25 +02:00
|
|
|
set global aria_log_file_size=4294959104;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
drop database if exists mysqltest;
|
|
|
|
create database mysqltest;
|
|
|
|
use mysqltest;
|
|
|
|
* shut down mysqld, removed logs, restarted it
|
2010-09-12 18:40:01 +02:00
|
|
|
create table t1 (a varchar(1000)) engine=aria;
|
2007-11-13 18:49:00 +01:00
|
|
|
* TEST of REDO: see if recovery can reconstruct if we give it an old table
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* copied t1 for feeding_recovery
|
|
|
|
insert into t1 values ("00000000");
|
|
|
|
flush table t1;
|
|
|
|
* copied t1 for comparison
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* copied t1 back for feeding_recovery
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ok
|
2007-11-13 18:49:00 +01:00
|
|
|
* compared t1 to old version
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
use mysqltest;
|
|
|
|
select * from t1;
|
|
|
|
a
|
|
|
|
00000000
|
2007-11-13 18:49:00 +01:00
|
|
|
* TEST of REDO+UNDO: normal recovery test (no moving tables under its feet)
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
insert into t1 values ("00000000");
|
|
|
|
flush table t1;
|
|
|
|
* copied t1 for comparison
|
|
|
|
lock tables t1 write;
|
|
|
|
insert into t1 values ("aaaaaaaaa");
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
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");
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_page_cache,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
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");
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_states,maria_flush_whole_log,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
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");
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ok
|
|
|
|
use mysqltest;
|
|
|
|
select * from t1;
|
|
|
|
a
|
|
|
|
00000000
|
|
|
|
00000000
|
|
|
|
00000000
|
|
|
|
00000000
|
|
|
|
00000000
|
|
|
|
drop table t1;
|
WL#3072 - Maria recovery.
* fix for bitmap vs checkpoint bug which could lead to corrupted
tables in case of crashes at certain moments: a bitmap could be flushed
to disk even though it was inconsistent with the log (it could be
flushed before REDO-UNDO are written to the log). One bug remains, need
code from others. Tests added. Fix is to pin unflushable bitmap pages,
and let checkpoint wait for them to be flushable.
* fix for long_trid!=0 assertion failure at Recovery.
* less useless wakeups in the background flush|checkpoint thread.
* store global_trid_generator in checkpoint record.
mysql-test/r/maria-recovery.result:
result update
mysql-test/t/maria-recovery.test:
make it easier to locate subtests
storage/maria/ma_bitmap.c:
When we send a bitmap to the pagecache, if this bitmap is not in a
flushable state we keep it pinned and add it to a list, it will be
unpinned when the bitmap is flushable again.
A new function _ma_bitmap_flush_all() used by checkpoint.
A new function _ma_bitmap_flushable() used by block format to signal
when it starts modifying a bitmap and when it is done with it.
storage/maria/ma_blockrec.c:
When starting a row operation (insert/update/delete), mark that
the bitmap is not flushable (because for example INSERT is going
to over-allocate in the bitmap to prevent other threads from using
our data pages). If a checkpoint comes at this moment it will wait
for the bitmap to be flushable before flushing it.
When the operation ends, bitmap becomes flushable again; that
transition is done under the bitmap's mutex (needed for correct
synchro with a concurrent checkpoint); but for INSERT/UPDATE this
happens inside _ma_bitmap_release_unused() at a place where it already
has the mutex, so the only penalty (mutex adding) is in DELETE and UNDO
of INSERT. In case of errors after setting the bitmap unflushable,
we must always set it back to flushable or checkpoint would block.
Debug possibilities to force a sleep while the bitmap is over-allocated.
In case of error in get_head_or_tail() in allocate_and_write_block_record(),
we still need to unpin all pages.
Bugfix: _ma_apply_redo_insert_row_blobs() produced wrong
data_file_length.
storage/maria/ma_blockrec.h:
new bitmap calls.
storage/maria/ma_checkpoint.c:
filter_flush_indirect not needed anymore (flushing bitmap
pages happens in _ma_bitmap_flush_all() now). So
st_filter_param::is_data_file|pages_covered_by_bitmap not needed.
Other filter_flush* don't need to flush bitmap anymore.
Add debug possibility to flush all bitmap pages outside of a checkpoint,
to simulate pagecache LRU eviction.
When the background flush/checkpoint thread notices it has nothing
to flush, it now sleeps directly until the next potential checkpoint
moment instead of waking up every second.
When in checkpoint we decide to not store a table in the checkpoint record
(because it has logged no writes for example), we can also skip flushing
this table.
storage/maria/ma_commit.c:
comment is out-of-date
storage/maria/ma_key_recover.c:
comment fix
storage/maria/ma_loghandler.c:
comment is out-of-date
storage/maria/ma_open.c:
comment is out-of-date
storage/maria/ma_pagecache.c:
comment for bug to fix. And we don't take checkpoints at end of REDO
phase yet so can trust block->type.
storage/maria/ma_recovery.c:
Comments. Now-unneeded code for incomplete REDO-UNDO groups removed.
When we forget about an old transaction we must really forget
about it with bzero() (fixes the "long_trid!=0 assertion" recovery
bug). When we delete a row with maria_delete() we turn on
STATE_NOT_OPTIMIZED_ROWS so we do the same when we see a CLR_END
for an UNDO_ROW_INSERT or when we execute an UNDO_ROW_INSERT (in both
cases a row was deleted). Pick up max_long_trid from the checkpoint record.
storage/maria/maria_chk.c:
comment
storage/maria/maria_def.h:
MARIA_FILE_BITMAP gets new members: 'flushable', 'bitmap_cond' and
'pinned_pages'.
storage/maria/trnman.c:
I used to think that recovery only needs to know the maximum TrID
of the lists of active and committed transactions. But no, sometimes
both lists can even be empty and their TrID should not be reused.
So Checkpoint now saves global_trid_generator in the checkpoint record.
storage/maria/trnman_public.h:
macros to read/store a TrID
mysql-test/r/maria-recovery-bitmap.result:
result is ok. Without the code fix, we would get a corruption message
about the bitmap page in CHECK TABLE EXTENDED.
mysql-test/t/maria-recovery-bitmap-master.opt:
usual when we crash mysqld in tests
mysql-test/t/maria-recovery-bitmap.test:
test of recovery problems specific of the bitmap pages.
2007-12-14 16:14:12 +01:00
|
|
|
* TEST of two REDOs for same page in one REDO group
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* shut down mysqld, removed logs, restarted it
|
|
|
|
CREATE TABLE t1 (
|
|
|
|
i int,
|
|
|
|
b blob default NULL,
|
|
|
|
c varchar(6000) default NULL
|
2010-09-12 18:40:01 +02:00
|
|
|
) ENGINE=ARIA CHECKSUM=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* 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
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* copied t1 back for feeding_recovery
|
|
|
|
* recovery happens
|
2007-11-20 16:42:16 +01:00
|
|
|
check table t1 extended;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
Table Op Msg_type Msg_text
|
2007-11-20 16:42:16 +01:00
|
|
|
mysqltest.t1 check status OK
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
* testing that checksum after recovery is as expected
|
2007-11-20 16:42:16 +01:00
|
|
|
Checksum-check
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
ok
|
|
|
|
use mysqltest;
|
|
|
|
SELECT LENGTH(b) FROM t1 WHERE i=3;
|
|
|
|
LENGTH(b)
|
|
|
|
5001
|
|
|
|
drop table t1;
|
WL#3072 - Maria recovery.
* fix for bitmap vs checkpoint bug which could lead to corrupted
tables in case of crashes at certain moments: a bitmap could be flushed
to disk even though it was inconsistent with the log (it could be
flushed before REDO-UNDO are written to the log). One bug remains, need
code from others. Tests added. Fix is to pin unflushable bitmap pages,
and let checkpoint wait for them to be flushable.
* fix for long_trid!=0 assertion failure at Recovery.
* less useless wakeups in the background flush|checkpoint thread.
* store global_trid_generator in checkpoint record.
mysql-test/r/maria-recovery.result:
result update
mysql-test/t/maria-recovery.test:
make it easier to locate subtests
storage/maria/ma_bitmap.c:
When we send a bitmap to the pagecache, if this bitmap is not in a
flushable state we keep it pinned and add it to a list, it will be
unpinned when the bitmap is flushable again.
A new function _ma_bitmap_flush_all() used by checkpoint.
A new function _ma_bitmap_flushable() used by block format to signal
when it starts modifying a bitmap and when it is done with it.
storage/maria/ma_blockrec.c:
When starting a row operation (insert/update/delete), mark that
the bitmap is not flushable (because for example INSERT is going
to over-allocate in the bitmap to prevent other threads from using
our data pages). If a checkpoint comes at this moment it will wait
for the bitmap to be flushable before flushing it.
When the operation ends, bitmap becomes flushable again; that
transition is done under the bitmap's mutex (needed for correct
synchro with a concurrent checkpoint); but for INSERT/UPDATE this
happens inside _ma_bitmap_release_unused() at a place where it already
has the mutex, so the only penalty (mutex adding) is in DELETE and UNDO
of INSERT. In case of errors after setting the bitmap unflushable,
we must always set it back to flushable or checkpoint would block.
Debug possibilities to force a sleep while the bitmap is over-allocated.
In case of error in get_head_or_tail() in allocate_and_write_block_record(),
we still need to unpin all pages.
Bugfix: _ma_apply_redo_insert_row_blobs() produced wrong
data_file_length.
storage/maria/ma_blockrec.h:
new bitmap calls.
storage/maria/ma_checkpoint.c:
filter_flush_indirect not needed anymore (flushing bitmap
pages happens in _ma_bitmap_flush_all() now). So
st_filter_param::is_data_file|pages_covered_by_bitmap not needed.
Other filter_flush* don't need to flush bitmap anymore.
Add debug possibility to flush all bitmap pages outside of a checkpoint,
to simulate pagecache LRU eviction.
When the background flush/checkpoint thread notices it has nothing
to flush, it now sleeps directly until the next potential checkpoint
moment instead of waking up every second.
When in checkpoint we decide to not store a table in the checkpoint record
(because it has logged no writes for example), we can also skip flushing
this table.
storage/maria/ma_commit.c:
comment is out-of-date
storage/maria/ma_key_recover.c:
comment fix
storage/maria/ma_loghandler.c:
comment is out-of-date
storage/maria/ma_open.c:
comment is out-of-date
storage/maria/ma_pagecache.c:
comment for bug to fix. And we don't take checkpoints at end of REDO
phase yet so can trust block->type.
storage/maria/ma_recovery.c:
Comments. Now-unneeded code for incomplete REDO-UNDO groups removed.
When we forget about an old transaction we must really forget
about it with bzero() (fixes the "long_trid!=0 assertion" recovery
bug). When we delete a row with maria_delete() we turn on
STATE_NOT_OPTIMIZED_ROWS so we do the same when we see a CLR_END
for an UNDO_ROW_INSERT or when we execute an UNDO_ROW_INSERT (in both
cases a row was deleted). Pick up max_long_trid from the checkpoint record.
storage/maria/maria_chk.c:
comment
storage/maria/maria_def.h:
MARIA_FILE_BITMAP gets new members: 'flushable', 'bitmap_cond' and
'pinned_pages'.
storage/maria/trnman.c:
I used to think that recovery only needs to know the maximum TrID
of the lists of active and committed transactions. But no, sometimes
both lists can even be empty and their TrID should not be reused.
So Checkpoint now saves global_trid_generator in the checkpoint record.
storage/maria/trnman_public.h:
macros to read/store a TrID
mysql-test/r/maria-recovery-bitmap.result:
result is ok. Without the code fix, we would get a corruption message
about the bitmap page in CHECK TABLE EXTENDED.
mysql-test/t/maria-recovery-bitmap-master.opt:
usual when we crash mysqld in tests
mysql-test/t/maria-recovery-bitmap.test:
test of recovery problems specific of the bitmap pages.
2007-12-14 16:14:12 +01:00
|
|
|
* TEST of INSERT vs state.auto_increment
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
* shut down mysqld, removed logs, restarted it
|
|
|
|
CREATE TABLE t1 (
|
|
|
|
i int auto_increment primary key,
|
|
|
|
c varchar(6),
|
|
|
|
key(c)
|
2010-09-12 18:40:01 +02:00
|
|
|
) ENGINE=ARIA;
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
insert into t1 values(null,"b");
|
|
|
|
* copied t1 for feeding_recovery
|
|
|
|
insert into t1 values(null,"a"), (null,"c"), (null,"d");
|
|
|
|
delete from t1 where c="d";
|
|
|
|
flush table t1;
|
|
|
|
* copied t1 for comparison
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* copied t1 back for feeding_recovery
|
|
|
|
* 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 create table t1;
|
|
|
|
Table Create Table
|
|
|
|
t1 CREATE TABLE `t1` (
|
|
|
|
`i` int(11) NOT NULL AUTO_INCREMENT,
|
|
|
|
`c` varchar(6) DEFAULT NULL,
|
|
|
|
PRIMARY KEY (`i`),
|
|
|
|
KEY `c` (`c`)
|
2010-09-12 18:40:01 +02:00
|
|
|
) ENGINE=Aria AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
|
WL#3072 - Maria recovery.
* fix for bitmap vs checkpoint bug which could lead to corrupted
tables in case of crashes at certain moments: a bitmap could be flushed
to disk even though it was inconsistent with the log (it could be
flushed before REDO-UNDO are written to the log). One bug remains, need
code from others. Tests added. Fix is to pin unflushable bitmap pages,
and let checkpoint wait for them to be flushable.
* fix for long_trid!=0 assertion failure at Recovery.
* less useless wakeups in the background flush|checkpoint thread.
* store global_trid_generator in checkpoint record.
mysql-test/r/maria-recovery.result:
result update
mysql-test/t/maria-recovery.test:
make it easier to locate subtests
storage/maria/ma_bitmap.c:
When we send a bitmap to the pagecache, if this bitmap is not in a
flushable state we keep it pinned and add it to a list, it will be
unpinned when the bitmap is flushable again.
A new function _ma_bitmap_flush_all() used by checkpoint.
A new function _ma_bitmap_flushable() used by block format to signal
when it starts modifying a bitmap and when it is done with it.
storage/maria/ma_blockrec.c:
When starting a row operation (insert/update/delete), mark that
the bitmap is not flushable (because for example INSERT is going
to over-allocate in the bitmap to prevent other threads from using
our data pages). If a checkpoint comes at this moment it will wait
for the bitmap to be flushable before flushing it.
When the operation ends, bitmap becomes flushable again; that
transition is done under the bitmap's mutex (needed for correct
synchro with a concurrent checkpoint); but for INSERT/UPDATE this
happens inside _ma_bitmap_release_unused() at a place where it already
has the mutex, so the only penalty (mutex adding) is in DELETE and UNDO
of INSERT. In case of errors after setting the bitmap unflushable,
we must always set it back to flushable or checkpoint would block.
Debug possibilities to force a sleep while the bitmap is over-allocated.
In case of error in get_head_or_tail() in allocate_and_write_block_record(),
we still need to unpin all pages.
Bugfix: _ma_apply_redo_insert_row_blobs() produced wrong
data_file_length.
storage/maria/ma_blockrec.h:
new bitmap calls.
storage/maria/ma_checkpoint.c:
filter_flush_indirect not needed anymore (flushing bitmap
pages happens in _ma_bitmap_flush_all() now). So
st_filter_param::is_data_file|pages_covered_by_bitmap not needed.
Other filter_flush* don't need to flush bitmap anymore.
Add debug possibility to flush all bitmap pages outside of a checkpoint,
to simulate pagecache LRU eviction.
When the background flush/checkpoint thread notices it has nothing
to flush, it now sleeps directly until the next potential checkpoint
moment instead of waking up every second.
When in checkpoint we decide to not store a table in the checkpoint record
(because it has logged no writes for example), we can also skip flushing
this table.
storage/maria/ma_commit.c:
comment is out-of-date
storage/maria/ma_key_recover.c:
comment fix
storage/maria/ma_loghandler.c:
comment is out-of-date
storage/maria/ma_open.c:
comment is out-of-date
storage/maria/ma_pagecache.c:
comment for bug to fix. And we don't take checkpoints at end of REDO
phase yet so can trust block->type.
storage/maria/ma_recovery.c:
Comments. Now-unneeded code for incomplete REDO-UNDO groups removed.
When we forget about an old transaction we must really forget
about it with bzero() (fixes the "long_trid!=0 assertion" recovery
bug). When we delete a row with maria_delete() we turn on
STATE_NOT_OPTIMIZED_ROWS so we do the same when we see a CLR_END
for an UNDO_ROW_INSERT or when we execute an UNDO_ROW_INSERT (in both
cases a row was deleted). Pick up max_long_trid from the checkpoint record.
storage/maria/maria_chk.c:
comment
storage/maria/maria_def.h:
MARIA_FILE_BITMAP gets new members: 'flushable', 'bitmap_cond' and
'pinned_pages'.
storage/maria/trnman.c:
I used to think that recovery only needs to know the maximum TrID
of the lists of active and committed transactions. But no, sometimes
both lists can even be empty and their TrID should not be reused.
So Checkpoint now saves global_trid_generator in the checkpoint record.
storage/maria/trnman_public.h:
macros to read/store a TrID
mysql-test/r/maria-recovery-bitmap.result:
result is ok. Without the code fix, we would get a corruption message
about the bitmap page in CHECK TABLE EXTENDED.
mysql-test/t/maria-recovery-bitmap-master.opt:
usual when we crash mysqld in tests
mysql-test/t/maria-recovery-bitmap.test:
test of recovery problems specific of the bitmap pages.
2007-12-14 16:14:12 +01:00
|
|
|
* TEST of UPDATE vs state.auto_increment
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
* copied t1 for feeding_recovery
|
|
|
|
update t1 set i=15 where c="a";
|
|
|
|
flush table t1;
|
|
|
|
* copied t1 for comparison
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
WL#3072 - Maria Recovery: recovery of state.auto_increment.
When we log UNDO_KEY_INSERT for an auto_inc key, we update
state.auto_increment (not anymore at the end of maria_write() except
if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
in the REDO phase, it reads the auto_inc value from it and updates
state.auto_increment.
mysql-test/r/maria-recovery.result:
Without the code fix, there would be in CHECK TABLE:
"Auto-increment value: 0 is smaller than max used value: 3"
and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
mysql-test/t/maria-recovery.test:
Test of recovery of state.auto_increment: from an old table,
does the replaying of the log set state.auto_increment to
what it should be.
storage/maria/ma_check.c:
new way of calling ma_retrieve_auto_increment(): pass key
storage/maria/ma_key.c:
ma_retrieve_auto_increment() now operates directly with a pointer
to the key and not on the record.
storage/maria/ma_key_recover.c:
dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
under log's mutex.
storage/maria/ma_key_recover.h:
Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
which contains the auto_increment value inserted.
storage/maria/ma_loghandler.c:
UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
storage/maria/ma_recovery.c:
When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
than this record, and the key is the auto_increment one, read
the key's value from the log record and update state.auto_increment.
storage/maria/ma_test_all.sh:
use $maria_path to be able to run from /dev/shm (faster)
storage/maria/ma_update.c:
bool is more of C++, using my_bool.
If table is transactional, state.auto_increment is already updated
in write_hook_for_undo_key_insert().
storage/maria/ma_write.c:
If table is transactional, state.auto_increment is not updated at
the end of maria_write() but rather in write_hook_for_undo_key_insert()
(under log's mutex, so that a concurrent checkpoint does not read
state.auto_increment while it is changing - corrupted).
_ma_ck_write_btree_with_log() extracts the auto_increment value
from the key, puts it into msg.auto_increment, and this is passed
to write_hook_for_undo_key_insert().
storage/maria/maria_def.h:
change of prototype of ma_retrieve_auto_increment()
storage/maria/maria_read_log.c:
use default log file size. Use separate page caches for table
and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
2007-12-12 22:33:36 +01:00
|
|
|
ERROR HY000: Lost connection to MySQL server during query
|
|
|
|
* copied t1 back for feeding_recovery
|
|
|
|
* 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 create table t1;
|
|
|
|
Table Create Table
|
|
|
|
t1 CREATE TABLE `t1` (
|
|
|
|
`i` int(11) NOT NULL AUTO_INCREMENT,
|
|
|
|
`c` varchar(6) DEFAULT NULL,
|
|
|
|
PRIMARY KEY (`i`),
|
|
|
|
KEY `c` (`c`)
|
2010-09-12 18:40:01 +02:00
|
|
|
) ENGINE=Aria AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
|
Minor changes. New description in SHOW ENGINES for Maria.
Test for BUG#34106 "auto_increment is reset to 1 when table is recovered from crash"
(fixed by Monty yesterday)
mysql-test/r/maria-recovery.result:
result, which is correct (before pulling Monty's fix for BUG#34106,
we got a warning about auto_increment in CHECK TABLE (done in
maria-verify-recovery.inc), no AUTO_INCREMENT clause in
SHOW CREATE TABLE, and a failure of the last INSERT.
mysql-test/r/maria.result:
result
mysql-test/t/maria-recovery.test:
Test for BUG#34106
mysql-test/t/maria.test:
look at what is reported in SHOW ENGINES
mysys/my_pread.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_read.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_write.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
storage/maria/ha_maria.cc:
Description representing the current reality. This can be changed later
storage/maria/ma_page.c:
When reading the new key_del from a page on disk, if there is a bug
(like BUG#34062) this key_del could be wrong, we try to catch if it's
out of the key file.
storage/maria/ma_pagecache.c:
- no truncation of page's number in DBUG_PRINT (useful for BUG#34062)
- page_korr instead of uint5korr
storage/maria/ma_recovery.c:
page_korr instead of uint5korr
storage/maria/plug.in:
Description representing the current reality. This can be changed later.
2008-01-31 23:17:50 +01:00
|
|
|
* TEST of INSERT's rollback vs state.auto_increment
|
|
|
|
flush table t1;
|
|
|
|
* copied t1 for comparison
|
|
|
|
lock tables t1 write;
|
|
|
|
insert into t1 values(null, "e");
|
2011-12-15 22:07:58 +01:00
|
|
|
SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_crash";
|
Minor changes. New description in SHOW ENGINES for Maria.
Test for BUG#34106 "auto_increment is reset to 1 when table is recovered from crash"
(fixed by Monty yesterday)
mysql-test/r/maria-recovery.result:
result, which is correct (before pulling Monty's fix for BUG#34106,
we got a warning about auto_increment in CHECK TABLE (done in
maria-verify-recovery.inc), no AUTO_INCREMENT clause in
SHOW CREATE TABLE, and a failure of the last INSERT.
mysql-test/r/maria.result:
result
mysql-test/t/maria-recovery.test:
Test for BUG#34106
mysql-test/t/maria.test:
look at what is reported in SHOW ENGINES
mysys/my_pread.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_read.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_write.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
storage/maria/ha_maria.cc:
Description representing the current reality. This can be changed later
storage/maria/ma_page.c:
When reading the new key_del from a page on disk, if there is a bug
(like BUG#34062) this key_del could be wrong, we try to catch if it's
out of the key file.
storage/maria/ma_pagecache.c:
- no truncation of page's number in DBUG_PRINT (useful for BUG#34062)
- page_korr instead of uint5korr
storage/maria/ma_recovery.c:
page_korr instead of uint5korr
storage/maria/plug.in:
Description representing the current reality. This can be changed later.
2008-01-31 23:17:50 +01:00
|
|
|
* crashing mysqld intentionally
|
2010-09-12 18:40:01 +02:00
|
|
|
set global aria_checkpoint_interval=1;
|
Minor changes. New description in SHOW ENGINES for Maria.
Test for BUG#34106 "auto_increment is reset to 1 when table is recovered from crash"
(fixed by Monty yesterday)
mysql-test/r/maria-recovery.result:
result, which is correct (before pulling Monty's fix for BUG#34106,
we got a warning about auto_increment in CHECK TABLE (done in
maria-verify-recovery.inc), no AUTO_INCREMENT clause in
SHOW CREATE TABLE, and a failure of the last INSERT.
mysql-test/r/maria.result:
result
mysql-test/t/maria-recovery.test:
Test for BUG#34106
mysql-test/t/maria.test:
look at what is reported in SHOW ENGINES
mysys/my_pread.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_read.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_write.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
storage/maria/ha_maria.cc:
Description representing the current reality. This can be changed later
storage/maria/ma_page.c:
When reading the new key_del from a page on disk, if there is a bug
(like BUG#34062) this key_del could be wrong, we try to catch if it's
out of the key file.
storage/maria/ma_pagecache.c:
- no truncation of page's number in DBUG_PRINT (useful for BUG#34062)
- page_korr instead of uint5korr
storage/maria/ma_recovery.c:
page_korr instead of uint5korr
storage/maria/plug.in:
Description representing the current reality. This can be changed later.
2008-01-31 23:17:50 +01:00
|
|
|
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 create table t1;
|
|
|
|
Table Create Table
|
|
|
|
t1 CREATE TABLE `t1` (
|
|
|
|
`i` int(11) NOT NULL AUTO_INCREMENT,
|
|
|
|
`c` varchar(6) DEFAULT NULL,
|
|
|
|
PRIMARY KEY (`i`),
|
|
|
|
KEY `c` (`c`)
|
2010-09-12 18:40:01 +02:00
|
|
|
) ENGINE=Aria AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
|
Minor changes. New description in SHOW ENGINES for Maria.
Test for BUG#34106 "auto_increment is reset to 1 when table is recovered from crash"
(fixed by Monty yesterday)
mysql-test/r/maria-recovery.result:
result, which is correct (before pulling Monty's fix for BUG#34106,
we got a warning about auto_increment in CHECK TABLE (done in
maria-verify-recovery.inc), no AUTO_INCREMENT clause in
SHOW CREATE TABLE, and a failure of the last INSERT.
mysql-test/r/maria.result:
result
mysql-test/t/maria-recovery.test:
Test for BUG#34106
mysql-test/t/maria.test:
look at what is reported in SHOW ENGINES
mysys/my_pread.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_read.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
mysys/my_write.c:
changed my mind: if Count argument is >4GB, we'll surely see a segfault
in the pread() call when it tries to read 4GB from memory, so no need
to print it in ulonglong format (saves a function call).
storage/maria/ha_maria.cc:
Description representing the current reality. This can be changed later
storage/maria/ma_page.c:
When reading the new key_del from a page on disk, if there is a bug
(like BUG#34062) this key_del could be wrong, we try to catch if it's
out of the key file.
storage/maria/ma_pagecache.c:
- no truncation of page's number in DBUG_PRINT (useful for BUG#34062)
- page_korr instead of uint5korr
storage/maria/ma_recovery.c:
page_korr instead of uint5korr
storage/maria/plug.in:
Description representing the current reality. This can be changed later.
2008-01-31 23:17:50 +01:00
|
|
|
insert into t1 values(null, "f");
|
UNDO of rows now puts back all part of the row on their original pages and positions
Added variable _dbug_on_ to speed up execution when DBUG is not going to be used
Added --debug-on option to mysqld (to be able to turn of DBUG with --debug-on=0)
Fixed some bugs with 'non_flushable' marking of bitmap pages
Don't use 'non_flushable' marking of bitmap pages for not transactional tables
SHOW CREATE TABLE now shows if table was created with page checksums
Fixed a lot of bugs with BLOB handling in case of update/REDO and UNDO
More tests (especially for blobs) and DBUG_ASSERTS()
More readable output from maria_read_log and maria_chk
Fixed wrong shift that caused Maria to crash on files > 4G
Mark tables as crashed of REDO fails
dbug/dbug.c:
Changed to use my_bool (allowed me to remove some windows specific code)
Added variable _dbug_on_ to speed up execution when DBUG is not going to be used
Removed initialization of variables if not needed
include/my_dbug.h:
Use my_bool for some functions that was defined as BOOLEAN in dbug.c code
Added DBUGGER_ON/DEBUGGER_OFF to speed up execution when DBUG is not used
include/my_global.h:
Define my_bool early
Increase MY_HOW_OFTEN_TO_WRITE as computers are now faster than 10 years ago
mysql-test/mysql-test-run.pl:
Added debug-on=0 to speed up tests
mysql-test/r/maria-recovery.result:
Added new test by Guilhem to test if UNDO_ROW_DELETE preserves rowid
mysql-test/r/maria.result:
Added testing of page checksums
mysql-test/t/crash_commit_before-master.opt:
Added --debug-on as test require DBUG to work
mysql-test/t/maria-recovery-bitmap-master.opt:
Added --debug-on as test require DBUG to work
mysql-test/t/maria-recovery-master.opt:
Added --debug-on as test require DBUG to work
mysql-test/t/maria-recovery.test:
Added new test by Guilhem to test if UNDO_ROW_DELETE preserves rowid
mysql-test/t/maria.test:
Added testing of page checksums
sql/mysqld.cc:
Added --debug-on option (to be able to turn of DBUG with --debug-on=0)
Indentation fixes
Removed end spaces
sql/sql_show.cc:
Allow update_create_info() to inform MySQL if PACK_KEYS, NO_PACK_KEYS, CHECKSUM, PAGE_CHECKSUM or DELAY_KEY_WRITE is used
storage/maria/Makefile.am:
Added ma_test_big.sh
storage/maria/ha_maria.cc:
Store in create_info if page checksums are used (For SHOW CREATE TABLE)
storage/maria/ma_bitmap.c:
Added _ma_bitmap_wait_or_flush() to cause reader of bitmap pages to wait with reading until bitmap is flushed.
Use TAIL_PAGE_COUNT_MARKER for tail pages
Set 'sub_blocks' for and only for the head page or for the first extent of a blob. This is needed for store_extent_info() to be able to set START_EXTENT_BIT's
Don't allocate more than 0x3ffff pages in one extent (We need bit 0x4000 as a START_EXTENT_BIT)
Increase the calculated 'head_length' with the number of bytes used for extents.
Update row->space_on_head_page also in _ma_bitmap_find_new_place()
Make _ma_bitmap_get_page_bits() global. (Needed for UNDO handling)
Changed _ma_bitmap_flushable() to take MARIA_HA instead of MARIA_SHARE.
This was needed to be able to mark the handler if we had a 'non_flushable' call pending or not.
Don't use 'non_flushable' marking of bitmap pages for not transactional tables.
Added BLOCKUSED_USE_ORG_BITMAP handling also for tail pages.
Added more DBUG_ASSERT() to find possible errors in other code
Some code simplications by adding new local variables
storage/maria/ma_blockrec.c:
UNDO of rows now puts back all part of the row on their original pages and positions.
Changed UNDO of DELETE and UNDO of UPDATE to contain information about the original length of data on head block and also extent information
This changes a lot of logic as now an insert of a row on a page may happen to any position (and not just to the first or next free)
Use PAGE_COUNT to mark if an extent is the start of of a blob. (Needed for extent_to_bitmap_blocks())
Added check_directory() for checking that directroy entries are correct.
Added checking of row checksums when reading rows (with EXTRA_DEBUG)
Added make_space_for_directory() and extend_directory() for doing expansion of directory
Added get_rowpos_in_head_or_tail_page() to be able to store head/tail on original position in UNDO
Added extent_to_bitmap_blocks() to be able to generate original bitmap blocks from UNDO entry
Added _ma_update_at_original_place() for UNDO of DELETES
Added row->min_length to hold minmum required space needed on head page
Changed find_free_position() to use make_space_for_directory()
Changed make_empty_page() to allow optional creation of directory entry
Changed delete_head_or_tail() and _ma_apply_undo_row_isnert() to not copy pagecache block (speed optimization)
Changed _ma_apply_redo_insert_row_head_or_tail() to be able to insert new row at any position on 'new' page
Changed _ma_apply_undo_row_delete() and _ma_apply_undo_row_update() to put row in it's original position
Ensure allocation of tail blocks are of at least MIN_TAIL_SIZE.
Ensure we store pages in pinned pages even if read failed. (If not we will have pages pinned forever in page cache)
Write original extent information in UNDO entry, not compacted ones (we need position to tails!)
When setting BLOCKUSED_USED, don't clear other bits (we have to preserve BLOCKUSED_USE_ORG_BITMAP)
Fixed som bugs in directory handling
Fixed bug where we wrote wrong lsn to blob pages
Added separate blob_buffer for fixing bug when updating row that had char/varchar that spanned several pages and also had blobs
Ensure we call _ma_bitmap_flushable() also in case of errors
When doing an update, first delete old entries, then search in bitmap for where to put new information
Info->s -> share
Rowid -> rowid
More DBUG_ASSERT()
storage/maria/ma_blockrec.h:
Added START_EXTENT_BIT and TAIL_PAGE_COUNT_MARKER
Added _ma_bitmap_wait_or_flush() and _ma_bitmap_get_page_bits()
storage/maria/ma_check.c:
Don't write extra empty line if there is no deleted blocks
Ignore START_EXTENT_BIT's in page count
Call _ma_fast_unlock_key_del() to free key_del link
storage/maria/ma_close.c:
Ensure that used_key_del is 0. (If not, someone forgot to call _ma_unlock_key_del())
storage/maria/ma_create.c:
Changed constant to macro
storage/maria/ma_delete.c:
For deleted keys, log also position to row
storage/maria/ma_extra.c:
Release blob buffer at maria_reset() if bigger than MARIA_SMALL_BLOB_BUFFER
storage/maria/ma_key_recover.c:
Added bzero() of LSN that confused paged cache in case of uninitialized block
Mark file crashed if applying of index changes fails
Added calls to _ma_fast_unlock_key_del() for protection of shared key_del link.
storage/maria/ma_locking.c:
Added usage of MARIA_FILE_OPEN_COUNT_OFFSET
Added _ma_mark_file_crashed()
storage/maria/ma_loghandler.c:
Fixed bug where we logged uninitialized memory
storage/maria/ma_open.c:
Moved state->changed to be at start of state info on disk to allow one to easly mark files as crashed
storage/maria/ma_page.c:
Disable 'dummy' checksumming of pages as this gave false warnings.
(Need to investigate if this is ever needed)
storage/maria/ma_pagecache.c:
Fixed wrong shift that caused Maria to crash on files > 4G
storage/maria/ma_recovery.c:
In case of errors, start writing on new line if we where in %## %## printing mode (Made errors more readable)
Changed global variable name from warnings -> recovery_warnings
Use MARIA_FILE_CREATE_RENAME_LSN_OFFSET instead of constant
Removed special handling of row position for deleted keys. Keys now always includes row positions
_ma_apply_undo_row_delete() now gets page and row position
Added check that we don't loop forever when handling undo's (in case of bug in undo chain)
Print name of failed REDO/UNDO
storage/maria/ma_recovery.h:
Removed old comment
storage/maria/ma_static.c:
Chaned version number of Maria files to not accidently use old ones (becasue of change of ordering of status variables)
storage/maria/ma_test2.c:
Added option -u to specify number of rows to update
Changed old option -u to be -A, as for ma_test1
Fixed bug in update of rows with blobs (before blobs was always reset to empty on update)
First created blob is now of max blob length to ensure we have at least one big blob in the table
storage/maria/ma_test_all.sh:
More tests
storage/maria/ma_test_recovery.expected:
Updated results
storage/maria/ma_test_recovery:
Changed tests to use bigger blobs (not just 1K)
Added new tests that tests recovery of update with blobs
Removed comparision of .MAD file as it's not guranteed that recovery from scratch gives identical data file as original update
(compact_page() may be called at different times during normal execution and during REDO)
storage/maria/ma_update.c:
Simplify code (changed * to if)
storage/maria/maria_chk.c:
Make output more readable
storage/maria/maria_def.h:
Changed 'changed' to int to prepare for more bits
Added 2 more bytes to status information
Added 'st_mara_row->min_length' for storing min length needed on head page
Added 'st_mara_handler->blob_buff & blob_buff_size' for storing blobs
Moved all tunning parameters into one block
Added MARIA_SMALL_BLOB_BUFFER
Added _ma_mark_file_crashed()
storage/myisam/mi_test2.c:
Fixed bug in update of rows with blobs (before blobs was always reset to empty on update)
storage/maria/ma_test_big.sh:
Testing of insert, update, delete, recovery and undo of rows with blobs
Thanks to the random-ness of ma_test2 this is likely to find most bugs in the row handling
2007-12-30 21:40:03 +01:00
|
|
|
drop table t1;
|
* WL#4137 Maria- Framework for testing recovery in mysql-test-run
See test maria-recovery.test for a model; all include scripts have
an "API" section at start if they do take parameters from outside.
* Fixing bug reported by Jani and Monty (when two REDOs about the same
page in one group, see ma_blockrec.c).
* Fixing small bugs in recovery
mysql-test/include/wait_until_connected_again.inc:
be sure to enter the loop (the previous query by the caller may not have
failed: it could be
query;
mysqladmin shutdown;
call this script).
mysql-test/lib/mtr_process.pl:
* Through the "expect" file a test can tell mtr that a server crash
is expected. What the file contains is irrelevant. Now if its last
line starts with "wait", mtr will wait before restarting (it will
wait for the last line to not start with "wait"). This is for
tests which need to mangle files under the feet of a dead mysqld.
* Remove "expect" file before restarting; otherwise there could be a
race condition: tests sees server restarted, does something, writes
an "expect" file, and then mtr removes that file, then
test kills mysqld, and then mtr will never restart it.
storage/maria/ma_blockrec.c:
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- fixing bug in applying of REDO_PURGE_BLOCKS in recovery: page_range
sometimes has TAIL_BIT set, need to turn it down to know the real page
range.
- Both bugs are covered in maria-recovery.test
storage/maria/ma_checkpoint.c:
Capability to, in debug builds only, do some special operations
(flush all bitmap and data pages, flush state, flush log)
and crash mysqld, to later test recovery.
Driven by some --debug=d, symbols.
storage/maria/ma_open.c:
debugging info
storage/maria/ma_pagecache.c:
Now that we can _ma_unpin_all_pages() during the REDO phase
to set page's LSN, the assertion needs to be relaxed.
storage/maria/ma_recovery.c:
- open trace file in append mode (useful when a test triggers several
recoveries, we see them all).
- fixing wrong error detection, it's possible that during recovery
we want to open an already open table.
- when applying a REDO in recovery, we don't anymore put UNDO's LSN on the page
at once; indeed if in this REDO's group there comes another REDO
for the same page it would be wrongly skipped. Instead, we keep
pages pinned, don't change their LSN. When done with all REDOs
of the group we unpin them and stamp them with UNDO's LSN.
- we verify that all log records of a group are about the same table,
for debugging.
mysql-test/r/maria-recovery.result:
result
mysql-test/t/maria-recovery-master.opt:
crash is expected, core file would take room, stack trace would
wake pushbuild up.
mysql-test/t/maria-recovery.test:
Test of recovery from mysql-test (it is already tested as unit tests
in ma_test_recovery) (WL#4137)
- test that, if recovery is made to start on an empty table it can
replay the effects of committed and uncommitted statements (having only
the committed ones in the end result). This should be the first test
for someone writing code of new REDOs.
- test that, if mysqld is crashed and recovery runs we have only
committed statements in the end result. Crashes are done in different
ways: flush nothing (so, uncommitted statement is often missing
from the log => no rollback to do); flush pagecache (implicitely flushes
log (WAL)) and flush log, both causes rollbacks; flush log can also
flush state (state.records etc) to test recovery of the state
(not tested well now as we repair the index anyway).
- test of bug found by Jani and Monty in recovery (two REDO about
the same page in one group).
mysql-test/include/maria_empty_logs.inc:
removes logs, to have a clean sheet for testing recovery.
mysql-test/include/maria_make_snapshot.inc:
copies a table to another directory, or back, or compares both
(comparison is not implemented as physical comparison is impossible
if an UNDO phase happened).
mysql-test/include/maria_make_snapshot_for_comparison.inc:
copies tables to another directory so that they can later
serve as a comparison reference (they are the good tables,
recovery should produce similar ones).
mysql-test/include/maria_make_snapshot_for_feeding_recovery.inc:
When we want to force recovery to start on old tables, we prepare
old tables with this script: we put them in a spare directory.
They are later copied back over mysqltest tables while mysqld is dead.
We also need to copy back the control file, otherwise mysqld,
in recovery, would start from the latest checkpoint: latest
checkpoint plus old tables is not a recovery-possible scenario of course.
mysql-test/include/maria_verify_recovery.inc:
causes mysqld to crash, restores old tables if requested,
lets recovery run, compares resulting tables with reference tables
by using CHECKSUM TABLE.
We don't do any sanity checks on page's LSN in resulting tables, yet.
2007-11-13 17:12:29 +01:00
|
|
|
drop database mysqltest_for_feeding_recovery;
|
|
|
|
drop database mysqltest_for_comparison;
|
|
|
|
drop database mysqltest;
|