summaryrefslogtreecommitdiff
path: root/mysql-test/suite/innodb/t/innodb_buffer_pool_load_now.test
blob: baced6e9e117d053a2e47971633a05957bffe5b1 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#Want to skip this test from daily Valgrind execution
--source include/no_valgrind_without_big.inc
#
# Test for the functionality of InnoDB Buffer Pool dump/load.
#

# This case checks buffer pool dump/load works as expected
# with innodb_buffer_pool_dump_now=ON
# and innodb_buffer_pool_load_now=ON

--source include/have_innodb.inc
# include/restart_mysqld.inc does not work in embedded mode
--source include/not_embedded.inc
--source include/have_sequence.inc

--let $file = `SELECT CONCAT(@@datadir, @@global.innodb_buffer_pool_filename)`

--error 0,1
--remove_file $file

# Dump the whole buffer pool because if only a portion of it is dumped, we
# cannot be sure how many of the ib_bp_test's pages will end up in the dump.
SET GLOBAL innodb_buffer_pool_dump_pct=100;

# Create a table and populate it with some data
CREATE TABLE ib_bp_test
(a INT AUTO_INCREMENT, b VARCHAR(64), c TEXT, PRIMARY KEY (a), KEY (b, c(128)))
ENGINE=INNODB;

SELECT PAGE_NUMBER FROM information_schema.innodb_buffer_page_lru
WHERE table_name = '`test`.`ib_bp_test`';

SELECT SPACE INTO @space FROM information_schema.innodb_buffer_page_lru
WHERE table_name = '`test`.`ib_bp_test`' AND PAGE_NUMBER=3;

let SPACE=`SELECT @space`;

INSERT INTO ib_bp_test
SELECT NULL, REPEAT('b', 64), REPEAT('c', 256) FROM seq_1_to_16382;

SELECT COUNT(*) FROM information_schema.innodb_buffer_page_lru
WHERE table_name = '`test`.`ib_bp_test`';

# Dump
SET GLOBAL innodb_buffer_pool_dump_now = ON;

# Wait for the dump to complete
--disable_warnings
let $wait_condition =
  SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) dump completed at '
  FROM information_schema.global_status
  WHERE LOWER(variable_name) = 'innodb_buffer_pool_dump_status';
--enable_warnings
--source include/wait_condition.inc

# Confirm the file has been created
--file_exists $file

# Add some garbage records to the dump file
--let IBDUMPFILE = $file
perl;
my $fn = $ENV{'IBDUMPFILE'};
open(my $fh, '>>', $fn) || die "perl open($fn): $!";
print $fh "123456,0\n";
print $fh "0,123456\n";
print $fh "123456,123456\n";
close($fh);
EOF

--move_file $file $file.now

# Complete purge (and change buffer merge).
SET GLOBAL innodb_fast_shutdown=0;
--source include/shutdown_mysqld.inc

# Make sure no dump after shutdown
--error 1
--file_exists $file

--source include/start_mysqld.inc

--move_file $file.now $file

# See that we have no pages in the LRU
SELECT PAGE_NUMBER FROM information_schema.innodb_buffer_page_lru
WHERE table_name = '`test`.`ib_bp_test`';

# Load the table so that entries in the I_S table do not appear as NULL
select count(*) from ib_bp_test LIMIT 0;

# Load
SET GLOBAL innodb_buffer_pool_load_now = ON;

# Wait for the load to complete
--disable_warnings
let $wait_condition =
  SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) load completed at '
  FROM information_schema.global_status
  WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings
--source include/wait_condition.inc

# Show the status, interesting if the above timed out
--disable_warnings
--replace_regex /[0-9]{6}[[:space:]]+[0-9]{1,2}:[0-9]{2}:[0-9]{2}/TIMESTAMP_NOW/
SELECT variable_value
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings

SELECT COUNT(*) FROM information_schema.innodb_buffer_page_lru
WHERE table_name = '`test`.`ib_bp_test`';

# Add some total garbage to the dump file
--let IBDUMPFILE = $file
perl;
my $fn = $ENV{'IBDUMPFILE'};
open(my $fh, '>>', $fn) || die "perl open($fn): $!";
print $fh "abcdefg\n";
close($fh);
EOF

call mtr.add_suppression("InnoDB: Error parsing");

# Load
SET GLOBAL innodb_buffer_pool_load_now = ON;

# Wait for the load to fail
--disable_warnings
let $wait_condition =
  SELECT SUBSTR(variable_value, 1, 13) = 'Error parsing'
  FROM information_schema.global_status
  WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings
--source include/wait_condition.inc

--echo # Re-write some valid pages to the dump file, make sure the space
--echo # should be valid but all the page no should be out of bound of the file
--let IBDUMPFILE = $file
perl;
my $fn = $ENV{'IBDUMPFILE'};
my $space = $ENV{'SPACE'};
open(my $fh, '>', $fn) || die "perl open($fn): $!";
print $fh "$space,10000\n";
print $fh "$space,10001\n";
print $fh "$space,10002\n";
close($fh);
EOF

# We force the restart so that the table would be closed
--source include/restart_mysqld.inc

# Load directly, without accessing the table first
SET GLOBAL innodb_buffer_pool_load_now = ON;

# Wait for the load to complete
--disable_warnings
let $wait_condition =
  SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) load completed at '
  FROM information_schema.global_status
  WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings
--source include/wait_condition.inc

# Show the status, interesting if the above timed out
--disable_warnings
--replace_regex /[0-9]{6}[[:space:]]+[0-9]{1,2}:[0-9]{2}:[0-9]{2}/TIMESTAMP_NOW/
SELECT variable_value
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings

DROP TABLE ib_bp_test;
SET GLOBAL innodb_buffer_pool_dump_pct=default;

--echo #
--echo # Bug#21371070 [ERROR] INNODB: CANNOT ALLOCATE 0 BYTES: SUCCESS
--echo #

--let $file = `SELECT CONCAT(@@datadir, @@global.innodb_buffer_pool_filename)`

# Remove the buffer pool file that exists already
--error 0,1
--remove_file $file

# Create an empty buffer pool file
write_file $file;
EOF

SET GLOBAL innodb_buffer_pool_load_now = ON;