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

MDEV-22102 Assertion w==OPT failed in trx_undo_header_create()

Because InnoDB is not freeing undo pages to the normal
free-page management, old undo log pages can be reused. Due to that,
it is possible (but unlikely) that the fields TRX_UNDO_NEEDS_PURGE
and TRX_UNDO_LOG_START relative to the free offset that is stored at
TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_START already have the correct value.
Hence, we must pass the mtr_t::OPT template parameter to silence the
debug assertion.

Other writes in trx_undo_header_create() that are using the default
template parameter seem to be correct (the data fields should be
guaranteed to change even in the event of reusing pages).
parent 244ff3e5
...@@ -468,8 +468,8 @@ static uint16_t trx_undo_header_create(buf_block_t *undo_page, trx_id_t trx_id, ...@@ -468,8 +468,8 @@ static uint16_t trx_undo_header_create(buf_block_t *undo_page, trx_id_t trx_id,
memcpy_aligned<2>(buf + 2, start, 2); memcpy_aligned<2>(buf + 2, start, 2);
static_assert(TRX_UNDO_NEEDS_PURGE + 2 == TRX_UNDO_LOG_START, static_assert(TRX_UNDO_NEEDS_PURGE + 2 == TRX_UNDO_LOG_START,
"compatibility"); "compatibility");
mtr->memcpy(*undo_page, free + TRX_UNDO_NEEDS_PURGE + undo_page->frame, mtr->memcpy<mtr_t::OPT>(*undo_page, free + TRX_UNDO_NEEDS_PURGE +
buf, 4); undo_page->frame, buf, 4);
/* Initialize all fields TRX_UNDO_XID_EXISTS to TRX_UNDO_HISTORY_NODE. */ /* Initialize all fields TRX_UNDO_XID_EXISTS to TRX_UNDO_HISTORY_NODE. */
if (prev_log) if (prev_log)
{ {
......
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