MDEV-22970: Disable MDEV-8139 due to corruption concerns

Contrary to our exceptations, it seems that a mini-transaction can
allocate a page that it had freed earlier. The function mtr_t::init()
is not prepared to deal with this, and it could happen that a
newly initialized page will be scrubbed instead. This can affect
the operation on page_compressed tables, or any InnoDB data files when
innodb_background_scrub_data_uncompressed=ON.

Also, buf_read_recv_pages() can interfere with the MDEV-8139 logic
during crash recovery.

Let us temporarily disable MDEV-8139 due to such concerns.

Note: Scrubbing will partially work thanks to MDEV-15528. Only in
cases where the page does not exist in the buffer pool at the time
of the page flush, we would skip the scrubbing action.
This commit is contained in:
Marko Mäkelä 2020-06-21 11:41:59 +03:00 committed by Sergei Golubchik
commit 63b3f78922
3 changed files with 11 additions and 0 deletions

View file

@ -1777,6 +1777,7 @@ append:
log_phys_t(start_lsn, lsn, l, len));
}
#if 0 /* FIXME: MDEV-22970 Potential corruption */
/** Store/remove the freed pages in fil_name_t of recv_spaces.
@param[in] page_id freed or init page_id
@param[in] freed TRUE if page is freed */
@ -1805,6 +1806,7 @@ static void store_freed_or_init_rec(page_id_t page_id, bool freed)
i->second.remove_freed_page(page_no);
}
}
#endif
/** Parse and register one mini-transaction in log_t::FORMAT_10_5.
@param checkpoint_lsn the log sequence number of the latest checkpoint
@ -2004,7 +2006,9 @@ same_page:
case INIT_PAGE:
last_offset= FIL_PAGE_TYPE;
free_or_init_page:
#if 0 /* FIXME: MDEV-22970 Potential corruption */
store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE);
#endif
if (UNIV_UNLIKELY(rlen != 0))
goto record_corrupted;
break;