diff options
Diffstat (limited to 'mysql-test/suite/multi_source/gtid_ignore_duplicates.test')
-rw-r--r-- | mysql-test/suite/multi_source/gtid_ignore_duplicates.test | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/mysql-test/suite/multi_source/gtid_ignore_duplicates.test b/mysql-test/suite/multi_source/gtid_ignore_duplicates.test index cf1c750fc19..1eea038f8c9 100644 --- a/mysql-test/suite/multi_source/gtid_ignore_duplicates.test +++ b/mysql-test/suite/multi_source/gtid_ignore_duplicates.test @@ -1,5 +1,7 @@ --source include/not_embedded.inc --source include/have_innodb.inc +--source include/have_debug.inc + --echo *** Test all-to-all replication with --gtid-ignore-duplicates *** @@ -258,6 +260,146 @@ SELECT * FROM t1 WHERE a >= 20 ORDER BY a; SELECT * FROM t1 WHERE a >= 20 ORDER BY a; +--echo *** MDEV-8354: out-of-order error with --gtid-ignore-duplicates and row-based replication *** + +# Have only A->C A->B initially. +--connection server_1 +SET default_master_connection = "b2a"; +STOP SLAVE; +--source include/wait_for_slave_to_stop.inc +SET default_master_connection = "c2a"; +STOP SLAVE; +--source include/wait_for_slave_to_stop.inc + +--connection server_2 +SET default_master_connection = "c2b"; +STOP SLAVE; +--source include/wait_for_slave_to_stop.inc + +--connection server_3 +SET default_master_connection = "b2c"; +STOP SLAVE; +--source include/wait_for_slave_to_stop.inc +SET @old_slave_mode=@@GLOBAL.slave_exec_mode; +SET GLOBAL slave_exec_mode=IDEMPOTENT; +SET @old_strict=@@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode=1; + +SET @old_dbug=@@GLOBAL.debug_dbug; +# This will inject a small sleep that helps trigger the race. I did not manage +# to create a non-sleeping version with debug_sync for this; the problem is +# that once the bug is fixed, the race becomes impossible, so even with +# debug_sync at best we can check that the debug_sync times out. Which is +# just another way of adding a sleep. +# +# The bug was a race at this point where another multi-source connection +# could incorrectly re-apply the same GTID, in case of row-based replication. +SET GLOBAL debug_dbug="+d,inject_sleep_gtid_100_x_x"; + +--connection server_1 +SET @old_domain=@@SESSION.gtid_domain_id; +SET @old_format=@@SESSION.binlog_format; +SET SESSION gtid_domain_id=100; +SET SESSION binlog_format='row'; +INSERT INTO t1 VALUES (30); +INSERT INTO t1 VALUES (31); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (33); +INSERT INTO t1 VALUES (34); +INSERT INTO t1 VALUES (35); +INSERT INTO t1 VALUES (36); +INSERT INTO t1 VALUES (37); +INSERT INTO t1 VALUES (38); +INSERT INTO t1 VALUES (39); +INSERT INTO t1 VALUES (40); +INSERT INTO t1 VALUES (41); +INSERT INTO t1 VALUES (42); +INSERT INTO t1 VALUES (43); +INSERT INTO t1 VALUES (44); +INSERT INTO t1 VALUES (45); +INSERT INTO t1 VALUES (46); +INSERT INTO t1 VALUES (47); +INSERT INTO t1 VALUES (48); +INSERT INTO t1 VALUES (49); +SET SESSION gtid_domain_id=@old_domain; +SET SESSION binlog_format=@old_format; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +INSERT INTO t1 VALUES (50); +--let $gtid=`SELECT @@last_gtid` +--source include/save_master_gtid.inc + +--connection server_3 +SET default_master_connection = "b2c"; +START SLAVE; +--source include/wait_for_slave_to_start.inc +--replace_result $gtid GTID +eval SELECT MASTER_GTID_WAIT("$gtid", 30); +# The bug occured here, the slave would get an out-of-order binlog error +# due to trying to re-apply the 100-x-x transaction. + +# Restart stopped multi-source connections, and sync up. +--connection server_1 +SET default_master_connection = "b2a"; +START SLAVE; +--source include/wait_for_slave_to_start.inc +SET default_master_connection = "c2a"; +START SLAVE; +--source include/wait_for_slave_to_start.inc +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 30 ORDER BY a; + +--connection server_2 +SET default_master_connection = "c2b"; +START SLAVE; +--source include/wait_for_slave_to_start.inc +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 30 ORDER BY a; + +--connection server_3 +--source include/sync_with_master_gtid.inc +SET GLOBAL debug_dbug=@old_dbug; +SELECT * FROM t1 WHERE a >= 30 ORDER BY a; +SET GLOBAL slave_exec_mode=@old_slave_mode; +SET GLOBAL gtid_strict_mode=@old_strict; + + +--echo *** MDEV-8496: gtid_ignore_duplicates treats gtid_seq_no as 32-bit *** + +--connection server_1 +SET @old_domain= @@SESSION.gtid_domain_id; +SET SESSION gtid_domain_id=102; +SET SESSION gtid_seq_no=4294967294; +INSERT INTO t1 VALUES (60); +INSERT INTO t1 VALUES (61); +INSERT INTO t1 VALUES (62); +# The bug was an overflow, the seq_no value 4294967296 (2**32) was treated +# as 0, causing the last transaction to be ignored. +SET SESSION gtid_domain_id= @old_domain; +--source include/save_master_gtid.inc + +--connection server_4 +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 60 ORDER BY a; + +--connection server_2 +SET default_master_connection = "c2b"; +--source include/sync_with_master_gtid.inc +SET default_master_connection = "a2b"; +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 60 ORDER BY a; + +--connection server_3 +SET default_master_connection = "b2c"; +--source include/sync_with_master_gtid.inc +SET default_master_connection = "a2c"; +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 60 ORDER BY a; + + + # Clean up. --connection server_1 SET GLOBAL gtid_domain_id=0; |