mirror of
https://github.com/MariaDB/server.git
synced 2025-02-07 06:12:18 +01:00
4a1ded61a4
- 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.
74 lines
1.9 KiB
Text
74 lines
1.9 KiB
Text
--source include/have_innodb.inc
|
|
--source include/not_embedded.inc
|
|
--source include/no_valgrind_without_big.inc
|
|
--source include/have_sequence.inc
|
|
|
|
# Flush any open myisam tables from previous tests
|
|
FLUSH TABLES;
|
|
call mtr.add_suppression("Found 1 prepared XA transactions");
|
|
call mtr.add_suppression("InnoDB: Cannot free the unused segments in system tablespace because a previous shutdown was not with innodb_fast_shutdown=0 or XA PREPARE transactions exist");
|
|
|
|
--echo #
|
|
--echo # MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup
|
|
--echo # while rolling back recovered incomplete transactions
|
|
--echo #
|
|
|
|
let $size = 100;
|
|
let $trx = 8;
|
|
|
|
let $c = $trx;
|
|
connect (con$c,localhost,root,,);
|
|
eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
|
|
XA START 'x';
|
|
eval INSERT INTO t$c (a) SELECT NULL FROM seq_1_to_$size;
|
|
eval UPDATE t$c SET a=a+$size, b=a;
|
|
eval DELETE FROM t$c;
|
|
XA END 'x';
|
|
XA PREPARE 'x';
|
|
dec $c;
|
|
while ($c)
|
|
{
|
|
connect (con$c,localhost,root,,);
|
|
eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
|
|
BEGIN;
|
|
eval INSERT INTO t$c (a) SELECT NULL FROM seq_1_to_$size;
|
|
eval UPDATE t$c SET a=a+$size, b=a;
|
|
eval DELETE FROM t$c;
|
|
dec $c;
|
|
}
|
|
|
|
INSERT INTO t1(a) SELECT NULL FROM seq_1_to_1600;
|
|
|
|
--connection default
|
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
|
CREATE TABLE MDEV_29559 (a TINYINT UNSIGNED PRIMARY KEY, KEY(a)) ENGINE=InnoDB;
|
|
INSERT INTO MDEV_29559 VALUES (0x69);
|
|
|
|
FLUSH TABLES;
|
|
|
|
--let $shutdown_timeout=0
|
|
--source include/restart_mysqld.inc
|
|
--let $shutdown_timeout=60
|
|
|
|
# Perform a slow shutdown in order to roll back all recovered transactions
|
|
# and to avoid locking conflicts with the DROP TABLE below.
|
|
XA RECOVER;
|
|
--disable_query_log
|
|
SET GLOBAL innodb_fast_shutdown=0;
|
|
--source include/restart_mysqld.inc
|
|
|
|
--disable_query_log
|
|
let $c = $trx;
|
|
disconnect con$c;
|
|
XA ROLLBACK 'x';
|
|
eval DROP TABLE t$c;
|
|
dec $c;
|
|
while ($c)
|
|
{
|
|
disconnect con$c;
|
|
eval DROP TABLE t$c;
|
|
dec $c;
|
|
}
|
|
--enable_query_log
|
|
|
|
DROP TABLE MDEV_29559;
|