mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
efc70da5fd
The background drop table queue in InnoDB is a work-around for cases where the SQL layer is requesting DDL on tables on which transactional locks exist. One such case are XA transactions. Our test case exploits the fact that the recovery of XA PREPARE transactions will only resurrect InnoDB table locks, but not MDL that should block any concurrent DDL. srv_shutdown_t: Introduce the srv_shutdown_state=SRV_SHUTDOWN_INITIATED for the initial part of shutdown, to wait for the background drop table queue to be emptied. srv_shutdown_bg_undo_sources(): Assign srv_shutdown_state=SRV_SHUTDOWN_INITIATED before waiting for the background drop table queue to be emptied. row_drop_tables_for_mysql_in_background(): On slow shutdown, if no active transactions exist (excluding ones that are in XA PREPARE state), skip any tables on which locks exist. row_drop_table_for_mysql(): Do not unnecessarily attempt to drop InnoDB persistent statistics for tables that have already been added to the background drop table queue. row_mysql_close(): Relax an assertion, and free all memory even if innodb_force_recovery=2 would prevent the background drop table queue from being emptied.
58 lines
1.6 KiB
Text
58 lines
1.6 KiB
Text
--source include/have_innodb.inc
|
|
# Embedded server does not support restarting.
|
|
--source include/not_embedded.inc
|
|
|
|
# MDEV-8841 - close tables opened by previous tests,
|
|
# so they don't get marked crashed when the server gets crashed
|
|
--disable_query_log
|
|
call mtr.add_suppression("Found [12] prepared XA transactions");
|
|
FLUSH TABLES;
|
|
--enable_query_log
|
|
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1);
|
|
connect (con1,localhost,root);
|
|
XA START 'x'; UPDATE t1 set a=2; XA END 'x'; XA PREPARE 'x';
|
|
connect (con2,localhost,root);
|
|
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
|
XA START 'y'; INSERT INTO t2 VALUES (1); XA END 'y'; XA PREPARE 'y';
|
|
connection default;
|
|
|
|
# innodb_force_recovery=2 prevents the purge and tests that the fix of
|
|
# MDEV-13606 XA PREPARE transactions should survive innodb_force_recovery=1 or 2
|
|
# is present.
|
|
--let $restart_parameters= --innodb-force-recovery=2
|
|
--let $shutdown_timeout=0
|
|
--source include/restart_mysqld.inc
|
|
--let $restart_parameters=
|
|
--let $shutdown_timeout=
|
|
|
|
disconnect con1;
|
|
disconnect con2;
|
|
connect (con1,localhost,root);
|
|
--send SELECT * FROM t1 LOCK IN SHARE MODE
|
|
|
|
connection default;
|
|
let $wait_condition=
|
|
select count(*) = 1 from information_schema.processlist
|
|
where state = 'Sending data' and
|
|
info = 'SELECT * FROM t1 LOCK IN SHARE MODE';
|
|
--source include/wait_condition.inc
|
|
|
|
DROP TABLE t2;
|
|
|
|
--source include/restart_mysqld.inc
|
|
|
|
disconnect con1;
|
|
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
SELECT * FROM t1;
|
|
XA ROLLBACK 'x';
|
|
SELECT * FROM t1;
|
|
|
|
DROP TABLE t1;
|
|
|
|
SET GLOBAL innodb_fast_shutdown=0;
|
|
--source include/restart_mysqld.inc
|
|
|
|
XA ROLLBACK 'y';
|