mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
64900e3d7c
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.
53 lines
1.6 KiB
Text
53 lines
1.6 KiB
Text
--source include/big_test.inc
|
|
--source include/have_innodb.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/have_sequence.inc
|
|
|
|
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';
|
|
--send
|
|
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;
|
|
reap;
|
|
SHOW CREATE TABLE t1;
|
|
|
|
SELECT COUNT(*) FROM t1;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP TABLE t1, t2;
|