summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/innodb/t/page_id_innochecksum.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/innodb/t/page_id_innochecksum.test')
-rw-r--r--mysql-test/suite/innodb/t/page_id_innochecksum.test70
1 files changed, 70 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb/t/page_id_innochecksum.test b/mysql-test/suite/innodb/t/page_id_innochecksum.test
new file mode 100644
index 00000000..902d2aba
--- /dev/null
+++ b/mysql-test/suite/innodb/t/page_id_innochecksum.test
@@ -0,0 +1,70 @@
+--source include/have_innodb.inc
+--source include/not_embedded.inc
+--source include/innodb_checksum_algorithm.inc
+--echo # Set the environmental variables
+let MYSQLD_BASEDIR= `SELECT @@basedir`;
+let MYSQLD_DATADIR= `SELECT @@datadir`;
+let INNODB_PAGE_SIZE=`select @@innodb_page_size`;
+
+create table t1(f1 int not null)engine=innodb;
+insert into t1 values(1), (2), (3);
+let $resultlog=$MYSQLTEST_VARDIR/tmp/result.log;
+
+let $restart_noprint=2;
+--source include/shutdown_mysqld.inc
+--echo # Change the page offset
+perl;
+use strict;
+use warnings;
+use Fcntl qw(:DEFAULT :seek);
+do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
+
+my $page_size = $ENV{INNODB_PAGE_SIZE};
+
+sysopen IBD_FILE, "$ENV{MYSQLD_DATADIR}/test/t1.ibd", O_RDWR
+|| die "Cannot open t1.ibd\n";
+sysread(IBD_FILE, $_, 58) || die "Cannot read t1.ibd\n";
+my ($space,$flags) = unpack("x[34]Nx[16]N", $_);
+my $full_crc32 = $flags & 0x10;
+sysseek(IBD_FILE, $page_size * 3, SEEK_SET) || die "Cannot seek t1.ibd\n";
+
+my $page= pack("NNx[18]NNN", 0, 4, 1, 0, $space).(chr(0) x ($page_size - 38));
+
+# Calculate innodb_checksum_algorithm=crc32 or full_crc32.
+my $polynomial = 0x82f63b78; # CRC-32C
+if ($full_crc32)
+{
+ my $ck = mycrc32(substr($page, 0, $page_size-4), 0, $polynomial);
+ substr($page, $page_size-4, 4) = pack("N", $ck);
+}
+else
+{
+ # The following bytes are excluded:
+ # 0..3 (the checksum is stored there)
+ # 26..37 (encryption key version, post-encryption checksum, tablespace id)
+ # $page_size-8..$page_size-1 (checksum, LSB of FIL_PAGE_LSN)
+ my $ck= pack("N",mycrc32(substr($page, 4, 22), 0, $polynomial) ^
+ mycrc32(substr($page, 38, $page_size-38-8), 0, $polynomial));
+ substr($page,0,4)=$ck;
+ substr($page,$page_size-8,4)=$ck;
+}
+
+die unless syswrite(IBD_FILE, $page, $page_size) == $page_size;
+close IBD_FILE;
+EOF
+
+--error 1
+exec $INNOCHECKSUM -l $resultlog $MYSQLD_DATADIR/test/t1.ibd;
+
+let SEARCH_FILE = $MYSQLTEST_VARDIR/tmp/result.log;
+let SEARCH_PATTERN=page id mismatch;
+--source include/search_pattern_in_file.inc
+
+--remove_file $resultlog
+let $restart_parameters=--innodb-force-recovery=1;
+--source include/start_mysqld.inc
+--source include/wait_all_purged.inc
+drop table t1;
+call mtr.add_suppression("InnoDB: Failed to read page 3 from file '.*test/t1\\.ibd': Page read from tablespace is corrupted\\.");
+let $restart_parameters=;
+--source include/restart_mysqld.inc