mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-8139 Fix Scrubbing
fil_space_t::freed_ranges: Store ranges of freed page numbers. fil_space_t::last_freed_lsn: Store the most recent LSN of freeing a page. fil_space_t::freed_mutex: Protects freed_ranges, last_freed_lsn. fil_space_create(): Initialize the freed_range mutex. fil_space_free_low(): Frees the freed_range mutex. range_set: Ranges of page numbers. buf_page_create(): Removes the page from freed_ranges when page is being reused. btr_free_root(): Remove the PAGE_INDEX_ID invalidation. Because btr_free_root() and dict_drop_index_tree() are executed in the same atomic mini-transaction, there is no need to invalidate the root page. buf_release_freed_page(): Split from buf_flush_freed_page(). Skip any I/O buf_flush_freed_pages(): Get the freed ranges from tablespace and Write punch-hole or zeroes of the freed ranges. buf_flush_try_neighbors(): Handles the flushing of freed ranges. mtr_t::freed_pages: Variable to store the list of freed pages. mtr_t::add_freed_pages(): To add freed pages. mtr_t::clear_freed_pages(): To clear the freed pages. mtr_t::m_freed_in_system_tablespace: Variable to indicate whether page has been freed in system tablespace. mtr_t::m_trim_pages: Variable to indicate whether the space has been trimmed. mtr_t::commit(): Add the freed page and update the last freed lsn in the tablespace and clear the tablespace freed range if space is trimmed. file_name_t::freed_pages: Store the freed pages during recovery. file_name_t::add_freed_page(), file_name_t::remove_freed_page(): To add and remove freed page during recovery. store_freed_or_init_rec(): Store or remove the freed pages while encountering FREE_PAGE or INIT_PAGE redo log record. recv_init_crash_recovery_spaces(): Add the freed page encountered during recovery to respective tablespace.
This commit is contained in:
@@ -1,138 +0,0 @@
|
||||
create table snapshot_status engine = myisam
|
||||
select * from information_schema.global_status
|
||||
where variable_name like 'innodb_scrub%';
|
||||
# MDEV-8139 Fix scrubbing tests
|
||||
# FIXME: Add index(b) to each table; ensure that undo logs are scrubbed.
|
||||
create table delete_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compressed;
|
||||
delete from delete_3;
|
||||
create table delete_rollback_delete_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compressed;
|
||||
begin;
|
||||
delete from delete_rollback_delete_3;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_3;
|
||||
create table insert_rollback_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compressed;
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compact;
|
||||
delete from delete_2;
|
||||
create table delete_rollback_delete_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compact;
|
||||
begin;
|
||||
delete from delete_rollback_delete_2;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_2;
|
||||
create table insert_rollback_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=compact;
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=redundant;
|
||||
delete from delete_1;
|
||||
create table delete_rollback_delete_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=redundant;
|
||||
begin;
|
||||
delete from delete_rollback_delete_1;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_1;
|
||||
create table insert_rollback_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=redundant;
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=dynamic;
|
||||
delete from delete_0;
|
||||
create table delete_rollback_delete_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=dynamic;
|
||||
begin;
|
||||
delete from delete_rollback_delete_0;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_0;
|
||||
create table insert_rollback_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text) engine = innodb row_format=dynamic;
|
||||
begin;
|
||||
rollback;
|
||||
SET GLOBAL innodb_fast_shutdown=0;
|
||||
# delete_3.ibd
|
||||
# delete_rollback_delete_3.ibd
|
||||
# insert_rollback_3.ibd
|
||||
# delete_2.ibd
|
||||
# delete_rollback_delete_2.ibd
|
||||
# insert_rollback_2.ibd
|
||||
# delete_1.ibd
|
||||
# delete_rollback_delete_1.ibd
|
||||
# insert_rollback_1.ibd
|
||||
# delete_0.ibd
|
||||
# delete_rollback_delete_0.ibd
|
||||
# insert_rollback_0.ibd
|
||||
check table delete_3, delete_rollback_delete_3, insert_rollback_3;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_3 check status OK
|
||||
test.delete_rollback_delete_3 check status OK
|
||||
test.insert_rollback_3 check status OK
|
||||
drop table delete_3, delete_rollback_delete_3, insert_rollback_3;
|
||||
check table delete_2, delete_rollback_delete_2, insert_rollback_2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_2 check status OK
|
||||
test.delete_rollback_delete_2 check status OK
|
||||
test.insert_rollback_2 check status OK
|
||||
drop table delete_2, delete_rollback_delete_2, insert_rollback_2;
|
||||
check table delete_1, delete_rollback_delete_1, insert_rollback_1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_1 check status OK
|
||||
test.delete_rollback_delete_1 check status OK
|
||||
test.insert_rollback_1 check status OK
|
||||
drop table delete_1, delete_rollback_delete_1, insert_rollback_1;
|
||||
check table delete_0, delete_rollback_delete_0, insert_rollback_0;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_0 check status OK
|
||||
test.delete_rollback_delete_0 check status OK
|
||||
test.insert_rollback_0 check status OK
|
||||
drop table delete_0, delete_rollback_delete_0, insert_rollback_0;
|
||||
show variables like 'innodb_%scrub_data%';
|
||||
Variable_name Value
|
||||
innodb_background_scrub_data_check_interval 3600
|
||||
innodb_background_scrub_data_compressed OFF
|
||||
innodb_background_scrub_data_interval 604800
|
||||
innodb_background_scrub_data_uncompressed OFF
|
||||
innodb_immediate_scrub_data_uncompressed ON
|
||||
# verify that this test have not caused any background scrubbing
|
||||
select ss.variable_name, gs.variable_value - ss.variable_value as variable_value
|
||||
from snapshot_status ss,
|
||||
information_schema.global_status gs
|
||||
where ss.variable_name = gs.variable_name;
|
||||
variable_name variable_value
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_REORGANIZATIONS 0
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_SPLITS 0
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_SPLIT_FAILURES_MISSING_INDEX 0
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_SPLIT_FAILURES_OUT_OF_FILESPACE 0
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_SPLIT_FAILURES_UNDERFLOW 0
|
||||
INNODB_SCRUB_BACKGROUND_PAGE_SPLIT_FAILURES_UNKNOWN 0
|
||||
drop table snapshot_status;
|
@@ -1,160 +0,0 @@
|
||||
#
|
||||
# immediate scrubbing is off
|
||||
# background scrubbing is on
|
||||
#
|
||||
show variables like 'innodb_%scrub_data%';
|
||||
Variable_name Value
|
||||
innodb_background_scrub_data_check_interval 3600
|
||||
innodb_background_scrub_data_compressed ON
|
||||
innodb_background_scrub_data_interval 604800
|
||||
innodb_background_scrub_data_uncompressed ON
|
||||
innodb_immediate_scrub_data_uncompressed OFF
|
||||
# make sure spaces are checked quickly
|
||||
SET GLOBAL innodb_background_scrub_data_check_interval=1;
|
||||
create table delete_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compressed;
|
||||
# Populate table with rows
|
||||
delete from delete_3;
|
||||
create table delete_rollback_delete_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compressed;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
delete from delete_rollback_delete_3;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_3;
|
||||
create table insert_rollback_3 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compressed;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compact;
|
||||
# Populate table with rows
|
||||
delete from delete_2;
|
||||
create table delete_rollback_delete_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compact;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
delete from delete_rollback_delete_2;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_2;
|
||||
create table insert_rollback_2 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=compact;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=redundant;
|
||||
# Populate table with rows
|
||||
delete from delete_1;
|
||||
create table delete_rollback_delete_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=redundant;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
delete from delete_rollback_delete_1;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_1;
|
||||
create table insert_rollback_1 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=redundant;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
rollback;
|
||||
create table delete_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=dynamic;
|
||||
# Populate table with rows
|
||||
delete from delete_0;
|
||||
create table delete_rollback_delete_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=dynamic;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
delete from delete_rollback_delete_0;
|
||||
rollback;
|
||||
delete from delete_rollback_delete_0;
|
||||
create table insert_rollback_0 (
|
||||
a int auto_increment primary key,
|
||||
b varchar(256),
|
||||
c text,
|
||||
index(b)) engine = innodb row_format=dynamic;
|
||||
# Populate table with rows
|
||||
begin;
|
||||
rollback;
|
||||
# start scrubbing threads
|
||||
SET GLOBAL innodb_encryption_threads=5;
|
||||
# Wait max 10 min for scrubbing
|
||||
SET GLOBAL innodb_fast_shutdown=0;
|
||||
# delete_3.ibd
|
||||
# delete_rollback_delete_3.ibd
|
||||
# insert_rollback_3.ibd
|
||||
# delete_2.ibd
|
||||
# delete_rollback_delete_2.ibd
|
||||
# insert_rollback_2.ibd
|
||||
# delete_1.ibd
|
||||
# delete_rollback_delete_1.ibd
|
||||
# insert_rollback_1.ibd
|
||||
# delete_0.ibd
|
||||
# delete_rollback_delete_0.ibd
|
||||
# insert_rollback_0.ibd
|
||||
check table delete_3, delete_rollback_delete_3, insert_rollback_3;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_3 check status OK
|
||||
test.delete_rollback_delete_3 check status OK
|
||||
test.insert_rollback_3 check status OK
|
||||
drop table delete_3, delete_rollback_delete_3, insert_rollback_3;
|
||||
check table delete_2, delete_rollback_delete_2, insert_rollback_2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_2 check status OK
|
||||
test.delete_rollback_delete_2 check status OK
|
||||
test.insert_rollback_2 check status OK
|
||||
drop table delete_2, delete_rollback_delete_2, insert_rollback_2;
|
||||
check table delete_1, delete_rollback_delete_1, insert_rollback_1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_1 check status OK
|
||||
test.delete_rollback_delete_1 check status OK
|
||||
test.insert_rollback_1 check status OK
|
||||
drop table delete_1, delete_rollback_delete_1, insert_rollback_1;
|
||||
check table delete_0, delete_rollback_delete_0, insert_rollback_0;
|
||||
Table Op Msg_type Msg_text
|
||||
test.delete_0 check status OK
|
||||
test.delete_rollback_delete_0 check status OK
|
||||
test.insert_rollback_0 check status OK
|
||||
drop table delete_0, delete_rollback_delete_0, insert_rollback_0;
|
||||
show variables like 'innodb_%scrub_data%';
|
||||
Variable_name Value
|
||||
innodb_background_scrub_data_check_interval 3600
|
||||
innodb_background_scrub_data_compressed ON
|
||||
innodb_background_scrub_data_interval 604800
|
||||
innodb_background_scrub_data_uncompressed ON
|
||||
innodb_immediate_scrub_data_uncompressed OFF
|
Reference in New Issue
Block a user