Commit e57c1167 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-23806 Undo page corruption on recovery

When commit 0fd3def2 removed
the MLOG_UNDO_ERASE_END record in MariaDB 10.3.3 in an attempt
to reduce our redo log volume, it introduced technical debt for
commit 56f6dab1 (MDEV-21174) and
commit 7ae21b18 (MDEV-12353),
which optimized mtr_t::write() (née mlog_write_ulint()) so
that the initial bytes that are unchanged are not logged.

trx_undo_report_row_operation(): Write a log record for the
memset() operation if the page is not going to be freed.
parent 6736fe92
......@@ -2040,6 +2040,21 @@ trx_undo_report_row_operation(
err = DB_UNDO_RECORD_TOO_BIG;
goto err_exit;
} else {
/* Write log for clearing the unused
tail of the undo page. It might
contain some garbage from a previously
written record, and mtr_t::write()
will optimize away writes of unchanged
bytes. Failure to write this caused a
recovery failure when we avoided
reading the undo log page from the
data file and initialized it based on
redo log records (which included the
write of the previous garbage). */
mtr.memset(*undo_block, first_free,
srv_page_size - first_free
- FIL_PAGE_DATA_END, 0);
}
mtr_commit(&mtr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment