mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
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.
50 lines
1.8 KiB
Plaintext
50 lines
1.8 KiB
Plaintext
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;
|