1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-13626: Import and adjust buffer pool resizing tests from MySQL 5.7

Adapt from 10.2: git cherry-pick bfb5e1c3f0

buf_pool_t::chunk_t::create(), buf_pool_t::resize():
Restore or simplify the debug instrumentation.

buf_resize_callback(): Add DBUG_ENTER/DBUG_VOID_RETURN so that
the DBUG_EXECUTE_IF in buf_pool_t::resize() can be triggered.
This commit is contained in:
Marko Mäkelä
2020-03-19 11:17:20 +02:00
parent 007bb37aff
commit 6297a1026d
10 changed files with 634 additions and 7 deletions

View File

@ -0,0 +1,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;