--source include/innodb_page_size.inc --source include/not_embedded.inc let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; let MYSQLD_IS_DEBUG=`select version() like '%debug%'`; --source include/no_checkpoint_start.inc SET GLOBAL innodb_file_per_table=0; CREATE TABLE t(a INT)ENGINE=InnoDB; let INNODB_ROOT_PAGE= `SELECT page_no FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE name='GEN_CLUST_INDEX'`; SET GLOBAL innodb_file_per_table=1; CREATE TABLE ibd4(a INT UNIQUE)ENGINE=InnoDB; CREATE TABLE ibd4f(a INT UNIQUE)ENGINE=InnoDB; CREATE TABLE ibd5(a INT UNIQUE, b INT UNIQUE)ENGINE=InnoDB; let $drop_tables= DROP TABLE t,ibd4,ibd4f,ibd5; --let CLEANUP_IF_CHECKPOINT= $drop_tables; --source ../include/no_checkpoint_end.inc perl; use Fcntl 'SEEK_CUR', 'SEEK_END'; my $page_size = $ENV{'INNODB_PAGE_SIZE'}; my $restart; open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}ibdata1") or die; if ($ENV{'MYSQLD_IS_DEBUG'}) { # It is impractical to ensure that CREATE TABLE t will extend ibdata1. # We rely on innodb_system_tablespace_extend_debug=1 # to recover from this fault injection if no size change was redo-logged. my $root = $ENV{'INNODB_ROOT_PAGE'}; my $size = sysseek(FILE, 0, SEEK_END) / $page_size; seek(FILE, $page_size * ($root + 1), SEEK_SET) or die; my $empty_tail= 1; while() { unless (/\0*/gso) { $empty_tail= 0; last } } if ($empty_tail) { $restart = "--innodb-data-file-size-debug=$size"; truncate(FILE, $page_size * $root); } } # Clear the doublewrite buffer entries for our tables. sysseek(FILE, 6 * $page_size - 190, 0)||die "Unable to seek ibdata1\n"; sysread(FILE, $_, 12) == 12||die "Unable to read TRX_SYS\n"; my($magic,$d1,$d2)=unpack "NNN", $_; die "magic=$magic, $d1, $d2\n" unless $magic == 536853855 && $d2 >= $d1 + 64; sysseek(FILE, $d1 * $page_size, 0)||die "Unable to seek ibdata1\n"; # Find the pages in the doublewrite buffer for (my $d = $d1; $d < $d2 + 64; $d++) { sysread(FILE, $_, $page_size)==$page_size||die "Cannot read doublewrite\n"; my($space_id,$offset)=unpack "x[4]Nx[26]N",$_; next unless $space_id && $offset > 3; sysseek(FILE, $d * $page_size, 0)||die "Unable to seek ibdata1\n"; syswrite(FILE, chr(0) x $page_size)==$page_size||die; } close FILE; open(FILE, ">$ENV{MYSQLTEST_VARDIR}/log/start_mysqld.txt") || die; print FILE "--let \$restart_parameters=$restart\n" if $restart; print FILE "--let \$restart_noprint=2\n"; print FILE "--source include/start_mysqld.inc\n"; close FILE; open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}test/ibd4.ibd") or die; truncate(FILE, $page_size * 4); close FILE; open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}test/ibd4f.ibd") or die; truncate(FILE, $page_size * 4 + 1234); # Work around MDEV-12699 and ensure that the truncated page is all-zero. sysseek(FILE, $page_size * 4, 0); syswrite(FILE, chr(0) x 1234); close FILE; open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}test/ibd5.ibd") or die; truncate(FILE, $page_size * 5); close FILE; EOF --source $MYSQLTEST_VARDIR/log/start_mysqld.txt --remove_file $MYSQLTEST_VARDIR/log/start_mysqld.txt eval $drop_tables;