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

MDEV-8139 Fix scrubbing tests

encryption.innodb_scrub: Clean up. Make it also cover ROW_FORMAT=COMPRESSED,
removing the need for encryption.innodb_scrub_compressed.
Add a FIXME comment saying that we should create a secondary index, to
demonstrate that also undo log pages get scrubbed. Currently that is
not working!

Also clean up encryption.innodb_scrub_background, but keep it disabled,
because the background scrubbing does not work reliably.

Fix both tests so that if something is not scrubbed, the test will be
aborted, so that the data files will be preserved. Allow the tests to
run on Windows as well.
This commit is contained in:
Marko Mäkelä
2017-01-04 20:49:13 +02:00
parent 719321e78e
commit ffb38c9771
9 changed files with 398 additions and 647 deletions

View File

@ -1,13 +1,9 @@
-- source include/have_innodb.inc
-- source include/not_embedded.inc
-- source include/have_example_key_management_plugin.inc
-- source include/not_windows.inc
let $MYSQLD_DATADIR=`select @@datadir`;
let ib1_IBD = $MYSQLD_DATADIR/ibdata1;
let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd;
let t2_IBD = $MYSQLD_DATADIR/test/t2.ibd;
let t3_IBD = $MYSQLD_DATADIR/test/t3.ibd;
let INNODB_PAGE_SIZE= `select @@innodb_page_size`;
--echo #
--echo # immediate scrubbing is off
@ -18,80 +14,67 @@ show variables like 'innodb_%scrub_data%';
-- echo # make sure spaces are checked quickly
SET GLOBAL innodb_background_scrub_data_check_interval=1;
create table snapshot_status engine = myisam
select * from information_schema.global_status
where variable_name like 'innodb_scrub%';
let $rowcount=500;
let $formatno = 1;
let $maxformatno= 4;
let $formatno= $maxformatno;
let $tableformat= (
a int auto_increment primary key,
b varchar(256),
c text,
index(b)) engine = innodb row_format;
while ($formatno)
{
let $format = `select case $formatno
when 1 then 'dynamic'
when 2 then 'redundant'
when 3 then 'compact'
when 4 then 'compressed'
end`;
dec $formatno;
let $format = `select case $formatno
when 0 then 'dynamic'
when 1 then 'redundant'
when 2 then 'compact'
when 3 then 'compressed'
end`;
truncate table snapshot_status;
insert into snapshot_status
select * from information_schema.global_status
where variable_name like 'innodb_scrub%';
-- echo #
-- echo # Test delete of records
-- echo #
eval create table t1 (
a int auto_increment primary key,
b varchar(256),
c text, index(b)) engine = innodb row_format=$format;
let $t= delete_$formatno;
eval create table $t $tableformat=$format;
let $numinserts = $rowcount;
-- echo # Populate table with rows
--disable_query_log
begin;
while ($numinserts)
{
dec $numinserts;
insert into t1(b,c) values ('bicycle', repeat('repairman', 1000));
eval insert into $t(b,c) values ('unicycle', repeat('wonderwoman', 1000));
}
commit;
--enable_query_log
delete from t1;
eval delete from $t;
-- echo #
-- echo # Test delete+rollback+delete
-- echo #
let $t= delete_rollback_delete_$formatno;
eval create table t2 (
a int auto_increment primary key,
b varchar(256),
c text, index(b)) engine = innodb row_format=$format;
eval create table $t $tableformat=$format;
let $numinserts = $rowcount;
-- echo # Populate table with rows
--disable_query_log
begin;
while ($numinserts)
{
dec $numinserts;
insert into t2(b,c) values ('bicycle', repeat('repairman', 1000));
eval insert into $t(b,c) values ('bicycle', repeat('repairman', 1000));
}
commit;
--enable_query_log
begin;
delete from t2;
eval delete from $t;
rollback;
delete from t2;
eval delete from $t;
-- echo #
-- echo # Test insert+rollback
-- echo #
let $t= insert_rollback_$formatno;
eval create table t3 (
a int auto_increment primary key,
b varchar(256),
c text, index(b)) engine = innodb row_format=$format;
eval create table $t $tableformat=$format;
let $numinserts = $rowcount;
-- echo # Populate table with rows
@ -100,11 +83,12 @@ begin;
while ($numinserts)
{
dec $numinserts;
insert into t3(b,c) values ('bicycle', repeat('repairman', 1000));
eval insert into $t(b,c) values ('tricycle', repeat('superhuman', 1000));
}
--enable_query_log
rollback;
}
-- echo # start scrubbing threads
SET GLOBAL innodb_encryption_threads=5;
@ -130,35 +114,57 @@ if (!$success)
-- die Timeout waiting for background threads
}
-- echo # Success!
-- echo # stop scrubbing threads
SET GLOBAL innodb_encryption_threads=0;
SET GLOBAL innodb_fast_shutdown=0;
-- source include/shutdown_mysqld.inc
-- echo # restart mysqld so that all pages are flushed
-- source include/restart_mysqld.inc
-- echo # read all rows from table
-- disable_result_log
select * from t1;
-- enable_result_log
let SEARCH_ABORT= FOUND;
let SEARCH_PATTERN= (un|b|tr)icycle|(repair|breakhu|wonderwo)man;
let SEARCH_RANGE= 12582912;
let SEARCH_FILE= $MYSQLD_DATADIR/ibdata1;
-- echo # $format: delete: grep -c bicycle t1.ibd
-- exec grep -c bicycle $t1_IBD || true
-- echo # $format: delete: grep -c repairman t1.ibd
-- exec grep -c repairman $t1_IBD || true
# We may randomly find copies of unscrubbed pages in the doublewrite buffer.
# Let us scrub the doublewrite buffer ourselves.
perl;
use Fcntl 'SEEK_SET';
my $page_size = $ENV{INNODB_PAGE_SIZE};
open(FILE, "+<", "$ENV{SEARCH_FILE}") or die "cannot open: $!\n";
seek(FILE, $page_size * 64, SEEK_SET) or die "cannot seek: $!\n";
print(FILE chr(0) x ($page_size * 128)) or die "cannot write: $!\n";
close FILE or die "cannot close: $!\n";;
EOF
-- echo # $format: delete rollback: grep -c bicycle t2.ibd
-- exec grep -c bicycle $t2_IBD || true
-- echo # $format: delete rollback: grep -c repairman t2.ibd
-- exec grep -c repairman $t2_IBD || true
-- source include/search_pattern_in_file.inc
-- echo # $format: insert rollback: grep -c bicycle t3.ibd
-- exec grep -c bicycle $t3_IBD || true
-- echo # $format: insert rollback: grep -c repairman t3.ibd
-- exec grep -c repairman $t3_IBD || true
let $formatno= $maxformatno;
while ($formatno)
{
dec $formatno;
drop table t1, t2, t3;
let $t= delete_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
let $t= delete_rollback_delete_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
let $t= insert_rollback_$formatno.ibd;
let SEARCH_FILE= $MYSQLD_DATADIR/test/$t;
-- echo # $t
-- source include/search_pattern_in_file.inc
}
-- source include/start_mysqld.inc
let $formatno= $maxformatno;
while ($formatno)
{
dec $formatno;
let $t= delete_$formatno, delete_rollback_delete_$formatno, insert_rollback_$formatno;
eval check table $t;
eval drop table $t;
}
show variables like 'innodb_%scrub_data%';
drop table snapshot_status;