mirror of
https://github.com/MariaDB/server.git
synced 2025-12-03 05:41:09 +03:00
MDEV-15641 InnoDB crash while committing table-rebuilding ALTER TABLE
Problem: ======== There is a possibility that there can be more concurrent DMLs While the alter table thread is waiting for upgrading to MDL_EXCLUSIVE before commit phase. In commit phase, InnoDB acquires dict_operation_lock and it already holds MDL_EXCLUSIVE on the table. After that, InnoDB applies the concurrent DML logs in commit phase. This could lead to blocking of the following things: 1) DML on the particular table (due to MDL_EXCLUSIVE on the table) 2) InnoDB DDLs (due to dict_operation_lock) 3) Purge thread, stats thread, the master thread (due to dict_operation_lock) Fix: ==== Apply the concurrent DML logs in commit phase but before acquiring dict_operation_lock in commit phase. It makes sure that (2), (3) can't be blocked for longer time.
This commit is contained in:
49
mysql-test/suite/innodb/r/alter_large_dml.result
Normal file
49
mysql-test/suite/innodb/r/alter_large_dml.result
Normal file
@@ -0,0 +1,49 @@
|
||||
CREATE TABLE t1(f1 char(200), f2 char(200), f3 char(200),
|
||||
f4 char(200), f5 char(200), f6 char(200),
|
||||
f7 char(200), f8 char(200))ENGINE=InnoDB;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
SET DEBUG_SYNC = 'inplace_after_index_build SIGNAL rebuilt WAIT_FOR dml_pause';
|
||||
SET DEBUG_SYNC = 'alter_table_inplace_before_lock_upgrade SIGNAL dml_restart WAIT_FOR dml_done';
|
||||
SET DEBUG_SYNC = 'row_log_table_apply2_before SIGNAL ddl_start';
|
||||
ALTER TABLE t1 FORCE, ALGORITHM=INPLACE;
|
||||
connect con1,localhost,root,,test;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR rebuilt';
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
SET DEBUG_SYNC = 'now SIGNAL dml_pause';
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR dml_restart';
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT '','','','','','','','' FROM seq_1_to_16384;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
ROLLBACK;
|
||||
SET DEBUG_SYNC = 'now SIGNAL dml_done';
|
||||
connect con2, localhost,root,,test;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR ddl_start';
|
||||
CREATE TABLE t2(f1 INT NOT NULL)ENGINE=InnoDB;
|
||||
connection default;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` char(200) DEFAULT NULL,
|
||||
`f2` char(200) DEFAULT NULL,
|
||||
`f3` char(200) DEFAULT NULL,
|
||||
`f4` char(200) DEFAULT NULL,
|
||||
`f5` char(200) DEFAULT NULL,
|
||||
`f6` char(200) DEFAULT NULL,
|
||||
`f7` char(200) DEFAULT NULL,
|
||||
`f8` char(200) DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
16384
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
DROP TABLE t1, t2;
|
||||
Reference in New Issue
Block a user