Skip to content
Permalink
Browse files
MDEV-23806 Undo page corruption on recovery
When commit 0fd3def 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 56f6dab (MDEV-21174) and
commit 7ae21b1 (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.
  • Loading branch information
dr-m committed Sep 24, 2020
1 parent 6736fe9 commit e57c116
Showing 1 changed file with 15 additions and 0 deletions.
@@ -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);

0 comments on commit e57c116

Please sign in to comment.