summaryrefslogtreecommitdiff
path: root/mysql-test/suite/innodb/t/log_data_file_size.test
blob: fe75b9ab236a4717bd31683232b2a1f729873c4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
--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(<FILE>) { 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;