include/master-slave.inc [connection master] ALTER TABLE mysql.gtid_slave_pos ENGINE=TokuDB; CREATE TABLE t1 (a int PRIMARY KEY, b INT, UNIQUE KEY (b)) ENGINE=TokuDB; SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; include/stop_slave.inc SET GLOBAL slave_parallel_threads=10; CHANGE MASTER TO master_use_gtid=slave_pos; SET @old_parallel_mode=@@GLOBAL.slave_parallel_mode; SET GLOBAL slave_parallel_mode='optimistic'; INSERT INTO t1 VALUES(1,1); BEGIN; INSERT INTO t1 VALUES(2,2); INSERT INTO t1 VALUES(3,3); COMMIT; DELETE FROM t1 WHERE a=2; INSERT INTO t1 VALUES (2,2); DELETE FROM t1 WHERE a=2; INSERT INTO t1 VALUES (2,6); DELETE FROM t1 WHERE a=2; INSERT INTO t1 VALUES (2,4); DELETE FROM t1 WHERE a=2; INSERT INTO t1 VALUES (2,5); DELETE FROM t1 WHERE a=3; INSERT INTO t1 VALUES(3,3); DELETE FROM t1 WHERE a=1; INSERT INTO t1 VALUES(1,4); DELETE FROM t1 WHERE a=3; INSERT INTO t1 VALUES(3,3); DELETE FROM t1 WHERE a=2; INSERT INTO t1 VALUES (2,6); include/save_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 3 include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 3 *** Test a bunch of non-transactional/DDL event groups. *** include/stop_slave.inc INSERT INTO t1 VALUES (4,8); INSERT INTO t1 VALUES (5,9); CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=TokuDB; INSERT INTO t2 VALUES (1); CREATE TABLE t3 (a INT PRIMARY KEY) ENGINE=MyISAM; ALTER TABLE t2 ADD b INT; INSERT INTO t2 VALUES (2,2); ALTER TABLE t2 DROP b; INSERT INTO t2 VALUES (3); ALTER TABLE t2 ADD c INT; INSERT INTO t2 VALUES (4,5); INSERT INTO t2 VALUES (5,5); INSERT INTO t3 VALUES (1); UPDATE t2 SET c=NULL WHERE a=4; ALTER TABLE t2 ADD UNIQUE (c); INSERT INTO t2 VALUES (6,6); UPDATE t2 SET c=c+100 WHERE a=2; INSERT INTO t3(a) VALUES (2); DELETE FROM t3 WHERE a=2; INSERT INTO t3(a) VALUES (2); DELETE FROM t3 WHERE a=2; ALTER TABLE t3 CHANGE a c INT NOT NULL; INSERT INTO t3(c) VALUES (2); DELETE FROM t3 WHERE c=2; INSERT INTO t3 SELECT a+200 FROM t2; DELETE FROM t3 WHERE c >= 200; INSERT INTO t3 SELECT a+200 FROM t2; include/save_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 3 4 8 5 9 SELECT * FROM t2 ORDER BY a; a c 1 NULL 2 NULL 3 NULL 4 NULL 5 5 6 6 SELECT * FROM t3 ORDER BY c; c 1 201 202 203 204 205 206 include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 3 4 8 5 9 SELECT * FROM t2 ORDER BY a; a c 1 NULL 2 NULL 3 NULL 4 NULL 5 5 6 6 SELECT * FROM t3 ORDER BY c; c 1 201 202 203 204 205 206 *** Test @@skip_parallel_replication. *** include/stop_slave.inc UPDATE t1 SET b=10 WHERE a=3; SET SESSION skip_parallel_replication=1; UPDATE t1 SET b=20 WHERE a=3; UPDATE t1 SET b=30 WHERE a=3; UPDATE t1 SET b=50 WHERE a=3; UPDATE t1 SET b=80 WHERE a=3; UPDATE t1 SET b=130 WHERE a=3; UPDATE t1 SET b=210 WHERE a=3; UPDATE t1 SET b=340 WHERE a=3; UPDATE t1 SET b=550 WHERE a=3; UPDATE t1 SET b=890 WHERE a=3; SET SESSION skip_parallel_replication=0; SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 890 4 8 5 9 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 4 2 6 3 890 4 8 5 9 status Ok, no retry *** Test that we do not replicate in parallel transactions that had row lock waits on the master *** include/stop_slave.inc BEGIN; UPDATE t1 SET b=b+1 WHERE a=3; SET debug_sync='thd_report_wait_for SIGNAL waiting1'; UPDATE t1 SET b=1001 WHERE a=3; SET debug_sync='now WAIT_FOR waiting1'; BEGIN; UPDATE t1 SET b=1002 WHERE a=5; SET debug_sync='thd_report_wait_for SIGNAL waiting2'; UPDATE t1 SET b=102 WHERE a=3; SET debug_sync='now WAIT_FOR waiting2'; UPDATE t1 SET b=1000 WHERE a=1; SET debug_sync='thd_report_wait_for SIGNAL waiting3'; UPDATE t1 SET b=1003 WHERE a=5; SET debug_sync='now WAIT_FOR waiting3'; SET debug_sync='thd_report_wait_for SIGNAL waiting4'; UPDATE t1 SET b=1004 WHERE a=3; SET debug_sync='now WAIT_FOR waiting4'; SET debug_sync='thd_report_wait_for SIGNAL waiting5'; UPDATE t1 SET b=1005 WHERE a=5; SET debug_sync='now WAIT_FOR waiting5'; SET debug_sync='thd_report_wait_for SIGNAL waiting6'; UPDATE t1 SET b=1006 WHERE a=1; SET debug_sync='now WAIT_FOR waiting6'; SET debug_sync='thd_report_wait_for SIGNAL waiting7'; UPDATE t1 SET b=1007 WHERE a=5; SET debug_sync='now WAIT_FOR waiting7'; SET debug_sync='thd_report_wait_for SIGNAL waiting8'; UPDATE t1 SET b=1008 WHERE a=3; SET debug_sync='now WAIT_FOR waiting8'; COMMIT; COMMIT; SET debug_sync='RESET'; include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT IF(@master_value=@slave_value, "Slave data matches master", CONCAT("ERROR: Slave had different data '", @slave_value, "' than master's '", @master_value, "'!")) as check_result; check_result Slave data matches master status Ok, no retry *** Test that we replicate correctly when using READ COMMITTED and binlog_format=MIXED on the slave *** include/stop_slave.inc SET @old_format= @@GLOBAL.binlog_format; SET GLOBAL binlog_format= MIXED; SET @old_isolation= @@GLOBAL.tx_isolation; SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; SET GLOBAL slave_parallel_threads=0; SET GLOBAL slave_parallel_threads=10; DROP TABLE t1, t2; CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=TokuDB; CREATE TABLE t2 (a int PRIMARY KEY, b INT) ENGINE=TokuDB; INSERT INTO t1 VALUES (1,0), (2,0), (3,0); INSERT INTO t2 VALUES (1,0), (2,0); INSERT INTO t1 SELECT 4, COUNT(*) FROM t2; INSERT INTO t2 SELECT 4, COUNT(*) FROM t1; INSERT INTO t1 SELECT 5, COUNT(*) FROM t2; INSERT INTO t2 SELECT 5, COUNT(*) FROM t1; INSERT INTO t2 SELECT 6, COUNT(*) FROM t1; INSERT INTO t1 SELECT 6, COUNT(*) FROM t2; INSERT INTO t1 SELECT 7, COUNT(*) FROM t2; INSERT INTO t2 SELECT 7, COUNT(*) FROM t1; INSERT INTO t2 SELECT 8, COUNT(*) FROM t1; INSERT INTO t1 SELECT 8, COUNT(*) FROM t2; INSERT INTO t2 SELECT 9, COUNT(*) FROM t1; INSERT INTO t1 SELECT 9, COUNT(*) FROM t2; INSERT INTO t1 SELECT 10, COUNT(*) FROM t2; INSERT INTO t2 SELECT 10, COUNT(*) FROM t1; SELECT * FROM t1 ORDER BY a; a b 1 0 2 0 3 0 4 2 5 3 6 5 7 5 8 7 9 8 10 8 SELECT * FROM t2 ORDER BY a; a b 1 0 2 0 4 4 5 5 6 5 7 7 8 7 9 8 10 10 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 0 2 0 3 0 4 2 5 3 6 5 7 5 8 7 9 8 10 8 SELECT * FROM t2 ORDER BY a; a b 1 0 2 0 4 4 5 5 6 5 7 7 8 7 9 8 10 10 include/stop_slave.inc SET GLOBAL binlog_format= @old_format; SET GLOBAL tx_isolation= @old_isolation; include/start_slave.inc *** MDEV-7888: ANALYZE TABLE does wakeup_subsequent_commits(), causing wrong binlog order and parallel replication hang *** DROP TABLE t1, t2, t3; CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=TokuDB; CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=TokuDB; CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=MyISAM; INSERT INTO t2 VALUES (1,1), (2,1), (3,1), (4,1), (5,1); 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_analyze_table_sleep'; ALTER TABLE t2 COMMENT "123abc"; ANALYZE TABLE t2; Table Op Msg_type Msg_text test.t2 analyze status OK INSERT INTO t1 VALUES (1,2); INSERT INTO t1 VALUES (2,2); INSERT INTO t1 VALUES (3,2); INSERT INTO t1 VALUES (4,2); INSERT INTO t3 VALUES (1,3); ALTER TABLE t2 COMMENT "hello, world"; BEGIN; INSERT INTO t1 VALUES (5,4); INSERT INTO t1 VALUES (6,4); INSERT INTO t1 VALUES (7,4); INSERT INTO t1 VALUES (8,4); INSERT INTO t1 VALUES (9,4); INSERT INTO t1 VALUES (10,4); INSERT INTO t1 VALUES (11,4); INSERT INTO t1 VALUES (12,4); INSERT INTO t1 VALUES (13,4); INSERT INTO t1 VALUES (14,4); INSERT INTO t1 VALUES (15,4); INSERT INTO t1 VALUES (16,4); INSERT INTO t1 VALUES (17,4); INSERT INTO t1 VALUES (18,4); INSERT INTO t1 VALUES (19,4); INSERT INTO t1 VALUES (20,4); COMMIT; INSERT INTO t1 VALUES (21,5); INSERT INTO t1 VALUES (22,5); SELECT * FROM t1 ORDER BY a; a b 1 2 2 2 3 2 4 2 5 4 6 4 7 4 8 4 9 4 10 4 11 4 12 4 13 4 14 4 15 4 16 4 17 4 18 4 19 4 20 4 21 5 22 5 SELECT * FROM t2 ORDER BY a; a b 1 1 2 1 3 1 4 1 5 1 SELECT * FROM t3 ORDER BY a; a b 1 3 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 ORDER BY a; a b 1 2 2 2 3 2 4 2 5 4 6 4 7 4 8 4 9 4 10 4 11 4 12 4 13 4 14 4 15 4 16 4 17 4 18 4 19 4 20 4 21 5 22 5 SELECT * FROM t2 ORDER BY a; a b 1 1 2 1 3 1 4 1 5 1 SELECT * FROM t3 ORDER BY a; a b 1 3 include/stop_slave.inc SET GLOBAL debug_dbug= @old_debug; 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'; ALTER TABLE t3 COMMENT "DDL statement 1"; INSERT INTO t1 VALUES (30,0); INSERT INTO t1 VALUES (31,0); INSERT INTO t1 VALUES (32,0); INSERT INTO t1 VALUES (33,0); INSERT INTO t1 VALUES (34,0); INSERT INTO t1 VALUES (35,0); INSERT INTO t1 VALUES (36,0); SET @old_server_id= @@SESSION.server_id; SET SESSION server_id= 100; ANALYZE TABLE t2; Table Op Msg_type Msg_text test.t2 analyze status OK SET SESSION server_id= @old_server_id; INSERT INTO t1 VALUES (37,0); ALTER TABLE t3 COMMENT "DDL statement 2"; INSERT INTO t1 VALUES (38,0); INSERT INTO t1 VALUES (39,0); ALTER TABLE t3 COMMENT "DDL statement 3"; SELECT * FROM t1 WHERE a >= 30 ORDER BY a; a b 30 0 31 0 32 0 33 0 34 0 35 0 36 0 37 0 38 0 39 0 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t1 WHERE a >= 30 ORDER BY a; a b 30 0 31 0 32 0 33 0 34 0 35 0 36 0 37 0 38 0 39 0 include/stop_slave.inc SET GLOBAL debug_dbug= @old_debug; include/start_slave.inc *** MDEV-8113: ALTER TABLE causes slave hang in optimistic parallel replication *** include/stop_slave.inc ALTER TABLE t2 ADD c INT; INSERT INTO t2 (a,b) VALUES (50, 0); INSERT INTO t2 (a,b) VALUES (51, 1); INSERT INTO t2 (a,b) VALUES (52, 2); INSERT INTO t2 (a,b) VALUES (53, 3); INSERT INTO t2 (a,b) VALUES (54, 4); INSERT INTO t2 (a,b) VALUES (55, 5); INSERT INTO t2 (a,b) VALUES (56, 6); INSERT INTO t2 (a,b) VALUES (57, 7); INSERT INTO t2 (a,b) VALUES (58, 8); INSERT INTO t2 (a,b) VALUES (59, 9); ALTER TABLE t2 DROP COLUMN c; SELECT * FROM t2 WHERE a >= 50 ORDER BY a; a b 50 0 51 1 52 2 53 3 54 4 55 5 56 6 57 7 58 8 59 9 include/save_master_gtid.inc include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 WHERE a >= 50 ORDER BY a; a b 50 0 51 1 52 2 53 3 54 4 55 5 56 6 57 7 58 8 59 9 include/stop_slave.inc SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc DROP TABLE t1, t2, t3; include/rpl_end.inc