mirror of
https://github.com/MariaDB/server.git
synced 2025-02-04 21:02:17 +01:00
107 lines
3 KiB
Text
107 lines
3 KiB
Text
--source include/have_innodb.inc
|
|
# The test is not format specific, MIXED is required to optimize testing time
|
|
--source include/have_binlog_format_mixed.inc
|
|
--source include/master-slave.inc
|
|
|
|
--echo #
|
|
--echo # MDEV-21953: deadlock between BACKUP STAGE BLOCK_COMMIT and parallel
|
|
--echo # replication
|
|
--echo #
|
|
|
|
--connection master
|
|
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE = innodb;
|
|
# MDEV-515 takes X-lock on the table for the first insert.
|
|
# So concurrent insert won't happen on the table
|
|
INSERT INTO t1 VALUES(100);
|
|
|
|
--sync_slave_with_master
|
|
call mtr.add_suppression("Deadlock found when trying to get lock");
|
|
call mtr.add_suppression("Commit failed due to failure of an earlier commit");
|
|
|
|
--source 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);
|
|
--save_master_pos
|
|
|
|
# The plot:
|
|
# Block the 1st of two workers and, at waiting-for-prior-commit by the 2nd,
|
|
# issue BACKUP commands.
|
|
# BLOCK_COMMIT may hang so it is --send.
|
|
# Release the 1st worker to observe a deadlock unless its fixed.
|
|
|
|
--connect (aux_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,)
|
|
BEGIN;
|
|
# block the 1st worker and wait for the 2nd ready to commit
|
|
INSERT INTO t1 VALUES (1);
|
|
|
|
--connection slave
|
|
--source include/start_slave.inc
|
|
|
|
--connection aux_slave
|
|
--let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE state = "Waiting for prior transaction to commit"
|
|
--source include/wait_condition.inc
|
|
|
|
# While the 1st worker is locked out run backup
|
|
--connect (backup_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,)
|
|
BACKUP STAGE START;
|
|
--send BACKUP STAGE BLOCK_COMMIT
|
|
|
|
# release the 1st work
|
|
--connection aux_slave
|
|
--sleep 1
|
|
ROLLBACK;
|
|
|
|
--connection backup_slave
|
|
--reap
|
|
BACKUP STAGE END;
|
|
|
|
--connection slave
|
|
--sync_with_master
|
|
|
|
--let $diff_tables= master:t1,slave:t1
|
|
--source include/diff_tables.inc
|
|
|
|
#
|
|
--echo # MDEV-30423: dealock XA COMMIT vs BACKUP
|
|
# Prove XA "COMPLETE" 'xid' does not dealock similary to the normal trx case.
|
|
# The slave binlog group commit leader is blocked by a local trx like in
|
|
# the above normal trx case.
|
|
# [Notice a reuse of t1,aux_conn from above.]
|
|
#
|
|
--let $complete = COMMIT
|
|
--source parallel_backup_xa.inc
|
|
--let $complete = ROLLBACK
|
|
--source parallel_backup_xa.inc
|
|
|
|
--let $slave_ooo_error = 1
|
|
--let $complete = COMMIT
|
|
--source parallel_backup_xa.inc
|
|
--connection slave
|
|
--source include/start_slave.inc
|
|
--source include/sync_with_master_gtid.inc
|
|
|
|
--let $slave_ooo_error = 1
|
|
--let $complete = ROLLBACK
|
|
--source parallel_backup_xa.inc
|
|
--connection slave
|
|
--source include/start_slave.inc
|
|
--source include/sync_with_master_gtid.inc
|
|
|
|
|
|
# Clean up.
|
|
--connection slave
|
|
--source include/stop_slave.inc
|
|
SET @@global.slave_parallel_threads= @old_parallel_threads;
|
|
SET @@global.slave_parallel_mode = @old_parallel_mode;
|
|
--source include/start_slave.inc
|
|
|
|
--connection server_1
|
|
DROP TABLE t1;
|
|
|
|
--source include/rpl_end.inc
|