mirror of
https://github.com/MariaDB/server.git
synced 2025-02-07 06:12:18 +01:00
![Thirunarayanan Balathandayuthapani](/assets/img/avatar_default.png)
- InnoDB fails to shrink the system tablespace when it contains the leaked undo log pages caused by MDEV-30671. - InnoDB does free the unused segment in system tablespace before shrinking the tablespace. InnoDB fails to free the unused segment if XA PREPARE transaction exist or if the previous shutdown was not with innodb_fast_shutdown=0 inode_info: Structure to store the inode page and offsets. fil_space_t::garbage_collect(): Frees the system tablespace unused segment fsp_get_sys_used_segment(): Iterates through all default file segment and index segment present in system tablespace. trx_sys_t::is_xa_exist(): Returns true if the XA transaction exist in the undo logs fseg_inode_free(): Frees the extents, fragment pages for the given index node and ignores any error similar to trx_purge_free_segment() trx_sys_t::reset_page(): Retain the TRX_SYS_FSEG_HEADER value in trx_sys page while resetting the page.
119 lines
5.6 KiB
Text
119 lines
5.6 KiB
Text
--source include/have_innodb.inc
|
|
--source include/have_sequence.inc
|
|
--source include/have_debug.inc
|
|
--source include/not_embedded.inc
|
|
|
|
call mtr.add_suppression("InnoDB: Cannot free the unused segments in system tablespace because a previous shutdown was not with innodb_fast_shutdown=0");
|
|
call mtr.add_suppression("InnoDB: :autoshrink failed to read the used segment");
|
|
call mtr.add_suppression("InnoDB: :autoshrink failed due to .* in FSP_SEG_INODES_FULL list");
|
|
call mtr.add_suppression("InnoDB: :autoshrink failed due to .* in FSP_SEG_INODES_FREE list");
|
|
call mtr.add_suppression("InnoDB: :autoshrink failed to free the segment");
|
|
call mtr.add_suppression("Found .* prepared XA transactions");
|
|
SELECT NAME, FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE SPACE = 0;
|
|
|
|
SET GLOBAL INNODB_FILE_PER_TABLE=0;
|
|
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)STATS_PERSISTENT=0, ENGINE=InnoDB;
|
|
XA START 'x';
|
|
insert into t1 values (1, 1);
|
|
XA END 'x';
|
|
XA PREPARE 'x';
|
|
set GLOBAL innodb_fast_shutdown=0;
|
|
--source include/restart_mysqld.inc
|
|
--echo # Fail to free the segment due to XA PREPARE transaction
|
|
let SEARCH_PATTERN= InnoDB: Cannot free the unused segments in system tablespace because a previous shutdown was not with innodb_fast_shutdown=0;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
XA COMMIT 'x';
|
|
DROP TABLE t1;
|
|
|
|
let $restart_parameters=--debug_dbug=d,undo_segment_leak;
|
|
--source include/restart_mysqld.inc
|
|
SET GLOBAL INNODB_FILE_PER_TABLE=0;
|
|
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)STATS_PERSISTENT=0, ENGINE=InnoDB;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
|
UPDATE t1 SET f1 = f1 + 1 WHERE f1 > 1000;
|
|
UPDATE t1 SET f2 = f2 + 1 WHERE f1 > 1000;
|
|
UPDATE t1 SET f1 = f2 + 1 WHERE f1 > 1000;
|
|
UPDATE t1 SET f2 = f1 + 1 WHERE f1 > 1000;
|
|
DELETE FROM t1;
|
|
DROP TABLE t1;
|
|
SELECT NAME, FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE SPACE = 0;
|
|
let $shutdown_timeout=0;
|
|
let $restart_parameters=--debug_dbug=d,unused_undo_free_fail_1;
|
|
--source include/restart_mysqld.inc
|
|
|
|
let $shutdown_timeout=;
|
|
--echo # Fail to free the segment due to previous shutdown
|
|
--let SEARCH_PATTERN= InnoDB: Cannot free the unused segments in system tablespace because a previous shutdown was not with innodb_fast_shutdown=0
|
|
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
SELECT NAME, FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE SPACE = 0;
|
|
SET GLOBAL innodb_fast_shutdown= 0;
|
|
|
|
--echo # Fail to free the segment while finding the used segments
|
|
let $restart_parameters=--debug_dbug=d,unused_undo_free_fail_2;
|
|
--source include/restart_mysqld.inc
|
|
SELECT IF(file_size>10485760,'ok',file_size) FROM information_schema.innodb_sys_tablespaces WHERE space=0;
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink failed to read the used segment;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink failed due to .* in FSP_SEG_INODES_FULL list;
|
|
--source include/search_pattern_in_file.inc
|
|
SET GLOBAL innodb_fast_shutdown= 0;
|
|
|
|
--echo # Fail to free the segment while finding the used segments
|
|
let $restart_parameters=--debug_dbug=d,unused_undo_free_fail_3;
|
|
--source include/restart_mysqld.inc
|
|
SELECT IF(file_size>10485760,'ok',file_size) FROM information_schema.innodb_sys_tablespaces WHERE space=0;
|
|
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink failed due to .* in FSP_SEG_INODES_FREE list;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
SET GLOBAL innodb_fast_shutdown= 0;
|
|
|
|
--echo # Fail to free the segment while freeing the unused segments
|
|
let $restart_parameters=--debug_dbug=d,unused_undo_free_fail_4;
|
|
--source include/restart_mysqld.inc
|
|
SELECT IF(file_size>10485760,'ok',file_size) FROM information_schema.innodb_sys_tablespaces WHERE space=0;
|
|
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink failed to free the segment .* in page .*;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
SET GLOBAL innodb_fast_shutdown= 0;
|
|
|
|
--echo # Fail to free the segment while freeing the used segments
|
|
let $restart_parameters=--debug_dbug=d,unused_undo_free_fail_5;
|
|
--source include/restart_mysqld.inc
|
|
SELECT IF(file_size>10485760,'ok',file_size) FROM information_schema.innodb_sys_tablespaces WHERE space=0;
|
|
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink failed to free the segment .* in page .*;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
SET GLOBAL innodb_fast_shutdown= 0;
|
|
let $restart_parameters=;
|
|
--source include/restart_mysqld.inc
|
|
SELECT NAME, FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE SPACE = 0;
|
|
|
|
--echo # Fail to reset the TRX_SYS_FSEG_HEADER during undo tablespace
|
|
--echo # reinitialization. garbage_collect() shouldn't free the
|
|
--echo # TRX_SYS_FSEG_HEADER index node
|
|
set global innodb_fast_shutdown=0;
|
|
let $restart_parameters=--innodb_undo_tablespaces=2 --debug_dbug=d,sys_fseg_header_fail;
|
|
--source include/restart_mysqld.inc
|
|
let SEARCH_PATTERN= InnoDB: :autoshrink freed the segment .* in page .*;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
--source include/search_pattern_in_file.inc
|
|
let $restart_parameters=;
|
|
set global innodb_fast_shutdown=0;
|
|
--source include/restart_mysqld.inc
|
|
SELECT NAME, FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE SPACE = 0;
|