*** Test that group-committed transactions on the master can replicate in parallel on the slave. *** include/master-slave.inc [connection master] connection server_1; SET sql_log_bin=0; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN RETURN x; END || SET sql_log_bin=1; connection server_2; include/stop_slave.inc SET sql_log_bin=0; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN IF d1 != '' THEN SET debug_sync = d1; END IF; IF d2 != '' THEN SET debug_sync = d2; END IF; RETURN x; END || SET sql_log_bin=1; SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; SET GLOBAL slave_parallel_threads=10; CHANGE MASTER TO master_use_gtid=slave_pos; include/start_slave.inc connection server_1; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7); connection server_2; connect con_temp1,127.0.0.1,root,,test,$SERVER_MYPORT_2,; BEGIN; INSERT INTO t3 VALUES (2,102); connect con_temp2,127.0.0.1,root,,test,$SERVER_MYPORT_2,; BEGIN; INSERT INTO t3 VALUES (4,104); connect con_temp3,127.0.0.1,root,,test,$SERVER_MYPORT_1,; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; SET binlog_format=statement; INSERT INTO t3 VALUES (2, foo(12, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued1 WAIT_FOR slave_cont1', '')); connection server_1; SET debug_sync='now WAIT_FOR master_queued1'; connect con_temp4,127.0.0.1,root,,test,$SERVER_MYPORT_1,; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; SET binlog_format=statement; INSERT INTO t3 VALUES (4, foo(14, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued2', '')); connection server_1; SET debug_sync='now WAIT_FOR master_queued2'; connect con_temp5,127.0.0.1,root,,test,$SERVER_MYPORT_1,; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3'; SET binlog_format=statement; INSERT INTO t3 VALUES (6, foo(16, 'group_commit_waiting_for_prior SIGNAL slave_queued3', '')); connection server_1; SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='now SIGNAL master_cont1'; connection con_temp3; connection con_temp4; connection con_temp5; SET debug_sync='RESET'; connection server_1; SELECT * FROM t3 ORDER BY a; a b 1 1 2 12 3 3 4 14 5 5 6 16 7 7 include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Binlog_checkpoint # # master-bin.000001 master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (2, foo(12, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued1 WAIT_FOR slave_cont1', '')) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (4, foo(14, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued2', '')) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (6, foo(16, 'group_commit_waiting_for_prior SIGNAL slave_queued3', '')) master-bin.000001 # Xid # # COMMIT /* XID */ connection server_2; SET debug_sync='now WAIT_FOR slave_queued3'; connection con_temp1; ROLLBACK; connection server_2; SET debug_sync='now WAIT_FOR slave_queued1'; connection con_temp2; ROLLBACK; connection server_2; SET debug_sync='now WAIT_FOR slave_queued2'; SET debug_sync='now SIGNAL slave_cont1'; SELECT * FROM t3 ORDER BY a; a b 1 1 2 12 3 3 4 14 5 5 6 16 7 7 include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Query # # use `test`; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Query # # use `test`; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB slave-bin.000001 # Gtid # # BEGIN GTID #-#-# slave-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7) slave-bin.000001 # Xid # # COMMIT /* XID */ slave-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (2, foo(12, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued1 WAIT_FOR slave_cont1', '')) slave-bin.000001 # Xid # # COMMIT /* XID */ slave-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (4, foo(14, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued2', '')) slave-bin.000001 # Xid # # COMMIT /* XID */ slave-bin.000001 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (6, foo(16, 'group_commit_waiting_for_prior SIGNAL slave_queued3', '')) slave-bin.000001 # Xid # # COMMIT /* XID */ connection server_2; include/stop_slave.inc SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc SET DEBUG_SYNC= 'RESET'; connection server_1; DROP function foo; DROP TABLE t3; SET DEBUG_SYNC= 'RESET'; include/rpl_end.inc