Skip to content

Commit

Permalink
MDEV-34216 Possible corruption when shrinking the system tablespace o…
Browse files Browse the repository at this point in the history
…n innodb_fast_shutdown=0

This bug was found related to MDEV-34212.

Some InnoDB tests, most notably innodb.table_flags,64k would occasionally
fail. I am able to reproduce this locally on a MemorySanitizer build,
sporadically.

The following is a minimal .test file for reproducing this:
  --source include/have_innodb.inc
  SELECT @@innodb_page_size;
and the .opt file:
  --innodb-undo-tablespaces=0 --innodb-page-size=64k
  --innodb-buffer-pool-size=20m

This bug was revealed due to the recent
commit 466ae1c
which set innodb_fast_shutdown=0 during server bootstrap
in our regression test driver.

Due to the bug, a write of undo page 50 in the system tablespace
was discarded in buf_page_t::flush(). A subsequent InnoDB startup
failed because an old version of that page would point to a
freed undo log page 300.

mtr_t::commit_shrink(): Only invoke fil_space_t::set_create_lsn()
on undo tablespaces, which will be fully reinitialized or created
from the scratch. On the system tablespace, we must only adjust
the file size, to avoid writing pages that are beyond the end
of the tablespace. Thanks to Thirunarayanan Balathandayuthapani
for providing this fix.
  • Loading branch information
dr-m committed May 22, 2024
1 parent ff377d3 commit b793feb
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion storage/innobase/mtr/mtr0mtr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -583,8 +583,9 @@ void mtr_t::commit_shrink(fil_space_t &space, uint32_t size)

if (space.id == TRX_SYS_SPACE)
srv_sys_space.set_last_file_size(file->size);
else
space.set_create_lsn(m_commit_lsn);

space.set_create_lsn(m_commit_lsn);
mysql_mutex_unlock(&fil_system.mutex);

space.clear_freed_ranges();
Expand Down

0 comments on commit b793feb

Please sign in to comment.