Commit 75a65d32 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-25886 CHECK TABLE crash with DB_MISSING_HISTORY if innodb_read_only

Occasionally, the test innodb.alter_copy would fail in MariaDB 10.6.1,
reporting DB_MISSING_HISTORY during CHECK TABLE. It started to occur during
the development of MDEV-25180, which introduced purge_sys.stop_SYS().
If we delay purge more during DDL operations, then the test would
almost always fail. The reason is that during startup we will restore
a purge view, and CHECK TABLE would still use REPEATABLE READ
even though innodb_read_only is set and other isolation levels
than READ UNCOMMITTED are not guaranteed to work.

ha_innobase::check(): Use READ UNCOMMITTED isolation level if
innodb_read_only is set or innodb_force_recovery exceeds 3.

dict_set_corrupted(): Do not update the persistent data dictionary
if innodb_force_recovery exceeds 3.
parent 6e9642be
......@@ -5425,7 +5425,7 @@ dict_set_corrupted(
/* If this is read only mode, do not update SYS_INDEXES, just
mark it as corrupted in memory */
if (srv_read_only_mode) {
if (high_level_read_only) {
index->type |= DICT_CORRUPT;
goto func_exit;
}
......
......@@ -14796,10 +14796,9 @@ ha_innobase::check(
/* We must run the index record counts at an isolation level
>= READ COMMITTED, because a dirty read can see a wrong number
of records in some index; to play safe, we use always
REPEATABLE READ here (except when undo logs are unavailable) */
m_prebuilt->trx->isolation_level = srv_force_recovery
>= SRV_FORCE_NO_UNDO_LOG_SCAN
of records in some index; to play safe, we normally use
REPEATABLE READ here */
m_prebuilt->trx->isolation_level = high_level_read_only
? TRX_ISO_READ_UNCOMMITTED
: TRX_ISO_REPEATABLE_READ;
......
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