Browse Source

MDEV-23806 Undo page corruption on recovery

When commit 0fd3def284 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 56f6dab1d0 (MDEV-21174) and
commit 7ae21b18a6 (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.
pull/1674/head
Marko Mäkelä 5 years ago
parent
commit
e57c1167ab
  1. 15
      storage/innobase/trx/trx0rec.cc

15
storage/innobase/trx/trx0rec.cc

@ -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);

Loading…
Cancel
Save