mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
df51dc28f5
In tests that directly write InnoDB data file pages, compute the innodb_checksum_algorithm=crc32 checksums, instead of writing the 0xdeadbeef value used by innodb_checksum_algorithm=none. In this way, these tests will not cause failures when executing ./mtr --mysqld=--loose-innodb-checksum-algorithm=strict_crc32
45 lines
1.5 KiB
Raku
45 lines
1.5 KiB
Raku
# Convert tablespace flags to the format understood by MariaDB 10.1.0..10.1.20,
|
|
# with the assumption that the flags were correct.
|
|
|
|
sub convert_to_mariadb_101
|
|
{
|
|
my ($file, $page_size) = @_;
|
|
open(FILE, "+<", $file) or die "Unable to open $file\n";
|
|
sysread(FILE, $_, $page_size)==$page_size||die "Unable to read $file\n";
|
|
sysseek(FILE, 0, 0)||die "Unable to seek $file\n";
|
|
|
|
# FIL_PAGE_DATA + FSP_SPACE_FLAGS = 38 + 16 = 54 bytes from the start
|
|
my($flags) = unpack "x[54]N", $_;
|
|
my $badflags = ($flags & 0x3f);
|
|
my $compression_level=3;
|
|
$badflags |= 1<<6|$compression_level<<7 if ($flags & 1 << 16);
|
|
$badflags |= ($flags & 15 << 6) << 7; # PAGE_SSIZE
|
|
|
|
if ($badflags != $flags)
|
|
{
|
|
warn "$file: changing $flags to $badflags\n";
|
|
substr ($_, 54, 4) = pack("N", $badflags);
|
|
# Compute and replace the innodb_checksum_algorithm=crc32 checksum
|
|
my $polynomial = 0x82f63b78; # CRC-32C
|
|
if ($page_size == 1024)
|
|
{
|
|
# ROW_FORMAT=COMPRESSED
|
|
substr($_,0,4)=pack("N",
|
|
mycrc32(substr($_, 4, 12), 0, $polynomial) ^
|
|
mycrc32(substr($_, 24, 2), 0, $polynomial) ^
|
|
mycrc32(substr($_, 34, $page_size - 34), 0,
|
|
$polynomial));
|
|
}
|
|
else
|
|
{
|
|
my $ck=pack("N",
|
|
mycrc32(substr($_, 4, 22), 0, $polynomial) ^
|
|
mycrc32(substr($_, 38, $page_size - 38 - 8), 0,
|
|
$polynomial));
|
|
substr($_, 0, 4) = $ck;
|
|
substr ($_, $page_size - 8, 4) = $ck;
|
|
}
|
|
syswrite(FILE, $_, $page_size)==$page_size||die "Unable to write $file\n";
|
|
}
|
|
close(FILE);
|
|
}
|