mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
fc48c8ff4c
The issue was: T1, a parallel slave worker thread, is waiting for another worker thread to commit. While waiting, it has the MDL_BACKUP_COMMIT lock. T2, working for mariabackup, is doing BACKUP STAGE BLOCK_COMMIT and blocks all commits. This causes a deadlock as the thread T1 is waiting for can't commit. Fixed by moving locking of MDL_BACKUP_COMMIT from ha_commit_trans() to commit_one_phase_2() Other things: - Added a new argument to ha_comit_one_phase() to signal if the transaction was a write transaction. - Ensured that ha_maria::implicit_commit() is always called under MDL_BACKUP_COMMIT. This code is not needed in 10.5 - Ensure that MDL_Request values 'type' and 'ticket' are always initialized. This makes it easier to check the state of the MDL_Request. - Moved thd->store_globals() earlier in handle_rpl_parallel_thread() as thd->init_for_queries() could use a MDL that could crash if store_globals where not called. - Don't call ha_enable_transactions() in THD::init_for_queries() as this is both slow (uses MDL locks) and not needed.
40 lines
1.1 KiB
Text
40 lines
1.1 KiB
Text
include/master-slave.inc
|
|
[connection master]
|
|
#
|
|
# MDEV-21953: deadlock between BACKUP STAGE BLOCK_COMMIT and parallel
|
|
# replication
|
|
#
|
|
connection master;
|
|
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE = innodb;
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads;
|
|
SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode;
|
|
SET @@global.slave_parallel_threads= 2;
|
|
SET @@global.slave_parallel_mode = 'optimistic';
|
|
connection master;
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t1 VALUES (2);
|
|
connect aux_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (1);
|
|
connection slave;
|
|
include/start_slave.inc
|
|
connection aux_slave;
|
|
connect backup_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
|
|
BACKUP STAGE START;
|
|
BACKUP STAGE BLOCK_COMMIT;
|
|
connection aux_slave;
|
|
ROLLBACK;
|
|
connection backup_slave;
|
|
BACKUP STAGE END;
|
|
connection slave;
|
|
include/diff_tables.inc [master:t1,slave:t1]
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
SET @@global.slave_parallel_threads= @old_parallel_threads;
|
|
SET @@global.slave_parallel_mode = @old_parallel_mode;
|
|
include/start_slave.inc
|
|
connection server_1;
|
|
DROP TABLE t1;
|
|
include/rpl_end.inc
|