From b1241550b2f80239ad9d2cf020da9cdc998af844 Mon Sep 17 00:00:00 2001 From: nikezono Date: Thu, 23 Apr 2026 17:03:14 +0900 Subject: [PATCH] Fix ut_error in log_request_latest_checkpoint() when innodb_checkpoint_disabled is set --- ...redo_log_enable_checkpoint_disabled.result | 25 ++++++++++++++ .../redo_log_enable_checkpoint_disabled.test | 34 +++++++++++++++++++ storage/innobase/log/log0chkp.cc | 6 ++++ 3 files changed, 65 insertions(+) create mode 100644 mysql-test/suite/innodb/r/redo_log_enable_checkpoint_disabled.result create mode 100644 mysql-test/suite/innodb/t/redo_log_enable_checkpoint_disabled.test diff --git a/mysql-test/suite/innodb/r/redo_log_enable_checkpoint_disabled.result b/mysql-test/suite/innodb/r/redo_log_enable_checkpoint_disabled.result new file mode 100644 index 000000000000..0f5af2248f4b --- /dev/null +++ b/mysql-test/suite/innodb/r/redo_log_enable_checkpoint_disabled.result @@ -0,0 +1,25 @@ +# +# Bug: ALTER INSTANCE ENABLE INNODB REDO_LOG hits ut_error in debug build +# when innodb_checkpoint_disabled is set. +# +# Repro steps: +# ALTER INSTANCE DISABLE INNODB REDO_LOG; +# SET GLOBAL innodb_checkpoint_disabled=1; +# ALTER INSTANCE ENABLE INNODB REDO_LOG; -- crashed here +# +# Disable redo logging +ALTER INSTANCE DISABLE INNODB REDO_LOG; +SHOW STATUS LIKE 'Innodb_redo_log_enabled'; +Variable_name Value +Innodb_redo_log_enabled OFF +# Disable checkpointing (debug-only) +SET GLOBAL innodb_checkpoint_disabled = ON; +# Re-enable redo logging while checkpoint is disabled. +# This used to hit ut_error in log_request_latest_checkpoint(). +ALTER INSTANCE ENABLE INNODB REDO_LOG; +# Verify redo logging is now enabled +SHOW STATUS LIKE 'Innodb_redo_log_enabled'; +Variable_name Value +Innodb_redo_log_enabled ON +# Cleanup +SET GLOBAL innodb_checkpoint_disabled = OFF; diff --git a/mysql-test/suite/innodb/t/redo_log_enable_checkpoint_disabled.test b/mysql-test/suite/innodb/t/redo_log_enable_checkpoint_disabled.test new file mode 100644 index 000000000000..0fb212441609 --- /dev/null +++ b/mysql-test/suite/innodb/t/redo_log_enable_checkpoint_disabled.test @@ -0,0 +1,34 @@ +--echo # +--echo # Bug: ALTER INSTANCE ENABLE INNODB REDO_LOG hits ut_error in debug build +--echo # when innodb_checkpoint_disabled is set. +--echo # +--echo # Repro steps: +--echo # ALTER INSTANCE DISABLE INNODB REDO_LOG; +--echo # SET GLOBAL innodb_checkpoint_disabled=1; +--echo # ALTER INSTANCE ENABLE INNODB REDO_LOG; -- crashed here +--echo # + +# innodb_checkpoint_disabled is a debug-only variable +--source include/have_debug.inc + +--disable_query_log +call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* InnoDB redo logging is disabled. All data could be lost in case of a server crash"); +call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* InnoDB redo logging is enabled. Data is now safe and can be recovered in case of a server crash."); +--enable_query_log + +--echo # Disable redo logging +ALTER INSTANCE DISABLE INNODB REDO_LOG; +SHOW STATUS LIKE 'Innodb_redo_log_enabled'; + +--echo # Disable checkpointing (debug-only) +SET GLOBAL innodb_checkpoint_disabled = ON; + +--echo # Re-enable redo logging while checkpoint is disabled. +--echo # This used to hit ut_error in log_request_latest_checkpoint(). +ALTER INSTANCE ENABLE INNODB REDO_LOG; + +--echo # Verify redo logging is now enabled +SHOW STATUS LIKE 'Innodb_redo_log_enabled'; + +--echo # Cleanup +SET GLOBAL innodb_checkpoint_disabled = OFF; diff --git a/storage/innobase/log/log0chkp.cc b/storage/innobase/log/log0chkp.cc index 881828a0bccf..f1b6b42ff169 100644 --- a/storage/innobase/log/log0chkp.cc +++ b/storage/innobase/log/log0chkp.cc @@ -605,6 +605,12 @@ void log_request_checkpoint(log_t &log, bool sync) { bool log_request_latest_checkpoint(log_t &log, lsn_t &requested_lsn) { const lsn_t lsn = log_get_lsn(log); +#ifdef UNIV_DEBUG + if (srv_checkpoint_disabled) { + return false; + } +#endif + if (lsn <= log.last_checkpoint_lsn.load()) { return false; }