Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDEV-26632: multi source replication filters breaking GTID semantic
Add a test case that demonstrates a working setup as described in MDEV-26632. This requires --gtid-ignore-duplicates=1 and --gtid-strict-mode=0. In A->B->C, B filters some (but not all) events from A. C is promoted to create A->C->B, and the current GTID position in B contains a GTID from A that is not present in C (due to filtering). Demonstrate that B can still connect with GTID to C, starting at the "hole" in the binlog stream on C originating from A. Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
- Loading branch information
Showing
3 changed files
with
215 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
include/rpl_init.inc [topology=1->2->3] | ||
*** Test GTID master switch in a topology with filtered events. | ||
*** With --gtid-ignore-duplicate and --gtid-strict-mode, should allow | ||
*** GTID connect at a GTID position that is filtered on the new master. | ||
connection server_1; | ||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; | ||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t1 VALUES (1,1); | ||
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t3 VALUES (1,1); | ||
INSERT INTO t1 VALUES (2,1); | ||
INSERT INTO t3 VALUES (2,1); | ||
include/save_master_gtid.inc | ||
connection server_2; | ||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t2 VALUES (1,2); | ||
include/sync_with_master_gtid.inc | ||
include/save_master_gtid.inc | ||
connection server_3; | ||
include/sync_with_master_gtid.inc | ||
*** Promote 3 as new master, demote 2 as slave of 3. | ||
*** GTID position of 2 in domain 0 is filtered on 3. | ||
connection server_2; | ||
include/stop_slave.inc | ||
connection server_3; | ||
include/stop_slave.inc | ||
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
connection server_2; | ||
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_3, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
include/start_slave.inc | ||
connection server_3; | ||
include/start_slave.inc | ||
connection server_1; | ||
INSERT INTO t1 VALUES (3,1); | ||
INSERT INTO t3 VALUES (3,1); | ||
include/save_master_gtid.inc | ||
connection server_3; | ||
INSERT INTO t2 VALUES (2,2); | ||
include/sync_with_master_gtid.inc | ||
include/save_master_gtid.inc | ||
connection server_2; | ||
include/sync_with_master_gtid.inc | ||
SELECT * FROM t1 ORDER BY a; | ||
a b | ||
1 1 | ||
2 1 | ||
3 1 | ||
SELECT * FROM t3 ORDER BY a; | ||
ERROR 42S02: Table 'test.t3' doesn't exist | ||
SELECT * FROM t2 ORDER BY a; | ||
a b | ||
1 2 | ||
2 2 | ||
*** Restore original topology. | ||
connection server_3; | ||
include/stop_slave.inc | ||
connection server_2; | ||
include/stop_slave.inc | ||
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
include/start_slave.inc | ||
connection server_3; | ||
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
include/start_slave.inc | ||
connection server_1; | ||
DROP TABLE t1; | ||
DROP TABLE t3; | ||
include/save_master_gtid.inc | ||
connection server_2; | ||
DROP TABLE t2; | ||
include/sync_with_master_gtid.inc | ||
include/save_master_gtid.inc | ||
connection server_3; | ||
include/sync_with_master_gtid.inc | ||
include/rpl_end.inc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
!include ../my.cnf | ||
|
||
[mysqld.1] | ||
log-slave-updates | ||
loose-innodb | ||
gtid-domain-id=1 | ||
gtid-strict-mode=0 | ||
gtid-ignore-duplicates=1 | ||
|
||
[mysqld.2] | ||
log-slave-updates | ||
loose-innodb | ||
gtid-domain-id=0 | ||
replicate-ignore-table=test.t3 | ||
gtid-strict-mode=0 | ||
gtid-ignore-duplicates=1 | ||
|
||
[mysqld.3] | ||
log-slave-updates | ||
loose-innodb | ||
gtid-domain-id=0 | ||
replicate-ignore-table=test.t3 | ||
gtid-strict-mode=0 | ||
gtid-ignore-duplicates=1 | ||
|
||
[ENV] | ||
SERVER_MYPORT_3= @mysqld.3.port | ||
SERVER_MYSOCK_3= @mysqld.3.socket |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
--source include/have_innodb.inc | ||
--source include/have_binlog_format_mixed.inc | ||
|
||
--let $rpl_topology=1->2->3 | ||
--source include/rpl_init.inc | ||
|
||
--echo *** Test GTID master switch in a topology with filtered events. | ||
--echo *** With --gtid-ignore-duplicate and --gtid-strict-mode, should allow | ||
--echo *** GTID connect at a GTID position that is filtered on the new master. | ||
|
||
--connection server_1 | ||
|
||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; | ||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t1 VALUES (1,1); | ||
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t3 VALUES (1,1); | ||
INSERT INTO t1 VALUES (2,1); | ||
INSERT INTO t3 VALUES (2,1); | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_2 | ||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; | ||
INSERT INTO t2 VALUES (1,2); | ||
|
||
--let $slave_timeout= 10 | ||
--source include/sync_with_master_gtid.inc | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_3 | ||
--source include/sync_with_master_gtid.inc | ||
|
||
--echo *** Promote 3 as new master, demote 2 as slave of 3. | ||
--echo *** GTID position of 2 in domain 0 is filtered on 3. | ||
|
||
--connection server_2 | ||
--source include/stop_slave.inc | ||
|
||
--connection server_3 | ||
--source include/stop_slave.inc | ||
--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1 | ||
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_1, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
|
||
--connection server_2 | ||
--replace_result $SERVER_MYPORT_3 SERVER_MYPORT_3 | ||
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_3, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
--source include/start_slave.inc | ||
|
||
--connection server_3 | ||
--source include/start_slave.inc | ||
|
||
--connection server_1 | ||
INSERT INTO t1 VALUES (3,1); | ||
INSERT INTO t3 VALUES (3,1); | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_3 | ||
INSERT INTO t2 VALUES (2,2); | ||
|
||
--source include/sync_with_master_gtid.inc | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_2 | ||
--source include/sync_with_master_gtid.inc | ||
|
||
SELECT * FROM t1 ORDER BY a; | ||
# Verify that table t3 is being filtered. | ||
--error 1146 | ||
SELECT * FROM t3 ORDER BY a; | ||
SELECT * FROM t2 ORDER BY a; | ||
|
||
|
||
--echo *** Restore original topology. | ||
|
||
--connection server_3 | ||
--source include/stop_slave.inc | ||
|
||
--connection server_2 | ||
--source include/stop_slave.inc | ||
--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1 | ||
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_1, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
--source include/start_slave.inc | ||
|
||
--connection server_3 | ||
--replace_result $SERVER_MYPORT_2 SERVER_MYPORT_2 | ||
eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_2, | ||
MASTER_USE_GTID=SLAVE_POS; | ||
--source include/start_slave.inc | ||
|
||
|
||
# Cleanup | ||
|
||
--connection server_1 | ||
DROP TABLE t1; | ||
DROP TABLE t3; | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_2 | ||
DROP TABLE t2; | ||
--source include/sync_with_master_gtid.inc | ||
--source include/save_master_gtid.inc | ||
|
||
--connection server_3 | ||
--source include/sync_with_master_gtid.inc | ||
|
||
--source include/rpl_end.inc |