mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-4506: Parallel replication.
Improve STOP SLAVE in parallel mode. Now, the parallel part will queue the current event group to the end, and then stop queing any more events. Each worker will complete the current event group, and then just skip any further queued events.
This commit is contained in:
@ -165,7 +165,6 @@ CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
# Create some sentinel rows so that the rows inserted in parallel fall into
|
||||
# separate gaps and do not cause gap lock conflicts.
|
||||
INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7);
|
||||
SET binlog_format=@old_format;
|
||||
--save_master_pos
|
||||
--connection server_2
|
||||
--sync_with_master
|
||||
@ -264,6 +263,73 @@ SELECT * FROM t3 ORDER BY a;
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
|
||||
--echo *** Test STOP SLAVE in parallel mode ***
|
||||
--connection server_2
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection server_1
|
||||
# Set up a couple of transactions. The first will be blocked halfway
|
||||
# through on a lock, and while it is blocked we initiate STOP SLAVE.
|
||||
# We then test that the halfway-initiated transaction is allowed to
|
||||
# complete, but no subsequent ones.
|
||||
# We have to use statement-based mode and set
|
||||
# binlog_direct_non_transactional_updates=0; otherwise the binlog will
|
||||
# be split into two event groups, one for the MyISAM part and one for the
|
||||
# InnoDB part.
|
||||
SET binlog_direct_non_transactional_updates=0;
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction");
|
||||
SET sql_log_bin=1;
|
||||
BEGIN;
|
||||
INSERT INTO t2 VALUES (20);
|
||||
--disable_warnings
|
||||
INSERT INTO t1 VALUES (20);
|
||||
--disable_warnings
|
||||
INSERT INTO t2 VALUES (21);
|
||||
INSERT INTO t3 VALUES (20, 20);
|
||||
COMMIT;
|
||||
INSERT INTO t3 VALUES(21, 21);
|
||||
INSERT INTO t3 VALUES(22, 22);
|
||||
SET binlog_format=@old_format;
|
||||
--save_master_pos
|
||||
|
||||
# Start a connection that will block the replicated transaction halfway.
|
||||
--connection con_temp1
|
||||
BEGIN;
|
||||
INSERT INTO t2 VALUES (21);
|
||||
|
||||
--connection server_2
|
||||
START SLAVE;
|
||||
# Wait for the MyISAM change to be visible, after which replication will wait
|
||||
# for con_temp1 to roll back.
|
||||
--let $wait_condition= SELECT COUNT(*) = 1 FROM t1 WHERE a=20
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection con_temp2
|
||||
# Initiate slave stop. It will have to wait for the current event group
|
||||
# to complete.
|
||||
send STOP SLAVE;
|
||||
|
||||
--connection con_temp1
|
||||
ROLLBACK;
|
||||
|
||||
--connection con_temp2
|
||||
reap;
|
||||
|
||||
--connection server_2
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
# We should see the first transaction applied, but not the two others.
|
||||
SELECT * FROM t1 WHERE a >= 20 ORDER BY a;
|
||||
SELECT * FROM t2 WHERE a >= 20 ORDER BY a;
|
||||
SELECT * FROM t3 WHERE a >= 20 ORDER BY a;
|
||||
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SELECT * FROM t1 WHERE a >= 20 ORDER BY a;
|
||||
SELECT * FROM t2 WHERE a >= 20 ORDER BY a;
|
||||
SELECT * FROM t3 WHERE a >= 20 ORDER BY a;
|
||||
|
||||
|
||||
--connection server_2
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL binlog_format=@old_format;
|
||||
|
Reference in New Issue
Block a user