MDEV-37412: Better test case

Instead of using DBUG_EXECUTE_IF fault injection, let us construct
a minimal corrupted log file that will produce an OPT_PAGE_CHECKSUM
mismatch without depending on CMAKE_BUILD_TYPE=Debug.
This commit is contained in:
Marko Mäkelä 2025-09-15 08:44:26 +03:00
commit fe59b4ce96
5 changed files with 97 additions and 28 deletions

View file

@ -4,15 +4,6 @@ INSERT INTO t1 VALUES(1, 'sql'), (2, 'server'), (3, 'mariadb'),
(4, 'mariadb'), (5, 'test1'), (6, 'test2'), (7, 'test3'),
(8, 'test4'), (9, 'test5'), (10, 'test6'), (11, 'test7'),
(12, 'test8');
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9], page number=0\\] of corrupted file '.*mdev_37412\\.ibd'");
SET GLOBAL innodb_log_checkpoint_now=ON;
CREATE TABLE mdev_37412(id INT AUTO_INCREMENT, PRIMARY KEY(id))
STATS_PERSISTENT=0 ENGINE=InnoDB;
# Kill the server
# restart: --debug_dbug=+d,recv_corrupt
SELECT * FROM mdev_37412;
id
DROP TABLE mdev_37412;
SELECT COUNT(*) FROM t1;
COUNT(*)
12

View file

@ -0,0 +1,30 @@
#
# MDEV-37412 Corrupted page during recovery aborts the server
#
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch on \\[page id: space=127, page number=0\\]");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=127, page number=0\\] of corrupted file '.*test/t\\.ibd");
call mtr.add_suppression("(InnoDB: Plugin|Plugin 'InnoDB')");
call mtr.add_suppression("InnoDB: Page .* Current system log sequence number 123(38|54)\\.");
SET GLOBAL innodb_fast_shutdown=0;
# restart
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
NOT FOUND /InnoDB: Page .* Current system log sequence number/ in mysqld.1.err
# restart: --innodb-force-recovery=1
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
FOUND 1 /InnoDB: Page .* Current system log sequence number/ in mysqld.1.err
FOUND 2 /InnoDB: OPT_PAGE_CHECKSUM mismatch on \[page id: space=127, page number=0\]/ in mysqld.1.err
FOUND 1 /InnoDB: Cannot apply log to \[page id: space=127, page number=0\] of corrupted file .*test/t\.ibd/ in mysqld.1.err
# restart
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES

View file

@ -21,23 +21,8 @@ INSERT INTO t1 VALUES(1, 'sql'), (2, 'server'), (3, 'mariadb'),
(8, 'test4'), (9, 'test5'), (10, 'test6'), (11, 'test7'),
(12, 'test8');
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9], page number=0\\] of corrupted file '.*mdev_37412\\.ibd'");
SET GLOBAL innodb_log_checkpoint_now=ON;
--source ../include/no_checkpoint_start.inc
CREATE TABLE mdev_37412(id INT AUTO_INCREMENT, PRIMARY KEY(id))
STATS_PERSISTENT=0 ENGINE=InnoDB;
--let CLEANUP_IF_CHECKPOINT=DROP TABLE t1,mdev_37412;
--source ../include/no_checkpoint_end.inc
--let $restart_parameters=--debug_dbug=+d,recv_corrupt
--source include/start_mysqld.inc
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_PATTERN= InnoDB: Cannot apply log to \\[page id: space=[1-9], page number=0\\] of corrupted file '.*mdev_37412\\.ibd';
--let $restart_parameters=
let $restart_noprint=2;
--source include/restart_mysqld.inc
SELECT * FROM mdev_37412;
DROP TABLE mdev_37412;
let INNODB_PAGE_SIZE=`select @@innodb_page_size`;
let MYSQLD_DATADIR=`select @@datadir`;

View file

@ -0,0 +1,67 @@
--source include/have_innodb.inc
--let DATADIR=`select @@datadir`
let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err
--echo #
--echo # MDEV-37412 Corrupted page during recovery aborts the server
--echo #
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch on \\[page id: space=127, page number=0\\]");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=127, page number=0\\] of corrupted file '.*test/t\\.ibd");
call mtr.add_suppression("(InnoDB: Plugin|Plugin 'InnoDB')");
call mtr.add_suppression("InnoDB: Page .* Current system log sequence number 123(38|54)\\.");
SET GLOBAL innodb_fast_shutdown=0;
--source include/shutdown_mysqld.inc
--move_file $DATADIR/ib_logfile0 $DATADIR/ib_logfile0.old
perl;
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
die unless open OUT, ">", "$ENV{DATADIR}/ib_logfile0";
binmode OUT;
sub crc32c {
my ($input) = @_;
print OUT $input, pack("N", mycrc32($input, 0, 0x82f63b78))
}
sub mtr {
my ($input) = @_;
print OUT $input, chr(1), pack("N", mycrc32($input, 0, 0x82f63b78))
}
crc32c("Phys" . pack("x[8]N", 0x3000) . "BogoDB 1.2.3.4" . chr(0) x 478);
print OUT chr(0) x 3584;
crc32c(pack("x[4]Nx[4]Nx[44]", 0x3000, 0x3000));
print OUT chr(0) x 8128;
mtr(pack("Cx[6]N", 0xfa, 0x3000)); # FILE_CHECKPOINT
mtr(pack("CCx", 0x8c, 127) . "test/t.ibd"); # FILE_CREATE
# INIT_PAGE, OPT_PAGE_CHECKSUM
mtr(pack("CCxCCx[6]", 0x12, 127, 0x77, 127));
EOF
write_file $DATADIR/test/t.ibd;
EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
let SEARCH_PATTERN=InnoDB: Page .* Current system log sequence number;
--source include/search_pattern_in_file.inc
--let $restart_parameters=--innodb-force-recovery=1
--source include/restart_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
--move_file $DATADIR/ib_logfile0.old $DATADIR/ib_logfile0
--remove_file $DATADIR/test/t.ibd
--let $restart_parameters=
--source include/search_pattern_in_file.inc
let SEARCH_PATTERN=InnoDB: OPT_PAGE_CHECKSUM mismatch on \\[page id: space=127, page number=0\\];
--source include/search_pattern_in_file.inc
let SEARCH_PATTERN=InnoDB: Cannot apply log to \\[page id: space=127, page number=0\\] of corrupted file .*test/t\\.ibd;
--source include/search_pattern_in_file.inc
--source include/start_mysqld.inc
eval $check_no_innodb;