include/master-slave.inc [connection master] SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; SET GLOBAL slave_parallel_threads=10; ERROR HY000: This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first include/stop_slave.inc SET GLOBAL slave_parallel_threads=10; SELECT IF(COUNT(*) < 10, "OK", CONCAT("Found too many system user processes: ", COUNT(*))) FROM information_schema.processlist WHERE user = "system user"; IF(COUNT(*) < 10, "OK", CONCAT("Found too many system user processes: ", COUNT(*))) OK CHANGE MASTER TO master_use_gtid=slave_pos; include/start_slave.inc SELECT IF(COUNT(*) >= 10, "OK", CONCAT("Found too few system user processes: ", COUNT(*))) FROM information_schema.processlist WHERE user = "system user"; IF(COUNT(*) >= 10, "OK", CONCAT("Found too few system user processes: ", COUNT(*))) OK include/stop_slave.inc SELECT IF(COUNT(*) < 10, "OK", CONCAT("Found too many system user processes: ", COUNT(*))) FROM information_schema.processlist WHERE user = "system user"; IF(COUNT(*) < 10, "OK", CONCAT("Found too many system user processes: ", COUNT(*))) OK include/start_slave.inc SELECT IF(COUNT(*) >= 10, "OK", CONCAT("Found too few system user processes: ", COUNT(*))) FROM information_schema.processlist WHERE user = "system user"; IF(COUNT(*) >= 10, "OK", CONCAT("Found too few system user processes: ", COUNT(*))) OK *** Test long-running query in domain 1 can run in parallel with short queries in domain 0 *** ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE t2 (a int PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); LOCK TABLE t1 WRITE; SET gtid_domain_id=1; INSERT INTO t1 VALUES (2); SET gtid_domain_id=0; INSERT INTO t2 VALUES (2); INSERT INTO t2 VALUES (3); BEGIN; INSERT INTO t2 VALUES (4); INSERT INTO t2 VALUES (5); COMMIT; INSERT INTO t2 VALUES (6); SELECT * FROM t2 ORDER by a; a 1 2 3 4 5 6 SELECT * FROM t1; a 1 UNLOCK TABLES; SELECT * FROM t1 ORDER BY a; a 1 2 *** Test two transactions in different domains committed in opposite order on slave but in a single group commit. *** include/stop_slave.inc 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; SET @old_format= @@SESSION.binlog_format; SET binlog_format='statement'; SET gtid_domain_id=1; INSERT INTO t2 VALUES (foo(10, 'commit_before_enqueue SIGNAL ready1 WAIT_FOR cont1', 'commit_after_release_LOCK_prepare_ordered SIGNAL ready2')); FLUSH LOGS; 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_format=@@GLOBAL.binlog_format; SET GLOBAL binlog_format=statement; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc SET debug_sync='now WAIT_FOR ready1'; SET gtid_domain_id=2; INSERT INTO t2 VALUES (foo(11, 'commit_before_enqueue SIGNAL ready3 WAIT_FOR cont3', 'commit_after_release_LOCK_prepare_ordered SIGNAL ready4 WAIT_FOR cont4')); SET gtid_domain_id=0; SELECT * FROM t2 WHERE a >= 10 ORDER BY a; a 10 11 SET debug_sync='now WAIT_FOR ready3'; SET debug_sync='now SIGNAL cont3'; SET debug_sync='now WAIT_FOR ready4'; SET debug_sync='now SIGNAL cont1'; SET debug_sync='now WAIT_FOR ready2'; SET debug_sync='now SIGNAL cont4'; SELECT * FROM t2 WHERE a >= 10 ORDER BY a; a 10 11 include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (foo(11, 'commit_before_enqueue SIGNAL ready3 WAIT_FOR cont3', 'commit_after_release_LOCK_prepare_ordered SIGNAL ready4 WAIT_FOR cont4')) slave-bin.000002 # Xid # # COMMIT /* XID */ slave-bin.000002 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (foo(10, 'commit_before_enqueue SIGNAL ready1 WAIT_FOR cont1', 'commit_after_release_LOCK_prepare_ordered SIGNAL ready2')) slave-bin.000002 # Xid # # COMMIT /* XID */ FLUSH LOGS; include/stop_slave.inc SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET debug_sync='RESET'; include/start_slave.inc *** Test that group-committed transactions on the master can replicate in parallel on the slave. *** SET debug_sync='RESET'; FLUSH LOGS; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7); BEGIN; INSERT INTO t3 VALUES (2,102); BEGIN; INSERT INTO t3 VALUES (4,104); 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', '')); SET debug_sync='now WAIT_FOR master_queued1'; 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', '')); SET debug_sync='now WAIT_FOR master_queued2'; 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', '')); SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='now SIGNAL master_cont1'; SET debug_sync='RESET'; 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.000002 # Binlog_checkpoint # # master-bin.000001 master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB master-bin.000002 # Gtid # # BEGIN GTID #-#-# master-bin.000002 # Query # # use `test`; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7) master-bin.000002 # Xid # # COMMIT /* XID */ master-bin.000002 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000002 # 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.000002 # Xid # # COMMIT /* XID */ master-bin.000002 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000002 # Query # # use `test`; INSERT INTO t3 VALUES (4, foo(14, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued2', '')) master-bin.000002 # Xid # # COMMIT /* XID */ master-bin.000002 # Gtid # # BEGIN GTID #-#-# cid=# master-bin.000002 # Query # # use `test`; INSERT INTO t3 VALUES (6, foo(16, 'group_commit_waiting_for_prior SIGNAL slave_queued3', '')) master-bin.000002 # Xid # # COMMIT /* XID */ SET debug_sync='now WAIT_FOR slave_queued3'; ROLLBACK; SET debug_sync='now WAIT_FOR slave_queued1'; ROLLBACK; 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.000003 # Binlog_checkpoint # # slave-bin.000003 slave-bin.000003 # Gtid # # GTID #-#-# slave-bin.000003 # Query # # use `test`; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB slave-bin.000003 # Gtid # # BEGIN GTID #-#-# slave-bin.000003 # Query # # use `test`; INSERT INTO t3 VALUES (1,1), (3,3), (5,5), (7,7) slave-bin.000003 # Xid # # COMMIT /* XID */ slave-bin.000003 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000003 # 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.000003 # Xid # # COMMIT /* XID */ slave-bin.000003 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000003 # Query # # use `test`; INSERT INTO t3 VALUES (4, foo(14, 'commit_after_release_LOCK_prepare_ordered SIGNAL slave_queued2', '')) slave-bin.000003 # Xid # # COMMIT /* XID */ slave-bin.000003 # Gtid # # BEGIN GTID #-#-# cid=# slave-bin.000003 # Query # # use `test`; INSERT INTO t3 VALUES (6, foo(16, 'group_commit_waiting_for_prior SIGNAL slave_queued3', '')) slave-bin.000003 # Xid # # COMMIT /* XID */ *** Test STOP SLAVE in parallel mode *** include/stop_slave.inc SET debug_sync='RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; 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); INSERT INTO t1 VALUES (20); 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; BEGIN; INSERT INTO t2 VALUES (21); START SLAVE; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; STOP SLAVE; SET debug_sync='now WAIT_FOR wait_for_done_waiting'; ROLLBACK; SET GLOBAL debug_dbug=@old_dbug; SET debug_sync='RESET'; include/wait_for_slave_to_stop.inc SELECT * FROM t1 WHERE a >= 20 ORDER BY a; a 20 SELECT * FROM t2 WHERE a >= 20 ORDER BY a; a 20 21 SELECT * FROM t3 WHERE a >= 20 ORDER BY a; a b 20 20 include/start_slave.inc SELECT * FROM t1 WHERE a >= 20 ORDER BY a; a 20 SELECT * FROM t2 WHERE a >= 20 ORDER BY a; a 20 21 SELECT * FROM t3 WHERE a >= 20 ORDER BY a; a b 20 20 21 21 22 22 include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** Test killing slave threads at various wait points *** *** 1. Test killing transaction waiting in commit for previous transaction to commit *** SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; SET binlog_format=statement; INSERT INTO t3 VALUES (31, foo(31, 'commit_before_prepare_ordered WAIT_FOR t2_waiting', 'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont')); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; SET binlog_format=statement; BEGIN; INSERT INTO t3 VALUES (32, foo(32, 'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont', '')); INSERT INTO t3 VALUES (33, foo(33, 'group_commit_waiting_for_prior SIGNAL t2_waiting', 'group_commit_waiting_for_prior_killed SIGNAL t2_killed')); COMMIT; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3'; SET binlog_format=statement; INSERT INTO t3 VALUES (34, foo(34, '', '')); SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='now SIGNAL master_cont1'; SELECT * FROM t3 WHERE a >= 30 ORDER BY a; a b 31 31 32 32 33 33 34 34 SET debug_sync='RESET'; SET sql_log_bin=0; CALL mtr.add_suppression("Query execution was interrupted"); CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); CALL mtr.add_suppression("Slave: Connection was killed"); SET sql_log_bin=1; SET debug_sync='now WAIT_FOR t2_query'; SET debug_sync='now SIGNAL t2_cont'; SET debug_sync='now WAIT_FOR t1_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR t2_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; SELECT * FROM t3 WHERE a >= 30 ORDER BY a; a b 31 31 SET debug_sync='RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET sql_log_bin=0; DROP FUNCTION foo; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN RETURN x; END || SET sql_log_bin=1; INSERT INTO t3 VALUES (39,0); include/start_slave.inc SELECT * FROM t3 WHERE a >= 30 ORDER BY a; a b 31 31 32 32 33 33 34 34 39 0 SET sql_log_bin=0; DROP FUNCTION foo; 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; include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** 2. Same as (1), but without restarting IO thread after kill of SQL threads *** SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; SET binlog_format=statement; INSERT INTO t3 VALUES (41, foo(41, 'commit_before_prepare_ordered WAIT_FOR t2_waiting', 'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont')); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; SET binlog_format=statement; BEGIN; INSERT INTO t3 VALUES (42, foo(42, 'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont', '')); INSERT INTO t3 VALUES (43, foo(43, 'group_commit_waiting_for_prior SIGNAL t2_waiting', 'group_commit_waiting_for_prior_killed SIGNAL t2_killed')); COMMIT; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3'; SET binlog_format=statement; INSERT INTO t3 VALUES (44, foo(44, '', '')); SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='now SIGNAL master_cont1'; SELECT * FROM t3 WHERE a >= 40 ORDER BY a; a b 41 41 42 42 43 43 44 44 SET debug_sync='RESET'; SET debug_sync='now WAIT_FOR t2_query'; SET debug_sync='now SIGNAL t2_cont'; SET debug_sync='now WAIT_FOR t1_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR t2_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] SET debug_sync='RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET sql_log_bin=0; DROP FUNCTION foo; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN RETURN x; END || SET sql_log_bin=1; INSERT INTO t3 VALUES (49,0); START SLAVE SQL_THREAD; SELECT * FROM t3 WHERE a >= 40 ORDER BY a; a b 41 41 42 42 43 43 44 44 49 0 SET sql_log_bin=0; DROP FUNCTION foo; 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; include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** 3. Same as (2), but not using gtid mode *** include/stop_slave.inc CHANGE MASTER TO master_use_gtid=no; include/start_slave.inc SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; SET binlog_format=statement; INSERT INTO t3 VALUES (51, foo(51, 'commit_before_prepare_ordered WAIT_FOR t2_waiting', 'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont')); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; SET binlog_format=statement; BEGIN; INSERT INTO t3 VALUES (52, foo(52, 'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont', '')); INSERT INTO t3 VALUES (53, foo(53, 'group_commit_waiting_for_prior SIGNAL t2_waiting', 'group_commit_waiting_for_prior_killed SIGNAL t2_killed')); COMMIT; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3'; SET binlog_format=statement; INSERT INTO t3 VALUES (54, foo(54, '', '')); SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='now SIGNAL master_cont1'; SELECT * FROM t3 WHERE a >= 50 ORDER BY a; a b 51 51 52 52 53 53 54 54 SET debug_sync='RESET'; SET debug_sync='now WAIT_FOR t2_query'; SET debug_sync='now SIGNAL t2_cont'; SET debug_sync='now WAIT_FOR t1_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR t2_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] SELECT * FROM t3 WHERE a >= 50 ORDER BY a; a b 51 51 SET debug_sync='RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET sql_log_bin=0; DROP FUNCTION foo; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN RETURN x; END || SET sql_log_bin=1; INSERT INTO t3 VALUES (59,0); START SLAVE SQL_THREAD; SELECT * FROM t3 WHERE a >= 50 ORDER BY a; a b 51 51 52 52 53 53 54 54 59 0 SET sql_log_bin=0; DROP FUNCTION foo; 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; include/stop_slave.inc CHANGE MASTER TO master_use_gtid=slave_pos; include/start_slave.inc include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=4; include/start_slave.inc *** 4. Test killing thread that is waiting to start transaction until previous transaction commits *** SET binlog_format=statement; SET gtid_domain_id=2; BEGIN; INSERT INTO t3 VALUES (70, foo(70, 'rpl_parallel_start_waiting_for_prior SIGNAL t4_waiting', '')); INSERT INTO t3 VALUES (60, foo(60, 'ha_write_row_end SIGNAL d2_query WAIT_FOR d2_cont2', 'rpl_parallel_end_of_group SIGNAL d2_done WAIT_FOR d2_cont')); COMMIT; SET gtid_domain_id=0; SET debug_sync='now WAIT_FOR d2_query'; SET gtid_domain_id=1; BEGIN; INSERT INTO t3 VALUES (61, foo(61, 'rpl_parallel_start_waiting_for_prior SIGNAL t3_waiting', 'rpl_parallel_start_waiting_for_prior_killed SIGNAL t3_killed')); INSERT INTO t3 VALUES (62, foo(62, 'ha_write_row_end SIGNAL d1_query WAIT_FOR d1_cont2', 'rpl_parallel_end_of_group SIGNAL d1_done WAIT_FOR d1_cont')); COMMIT; SET gtid_domain_id=0; SET debug_sync='now WAIT_FOR d1_query'; SET gtid_domain_id=0; INSERT INTO t3 VALUES (63, foo(63, 'ha_write_row_end SIGNAL d0_query WAIT_FOR d0_cont2', 'rpl_parallel_end_of_group SIGNAL d0_done WAIT_FOR d0_cont')); SET debug_sync='now WAIT_FOR d0_query'; SET gtid_domain_id=3; BEGIN; INSERT INTO t3 VALUES (68, foo(68, 'rpl_parallel_start_waiting_for_prior SIGNAL t2_waiting', '')); INSERT INTO t3 VALUES (69, foo(69, 'ha_write_row_end SIGNAL d3_query WAIT_FOR d3_cont2', 'rpl_parallel_end_of_group SIGNAL d3_done WAIT_FOR d3_cont')); COMMIT; SET gtid_domain_id=0; SET debug_sync='now WAIT_FOR d3_query'; SET debug_sync='now SIGNAL d2_cont2'; SET debug_sync='now WAIT_FOR d2_done'; SET debug_sync='now SIGNAL d1_cont2'; SET debug_sync='now WAIT_FOR d1_done'; SET debug_sync='now SIGNAL d0_cont2'; SET debug_sync='now WAIT_FOR d0_done'; SET debug_sync='now SIGNAL d3_cont2'; SET debug_sync='now WAIT_FOR d3_done'; SET binlog_format=statement; INSERT INTO t3 VALUES (64, foo(64, 'rpl_parallel_before_mark_start_commit SIGNAL t1_waiting WAIT_FOR t1_cont', '')); SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2 WAIT_FOR master_cont2'; INSERT INTO t3 VALUES (65, foo(65, '', '')); SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3'; INSERT INTO t3 VALUES (66, foo(66, '', '')); SET debug_sync='now WAIT_FOR master_queued3'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued4'; INSERT INTO t3 VALUES (67, foo(67, '', '')); SET debug_sync='now WAIT_FOR master_queued4'; SET debug_sync='now SIGNAL master_cont2'; SELECT * FROM t3 WHERE a >= 60 ORDER BY a; a b 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 SET debug_sync='RESET'; SET debug_sync='now SIGNAL d0_cont'; SET debug_sync='now WAIT_FOR t1_waiting'; SET debug_sync='now SIGNAL d3_cont'; SET debug_sync='now WAIT_FOR t2_waiting'; SET debug_sync='now SIGNAL d1_cont'; SET debug_sync='now WAIT_FOR t3_waiting'; SET debug_sync='now SIGNAL d2_cont'; SET debug_sync='now WAIT_FOR t4_waiting'; KILL THD_ID; SET debug_sync='now WAIT_FOR t3_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; SELECT * FROM t3 WHERE a >= 60 AND a != 65 ORDER BY a; a b 60 60 61 61 62 62 63 63 64 64 68 68 69 69 70 70 SET debug_sync='RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET sql_log_bin=0; DROP FUNCTION foo; CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500)) RETURNS INT DETERMINISTIC BEGIN RETURN x; END || SET sql_log_bin=1; UPDATE t3 SET b=b+1 WHERE a=60; include/start_slave.inc SELECT * FROM t3 WHERE a >= 60 ORDER BY a; a b 60 61 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 SET sql_log_bin=0; DROP FUNCTION foo; 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; include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** 5. Test killing thread that is waiting for queue of max length to shorten *** SET @old_max_queued= @@GLOBAL.slave_parallel_max_queued; SET GLOBAL slave_parallel_max_queued=9000; SET binlog_format=statement; INSERT INTO t3 VALUES (80, foo(0, 'ha_write_row_end SIGNAL query_waiting WAIT_FOR query_cont', '')); SET debug_sync='now WAIT_FOR query_waiting'; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,rpl_parallel_wait_queue_max"; SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 81 10000 SET debug_sync='now WAIT_FOR wait_queue_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR wait_queue_killed'; SET debug_sync='now SIGNAL query_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; SET GLOBAL debug_dbug=@old_dbug; SET GLOBAL slave_parallel_max_queued= @old_max_queued; INSERT INTO t3 VALUES (82,0); SET binlog_format=@old_format; SET debug_sync='RESET'; include/start_slave.inc SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 81 10000 82 0 include/stop_slave.inc SET GLOBAL binlog_format=@old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-5788 Incorrect free of rgi->deferred_events in parallel replication *** include/stop_slave.inc SET GLOBAL replicate_ignore_table="test.t3"; SET GLOBAL slave_parallel_threads=2; include/start_slave.inc INSERT INTO t3 VALUES (100, rand()); INSERT INTO t3 VALUES (101, rand()); INSERT INTO t3 VALUES (102, rand()); INSERT INTO t3 VALUES (103, rand()); INSERT INTO t3 VALUES (104, rand()); INSERT INTO t3 VALUES (105, rand()); include/stop_slave.inc SET GLOBAL replicate_ignore_table=""; include/start_slave.inc INSERT INTO t3 VALUES (106, rand()); INSERT INTO t3 VALUES (107, rand()); SELECT * FROM t3 WHERE a >= 100 ORDER BY a; a b 106 # 107 # *** MDEV-5921: In parallel replication, an error is not correctly signalled to the next transaction *** include/stop_slave.inc SET GLOBAL slave_parallel_threads=10; include/start_slave.inc INSERT INTO t3 VALUES (110, 1); SELECT * FROM t3 WHERE a >= 110 ORDER BY a; a b 110 1 SET sql_log_bin=0; INSERT INTO t3 VALUES (111, 666); SET sql_log_bin=1; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; INSERT INTO t3 VALUES (111, 2); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; INSERT INTO t3 VALUES (112, 3); SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET debug_sync='RESET'; include/wait_for_slave_sql_error.inc [errno=1062] include/wait_for_slave_sql_to_stop.inc SELECT * FROM t3 WHERE a >= 110 ORDER BY a; a b 110 1 111 666 SET sql_log_bin=0; DELETE FROM t3 WHERE a=111 AND b=666; SET sql_log_bin=1; START SLAVE SQL_THREAD; SELECT * FROM t3 WHERE a >= 110 ORDER BY a; a b 110 1 111 2 112 3 ***MDEV-5914: Parallel replication deadlock due to InnoDB lock conflicts *** include/stop_slave.inc CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB; INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6); SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; UPDATE t4 SET b=NULL WHERE a=6; SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; DELETE FROM t4 WHERE b <= 3; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET debug_sync='RESET'; include/start_slave.inc include/stop_slave.inc SELECT * FROM t4 ORDER BY a; a b 1 NULL 3 NULL 4 4 5 NULL 6 NULL DELETE FROM t4; INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6); SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; INSERT INTO t4 VALUES (7, NULL); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; DELETE FROM t4 WHERE b <= 3; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET debug_sync='RESET'; include/start_slave.inc include/stop_slave.inc SELECT * FROM t4 ORDER BY a; a b 1 NULL 3 NULL 4 4 5 NULL 6 6 7 NULL DELETE FROM t4; INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6); SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; UPDATE t4 SET b=NULL WHERE a=6; SET debug_sync='now WAIT_FOR master_queued1'; SET @old_format= @@SESSION.binlog_format; SET binlog_format='statement'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; DELETE FROM t4 WHERE b <= 1; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET @old_format=@@GLOBAL.binlog_format; SET debug_sync='RESET'; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,disable_thd_need_ordering_with"; include/start_slave.inc SET GLOBAL debug_dbug=@old_dbug; SELECT * FROM t4 ORDER BY a; a b 1 NULL 2 2 3 NULL 4 4 5 NULL 6 NULL SET @last_gtid= 'GTID'; SELECT IF(@@gtid_slave_pos LIKE CONCAT('%',@last_gtid,'%'), "GTID found ok", CONCAT("GTID ", @last_gtid, " not found in gtid_slave_pos=", @@gtid_slave_pos)) AS result; result GTID found ok SELECT "ROW FOUND" AS `Is the row found?` FROM mysql.gtid_slave_pos WHERE CONCAT(domain_id, "-", server_id, "-", seq_no) = @last_gtid; Is the row found? ROW FOUND *** MDEV-5938: Exec_master_log_pos not updated at log rotate in parallel replication *** include/stop_slave.inc SET GLOBAL slave_parallel_threads=1; SET DEBUG_SYNC= 'RESET'; include/start_slave.inc CREATE TABLE t5 (a INT PRIMARY KEY, b INT); INSERT INTO t5 VALUES (1,1); INSERT INTO t5 VALUES (2,2), (3,8); INSERT INTO t5 VALUES (4,16); test_check OK test_check OK FLUSH LOGS; test_check OK test_check OK *** MDEV_6435: Incorrect error handling when query binlogged partially on master with "killed" error *** CREATE TABLE t6 (a INT) ENGINE=MyISAM; CREATE TRIGGER tr AFTER INSERT ON t6 FOR EACH ROW SET @a = 1; SET @old_format= @@binlog_format; SET binlog_format= statement; SET debug_sync='sp_head_execute_before_loop SIGNAL ready WAIT_FOR cont'; INSERT INTO t6 VALUES (1), (2), (3); SET debug_sync='now WAIT_FOR ready'; KILL QUERY CONID; SET debug_sync='now SIGNAL cont'; ERROR 70100: Query execution was interrupted SET binlog_format= @old_format; SET debug_sync='RESET'; SET debug_sync='RESET'; include/wait_for_slave_sql_error.inc [errno=1317] STOP SLAVE IO_THREAD; SET GLOBAL gtid_slave_pos= 'AFTER_ERROR_GTID_POS'; include/start_slave.inc INSERT INTO t6 VALUES (4); SELECT * FROM t6 ORDER BY a; a 1 4 SELECT * FROM t6 ORDER BY a; a 4 *** MDEV-6551: Some replication errors are ignored if slave_parallel_threads > 0 *** INSERT INTO t2 VALUES (31); include/save_master_gtid.inc include/sync_with_master_gtid.inc include/stop_slave.inc SET GLOBAL slave_parallel_threads= 0; include/start_slave.inc SET sql_log_bin= 0; INSERT INTO t2 VALUES (32); SET sql_log_bin= 1; INSERT INTO t2 VALUES (32); FLUSH LOGS; INSERT INTO t2 VALUES (33); INSERT INTO t2 VALUES (34); SELECT * FROM t2 WHERE a >= 30 ORDER BY a; a 31 32 33 34 include/save_master_gtid.inc include/wait_for_slave_sql_error.inc [errno=1062] include/stop_slave_io.inc SET GLOBAL slave_parallel_threads=10; START SLAVE; include/wait_for_slave_sql_error.inc [errno=1062] START SLAVE SQL_THREAD; include/wait_for_slave_sql_error.inc [errno=1062] SELECT * FROM t2 WHERE a >= 30 ORDER BY a; a 31 32 SET sql_slave_skip_counter= 1; ERROR HY000: When using parallel replication and GTID with multiple replication domains, @@sql_slave_skip_counter can not be used. Instead, setting @@gtid_slave_pos explicitly can be used to skip to after a given GTID position. include/stop_slave_io.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 WHERE a >= 30 ORDER BY a; a 31 32 33 34 *** MDEV-6775: Wrong binlog order in parallel replication *** DELETE FROM t4; INSERT INTO t4 VALUES (1,NULL), (3,NULL), (4,4), (5, NULL), (6, 6); include/save_master_gtid.inc include/sync_with_master_gtid.inc include/stop_slave.inc SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,inject_binlog_commit_before_get_LOCK_log"; SET @old_format=@@GLOBAL.binlog_format; SET GLOBAL binlog_format=ROW; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; SET @old_format= @@binlog_format; SET binlog_format= statement; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; UPDATE t4 SET b=NULL WHERE a=6; SET debug_sync='now WAIT_FOR master_queued1'; SET @old_format= @@binlog_format; SET binlog_format= statement; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; DELETE FROM t4 WHERE b <= 3; SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET binlog_format= @old_format; SET binlog_format= @old_format; SET debug_sync='RESET'; SELECT * FROM t4 ORDER BY a; a b 1 NULL 3 NULL 4 4 5 NULL 6 NULL include/start_slave.inc SET debug_sync= 'now WAIT_FOR waiting'; SELECT * FROM t4 ORDER BY a; a b 1 NULL 3 NULL 4 4 5 NULL 6 NULL SET debug_sync= 'now SIGNAL cont'; include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; SET GLOBAL binlog_format= @old_format; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-7237: Parallel replication: incorrect relaylog position after stop/start the slave *** INSERT INTO t2 VALUES (40); include/stop_slave.inc CHANGE MASTER TO master_use_gtid=no; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,rpl_parallel_scheduled_gtid_0_x_100"; SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; INSERT INTO t2 VALUES (41); INSERT INTO t2 VALUES (42); SET @old_format= @@binlog_format; SET binlog_format= statement; DELETE FROM t2 WHERE a=40; SET binlog_format= @old_format; INSERT INTO t2 VALUES (43); INSERT INTO t2 VALUES (44); FLUSH LOGS; INSERT INTO t2 VALUES (45); SET gtid_seq_no=100; INSERT INTO t2 VALUES (46); BEGIN; SELECT * FROM t2 WHERE a=40 FOR UPDATE; a 40 include/start_slave.inc SET debug_sync= 'now WAIT_FOR scheduled_gtid_0_x_100'; STOP SLAVE; SET debug_sync= 'now WAIT_FOR wait_for_done_waiting'; ROLLBACK; include/wait_for_slave_sql_to_stop.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a 41 42 include/start_slave.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a 41 42 43 44 45 46 include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; SET DEBUG_SYNC= 'RESET'; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; CHANGE MASTER TO master_use_gtid=slave_pos; include/start_slave.inc *** MDEV-7326 Server deadlock in connection with parallel replication *** include/stop_slave.inc SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=3; SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_xid"; include/start_slave.inc SET @old_format= @@SESSION.binlog_format; SET binlog_format= STATEMENT; INSERT INTO t1 VALUES (foo(50, "rpl_parallel_start_waiting_for_prior SIGNAL t3_ready", "rpl_parallel_end_of_group SIGNAL prep_ready WAIT_FOR prep_cont")); SET DEBUG_SYNC= "now WAIT_FOR prep_ready"; INSERT INTO t2 VALUES (foo(50, "rpl_parallel_simulate_temp_err_xid SIGNAL t1_ready1 WAIT_FOR t1_cont1", "rpl_parallel_retry_after_unmark SIGNAL t1_ready2 WAIT_FOR t1_cont2")); SET DEBUG_SYNC= "now WAIT_FOR t1_ready1"; INSERT INTO t1 VALUES (foo(51, "rpl_parallel_before_mark_start_commit SIGNAL t2_ready1 WAIT_FOR t2_cont1", "rpl_parallel_after_mark_start_commit SIGNAL t2_ready2")); SET DEBUG_SYNC= "now WAIT_FOR t2_ready1"; SET DEBUG_SYNC= "now SIGNAL t1_cont1"; SET DEBUG_SYNC= "now WAIT_FOR t1_ready2"; INSERT INTO t1 VALUES (52); SET BINLOG_FORMAT= @old_format; SELECT * FROM t2 WHERE a>=50 ORDER BY a; a 50 SELECT * FROM t1 WHERE a>=50 ORDER BY a; a 50 51 52 SET DEBUG_SYNC= "now SIGNAL prep_cont"; SET DEBUG_SYNC= "now WAIT_FOR t3_ready"; SET DEBUG_SYNC= "now SIGNAL t2_cont1"; SET DEBUG_SYNC= "now WAIT_FOR t2_ready2"; SET DEBUG_SYNC= "now SIGNAL t1_cont2"; SELECT * FROM t2 WHERE a>=50 ORDER BY a; a 50 SELECT * FROM t1 WHERE a>=50 ORDER BY a; a 50 51 52 SET DEBUG_SYNC="reset"; include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-7326 Server deadlock in connection with parallel replication *** include/stop_slave.inc SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=3; SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_xid"; include/start_slave.inc SET @old_format= @@SESSION.binlog_format; SET binlog_format= STATEMENT; INSERT INTO t1 VALUES (foo(60, "rpl_parallel_start_waiting_for_prior SIGNAL t3_ready", "rpl_parallel_end_of_group SIGNAL prep_ready WAIT_FOR prep_cont")); SET DEBUG_SYNC= "now WAIT_FOR prep_ready"; INSERT INTO t2 VALUES (foo(60, "rpl_parallel_simulate_temp_err_xid SIGNAL t1_ready1 WAIT_FOR t1_cont1", "rpl_parallel_retry_after_unmark SIGNAL t1_ready2 WAIT_FOR t1_cont2")); SET DEBUG_SYNC= "now WAIT_FOR t1_ready1"; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; SET binlog_format=statement; INSERT INTO t1 VALUES (foo(61, "rpl_parallel_before_mark_start_commit SIGNAL t2_ready1 WAIT_FOR t2_cont1", "rpl_parallel_after_mark_start_commit SIGNAL t2_ready2")); SET debug_sync='now WAIT_FOR master_queued1'; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2'; INSERT INTO t6 VALUES (62); SET debug_sync='now WAIT_FOR master_queued2'; SET debug_sync='now SIGNAL master_cont1'; SET debug_sync='RESET'; SET BINLOG_FORMAT= @old_format; SELECT * FROM t2 WHERE a>=60 ORDER BY a; a 60 SELECT * FROM t1 WHERE a>=60 ORDER BY a; a 60 61 SELECT * FROM t6 WHERE a>=60 ORDER BY a; a 62 SET DEBUG_SYNC= "now WAIT_FOR t2_ready1"; SET DEBUG_SYNC= "now SIGNAL t1_cont1"; SET DEBUG_SYNC= "now WAIT_FOR t1_ready2"; SET DEBUG_SYNC= "now SIGNAL prep_cont"; SET DEBUG_SYNC= "now WAIT_FOR t3_ready"; SET DEBUG_SYNC= "now SIGNAL t2_cont1"; SET DEBUG_SYNC= "now WAIT_FOR t2_ready2"; SET DEBUG_SYNC= "now SIGNAL t1_cont2"; SELECT * FROM t2 WHERE a>=60 ORDER BY a; a 60 SELECT * FROM t1 WHERE a>=60 ORDER BY a; a 60 61 SELECT * FROM t6 WHERE a>=60 ORDER BY a; a 62 SET DEBUG_SYNC="reset"; include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-7335: Potential parallel slave deadlock with specific binlog corruption *** include/stop_slave.inc SET GLOBAL slave_parallel_threads=1; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000"; INSERT INTO t2 VALUES (101); INSERT INTO t2 VALUES (102); INSERT INTO t2 VALUES (103); INSERT INTO t2 VALUES (104); INSERT INTO t2 VALUES (105); SET gtid_seq_no=1000; INSERT INTO t2 VALUES (106); INSERT INTO t2 VALUES (107); INSERT INTO t2 VALUES (108); INSERT INTO t2 VALUES (109); INSERT INTO t2 VALUES (110); INSERT INTO t2 VALUES (111); INSERT INTO t2 VALUES (112); INSERT INTO t2 VALUES (113); INSERT INTO t2 VALUES (114); INSERT INTO t2 VALUES (115); INSERT INTO t2 VALUES (116); INSERT INTO t2 VALUES (117); INSERT INTO t2 VALUES (118); INSERT INTO t2 VALUES (119); INSERT INTO t2 VALUES (120); INSERT INTO t2 VALUES (121); INSERT INTO t2 VALUES (122); INSERT INTO t2 VALUES (123); INSERT INTO t2 VALUES (124); INSERT INTO t2 VALUES (125); INSERT INTO t2 VALUES (126); INSERT INTO t2 VALUES (127); INSERT INTO t2 VALUES (128); INSERT INTO t2 VALUES (129); INSERT INTO t2 VALUES (130); include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 WHERE a >= 100 ORDER BY a; a 101 102 103 104 105 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-6676 - test syntax of @@slave_parallel_mode *** Parallel_Mode = 'conservative' include/stop_slave.inc SET GLOBAL slave_parallel_mode='aggressive'; Parallel_Mode = 'aggressive' SET GLOBAL slave_parallel_mode='conservative'; Parallel_Mode = 'conservative' *** MDEV-6676 - test that empty parallel_mode does not replicate in parallel *** INSERT INTO t2 VALUES (1040); include/save_master_gtid.inc SET GLOBAL slave_parallel_mode='none'; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,slave_crash_if_parallel_apply"; include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 WHERE a >= 1040 ORDER BY a; a 1040 include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; *** MDEV-6676 - test disabling domain-based parallel replication *** SET gtid_domain_id = 1; INSERT INTO t2 VALUES (1041); INSERT INTO t2 VALUES (1042); INSERT INTO t2 VALUES (1043); INSERT INTO t2 VALUES (1044); INSERT INTO t2 VALUES (1045); INSERT INTO t2 VALUES (1046); DELETE FROM t2 WHERE a >= 1041; SET gtid_domain_id = 2; INSERT INTO t2 VALUES (1041); INSERT INTO t2 VALUES (1042); INSERT INTO t2 VALUES (1043); INSERT INTO t2 VALUES (1044); INSERT INTO t2 VALUES (1045); INSERT INTO t2 VALUES (1046); SET gtid_domain_id = 0; include/save_master_gtid.inc SET GLOBAL slave_parallel_mode=minimal; include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 WHERE a >= 1040 ORDER BY a; a 1040 1041 1042 1043 1044 1045 1046 include/stop_slave.inc SET GLOBAL slave_parallel_mode='conservative'; include/start_slave.inc *** MDEV-7847: "Slave worker thread retried transaction 10 time(s) in vain, giving up", followed by replication hanging *** *** MDEV-7882: Excessive transaction retry in parallel replication *** CREATE TABLE t7 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; CREATE TABLE t8 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; include/stop_slave.inc SET GLOBAL slave_parallel_threads=40; SELECT @old_retries:=@@GLOBAL.slave_transaction_retries; @old_retries:=@@GLOBAL.slave_transaction_retries 10 SET GLOBAL slave_transaction_retries= 5; INSERT INTO t7 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); SET @old_dbug= @@SESSION.debug_dbug; SET @commit_id= 42; SET SESSION debug_dbug="+d,binlog_force_commit_id"; INSERT INTO t8 VALUES (1,1); INSERT INTO t8 VALUES (2,2); INSERT INTO t8 VALUES (3,3); INSERT INTO t8 VALUES (4,4); INSERT INTO t8 VALUES (5,5); INSERT INTO t8 VALUES (6,6); INSERT INTO t8 VALUES (7,7); INSERT INTO t8 VALUES (8,8); UPDATE t7 SET b=9 WHERE a=3; UPDATE t7 SET b=10 WHERE a=3; UPDATE t7 SET b=11 WHERE a=3; INSERT INTO t8 VALUES (12,12); INSERT INTO t8 VALUES (13,13); UPDATE t7 SET b=14 WHERE a=3; UPDATE t7 SET b=15 WHERE a=3; INSERT INTO t8 VALUES (16,16); UPDATE t7 SET b=17 WHERE a=3; INSERT INTO t8 VALUES (18,18); INSERT INTO t8 VALUES (19,19); UPDATE t7 SET b=20 WHERE a=3; INSERT INTO t8 VALUES (21,21); UPDATE t7 SET b=22 WHERE a=3; INSERT INTO t8 VALUES (23,24); INSERT INTO t8 VALUES (24,24); UPDATE t7 SET b=25 WHERE a=3; INSERT INTO t8 VALUES (26,26); UPDATE t7 SET b=27 WHERE a=3; BEGIN; INSERT INTO t8 VALUES (28,28); INSERT INTO t8 VALUES (29,28), (30,28); INSERT INTO t8 VALUES (31,28); INSERT INTO t8 VALUES (32,28); INSERT INTO t8 VALUES (33,28); INSERT INTO t8 VALUES (34,28); INSERT INTO t8 VALUES (35,28); INSERT INTO t8 VALUES (36,28); INSERT INTO t8 VALUES (37,28); INSERT INTO t8 VALUES (38,28); INSERT INTO t8 VALUES (39,28); INSERT INTO t8 VALUES (40,28); INSERT INTO t8 VALUES (41,28); INSERT INTO t8 VALUES (42,28); COMMIT; SET @commit_id=43; INSERT INTO t8 VALUES (43,43); INSERT INTO t8 VALUES (44,44); UPDATE t7 SET b=45 WHERE a=3; INSERT INTO t8 VALUES (46,46); INSERT INTO t8 VALUES (47,47); UPDATE t7 SET b=48 WHERE a=3; INSERT INTO t8 VALUES (49,49); INSERT INTO t8 VALUES (50,50); SET @commit_id=44; INSERT INTO t8 VALUES (51,51); INSERT INTO t8 VALUES (52,52); UPDATE t7 SET b=53 WHERE a=3; INSERT INTO t8 VALUES (54,54); INSERT INTO t8 VALUES (55,55); UPDATE t7 SET b=56 WHERE a=3; INSERT INTO t8 VALUES (57,57); UPDATE t7 SET b=58 WHERE a=3; INSERT INTO t8 VALUES (58,58); INSERT INTO t8 VALUES (59,59); INSERT INTO t8 VALUES (60,60); INSERT INTO t8 VALUES (61,61); UPDATE t7 SET b=62 WHERE a=3; INSERT INTO t8 VALUES (63,63); INSERT INTO t8 VALUES (64,64); INSERT INTO t8 VALUES (65,65); INSERT INTO t8 VALUES (66,66); UPDATE t7 SET b=67 WHERE a=3; INSERT INTO t8 VALUES (68,68); UPDATE t7 SET b=69 WHERE a=3; UPDATE t7 SET b=70 WHERE a=3; UPDATE t7 SET b=71 WHERE a=3; INSERT INTO t8 VALUES (72,72); UPDATE t7 SET b=73 WHERE a=3; UPDATE t7 SET b=74 WHERE a=3; UPDATE t7 SET b=75 WHERE a=3; UPDATE t7 SET b=76 WHERE a=3; INSERT INTO t8 VALUES (77,77); UPDATE t7 SET b=78 WHERE a=3; INSERT INTO t8 VALUES (79,79); UPDATE t7 SET b=80 WHERE a=3; INSERT INTO t8 VALUES (81,81); UPDATE t7 SET b=82 WHERE a=3; INSERT INTO t8 VALUES (83,83); UPDATE t7 SET b=84 WHERE a=3; SET @commit_id=45; INSERT INTO t8 VALUES (85,85); UPDATE t7 SET b=86 WHERE a=3; INSERT INTO t8 VALUES (87,87); SET @commit_id=46; INSERT INTO t8 VALUES (88,88); INSERT INTO t8 VALUES (89,89); INSERT INTO t8 VALUES (90,90); SET SESSION debug_dbug=@old_dbug; INSERT INTO t8 VALUES (91,91); INSERT INTO t8 VALUES (92,92); INSERT INTO t8 VALUES (93,93); INSERT INTO t8 VALUES (94,94); INSERT INTO t8 VALUES (95,95); INSERT INTO t8 VALUES (96,96); INSERT INTO t8 VALUES (97,97); INSERT INTO t8 VALUES (98,98); INSERT INTO t8 VALUES (99,99); SELECT * FROM t7 ORDER BY a; a b 1 1 2 2 3 86 4 4 5 5 SELECT * FROM t8 ORDER BY a; a b 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 12 12 13 13 16 16 18 18 19 19 21 21 23 24 24 24 26 26 28 28 29 28 30 28 31 28 32 28 33 28 34 28 35 28 36 28 37 28 38 28 39 28 40 28 41 28 42 28 43 43 44 44 46 46 47 47 49 49 50 50 51 51 52 52 54 54 55 55 57 57 58 58 59 59 60 60 61 61 63 63 64 64 65 65 66 66 68 68 72 72 77 77 79 79 81 81 83 83 85 85 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t7 ORDER BY a; a b 1 1 2 2 3 86 4 4 5 5 SELECT * FROM t8 ORDER BY a; a b 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 12 12 13 13 16 16 18 18 19 19 21 21 23 24 24 24 26 26 28 28 29 28 30 28 31 28 32 28 33 28 34 28 35 28 36 28 37 28 38 28 39 28 40 28 41 28 42 28 43 43 44 44 46 46 47 47 49 49 50 50 51 51 52 52 54 54 55 55 57 57 58 58 59 59 60 60 61 61 63 63 64 64 65 65 66 66 68 68 72 72 77 77 79 79 81 81 83 83 85 85 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 include/stop_slave.inc SET GLOBAL slave_transaction_retries= @old_retries; SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** MDEV-7888: ANALYZE TABLE does wakeup_subsequent_commits(), causing wrong binlog order and parallel replication hang *** include/stop_slave.inc SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug= '+d,inject_analyze_table_sleep'; SET @old_dbug= @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,binlog_force_commit_id"; SET @commit_id= 10000; ANALYZE TABLE t2; Table Op Msg_type Msg_text test.t2 analyze status OK INSERT INTO t3 VALUES (120, 0); SET @commit_id= 10001; INSERT INTO t3 VALUES (121, 0); SET SESSION debug_dbug=@old_dbug; SELECT * FROM t3 WHERE a >= 120 ORDER BY a; a b 120 0 121 0 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t3 WHERE a >= 120 ORDER BY a; a b 120 0 121 0 include/stop_slave.inc SET GLOBAL debug_dbug= @old_dbug; include/start_slave.inc *** MDEV-7929: record_gtid() for non-transactional event group calls wakeup_subsequent_commits() too early, causing slave hang. *** include/stop_slave.inc SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug= '+d,inject_record_gtid_serverid_100_sleep'; SET @old_dbug= @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,binlog_force_commit_id"; SET @old_server_id= @@SESSION.server_id; SET SESSION server_id= 100; SET @commit_id= 10010; ALTER TABLE t1 COMMENT "Hulubulu!"; SET SESSION server_id= @old_server_id; INSERT INTO t3 VALUES (130, 0); SET @commit_id= 10011; INSERT INTO t3 VALUES (131, 0); SET SESSION debug_dbug=@old_dbug; SELECT * FROM t3 WHERE a >= 130 ORDER BY a; a b 130 0 131 0 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t3 WHERE a >= 130 ORDER BY a; a b 130 0 131 0 include/stop_slave.inc SET GLOBAL debug_dbug= @old_dbug; include/start_slave.inc *** MDEV-8031: Parallel replication stops on "connection killed" error (probably incorrectly handled deadlock kill) *** INSERT INTO t3 VALUES (201,0), (202,0); include/save_master_gtid.inc include/sync_with_master_gtid.inc include/stop_slave.inc SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug= '+d,inject_mdev8031'; SET @old_dbug= @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,binlog_force_commit_id"; SET @commit_id= 10200; INSERT INTO t3 VALUES (203, 1); INSERT INTO t3 VALUES (204, 1); INSERT INTO t3 VALUES (205, 1); UPDATE t3 SET b=b+1 WHERE a=201; UPDATE t3 SET b=b+1 WHERE a=201; UPDATE t3 SET b=b+1 WHERE a=201; UPDATE t3 SET b=b+1 WHERE a=202; UPDATE t3 SET b=b+1 WHERE a=202; UPDATE t3 SET b=b+1 WHERE a=202; UPDATE t3 SET b=b+1 WHERE a=202; UPDATE t3 SET b=b+1 WHERE a=203; UPDATE t3 SET b=b+1 WHERE a=203; UPDATE t3 SET b=b+1 WHERE a=204; UPDATE t3 SET b=b+1 WHERE a=204; UPDATE t3 SET b=b+1 WHERE a=204; UPDATE t3 SET b=b+1 WHERE a=203; UPDATE t3 SET b=b+1 WHERE a=205; UPDATE t3 SET b=b+1 WHERE a=205; SET SESSION debug_dbug=@old_dbug; SELECT * FROM t3 WHERE a>=200 ORDER BY a; a b 201 3 202 4 203 4 204 4 205 3 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t3 WHERE a>=200 ORDER BY a; a b 201 3 202 4 203 4 204 4 205 3 include/stop_slave.inc SET GLOBAL debug_dbug= @old_dbug; include/start_slave.inc *** Check getting deadlock killed inside open_binlog() during retry. *** include/stop_slave.inc SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug= '+d,inject_retry_event_group_open_binlog_kill'; SET @old_max= @@GLOBAL.max_relay_log_size; SET GLOBAL max_relay_log_size= 4096; SET @old_dbug= @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,binlog_force_commit_id"; SET @commit_id= 10210; Omit long queries that cause relaylog rotations and transaction retries... SET SESSION debug_dbug=@old_dbug; SELECT * FROM t3 WHERE a>=200 ORDER BY a; a b 201 6 202 8 203 7 204 7 205 5 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t3 WHERE a>=200 ORDER BY a; a b 201 6 202 8 203 7 204 7 205 5 include/stop_slave.inc SET GLOBAL debug_dbug= @old_debg; SET GLOBAL max_relay_log_size= @old_max; include/start_slave.inc *** MDEV-8302: Duplicate key with parallel replication *** include/stop_slave.inc /* Inject a small sleep which makes the race easier to hit. */ SET @old_dbug=@@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,inject_mdev8302"; INSERT INTO t7 VALUES (100,1), (101,2), (102,3), (103,4), (104,5); SET @old_dbug= @@SESSION.debug_dbug; SET @commit_id= 20000; SET SESSION debug_dbug="+d,binlog_force_commit_id"; SET SESSION debug_dbug=@old_dbug; SELECT * FROM t7 ORDER BY a; a b 1 1 2 2 3 86 4 4 5 5 100 5 101 1 102 2 103 3 104 4 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t7 ORDER BY a; a b 1 1 2 2 3 86 4 4 5 5 100 5 101 1 102 2 103 3 104 4 include/stop_slave.inc SET GLOBAL debug_dbug=@old_dbug; include/start_slave.inc *** MDEV-8725: Assertion on ROLLBACK statement in the binary log *** BEGIN; INSERT INTO t2 VALUES (2000); INSERT INTO t1 VALUES (2000); INSERT INTO t2 VALUES (2001); ROLLBACK; SELECT * FROM t1 WHERE a>=2000 ORDER BY a; a 2000 SELECT * FROM t2 WHERE a>=2000 ORDER BY a; a include/save_master_gtid.inc include/sync_with_master_gtid.inc SELECT * FROM t1 WHERE a>=2000 ORDER BY a; a 2000 SELECT * FROM t2 WHERE a>=2000 ORDER BY a; a include/stop_slave.inc SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc SET DEBUG_SYNC= 'RESET'; DROP function foo; DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8; SET DEBUG_SYNC= 'RESET'; include/rpl_end.inc