Hi Kristian, Can you please review this patch?
- Nirbhay On Fri, Nov 13, 2015 at 5:23 PM, Nirbhay Choubey <[email protected]> wrote: > revision-id: 096fd8f57664d0b3061f0e781a31bfa3cc6bf6cd > parent(s): a574407444fc3ea93ca88afa93dc18154251bf74 > committer: Nirbhay Choubey > branch nick: 10.1.b9033 > timestamp: 2015-11-13 17:23:49 -0500 > message: > > MDEV-9033 : Incorrect statements binlogged on slave with > do_domain_ids=(...) > > In domain ID based filtering, a flag is used to filter-out > the events that belong to a particular domain. This flag gets > set when IO thread receives a GTID_EVENT for the domain on > filter list and its reset at the last event in the GTID group. > The resetting, however, was wrongly done before the decision to > write/filter the event from relay log is made. As a result, the > last event in the group will always pass through the filter. > Fixed by deferring the reset logic. Also added a test case. > > --- > mysql-test/suite/rpl/r/rpl_gtid_mdev9033.result | 73 ++++++++++++++++++++ > mysql-test/suite/rpl/t/rpl_gtid_mdev9033.cnf | 20 ++++++ > mysql-test/suite/rpl/t/rpl_gtid_mdev9033.test | 92 > +++++++++++++++++++++++++ > sql/slave.cc | 19 +---- > 4 files changed, 188 insertions(+), 16 deletions(-) > > diff --git a/mysql-test/suite/rpl/r/rpl_gtid_mdev9033.result > b/mysql-test/suite/rpl/r/rpl_gtid_mdev9033.result > new file mode 100644 > index 0000000..fdee91f > --- /dev/null > +++ b/mysql-test/suite/rpl/r/rpl_gtid_mdev9033.result > @@ -0,0 +1,73 @@ > +include/rpl_init.inc [topology=1->2->3] > +include/stop_slave.inc > +CHANGE MASTER TO > +MASTER_USE_GTID = SLAVE_POS, IGNORE_SERVER_IDS = (2,3); > +CHANGE MASTER "M_3" TO > +MASTER_HOST = "127.0.0.1", MASTER_PORT = SERVER_MYPORT_3, > +MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > +IGNORE_SERVER_IDS = (1,2); > +START ALL SLAVES; > +Warnings: > +Note 1937 SLAVE 'M_3' started > +Note 1937 SLAVE '' started > +include/stop_slave.inc > +CHANGE MASTER "M_1" TO > +MASTER_HOST = "127.0.0.1", MASTER_PORT = MASTER_MYPORT, > +MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > +IGNORE_SERVER_IDS = (2,3); > +CHANGE MASTER TO > +MASTER_USE_GTID = SLAVE_POS, IGNORE_SERVER_IDS = (1,3); > +START ALL SLAVES; > +Warnings: > +Note 1937 SLAVE 'M_1' started > +Note 1937 SLAVE '' started > +CHANGE MASTER "M_2" TO > +MASTER_HOST = "127.0.0.1", MASTER_PORT = SLAVE_MYPORT, > +MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > +IGNORE_SERVER_IDS = (1,3); > +CHANGE MASTER "M_3" TO > +MASTER_HOST = "127.0.0.1", MASTER_PORT = SERVER_MYPORT_3, > +MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > +IGNORE_SERVER_IDS = (1,2); > +START ALL SLAVES; > +Warnings: > +Note 1937 SLAVE 'M_3' started > +Note 1937 SLAVE 'M_2' started > +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(10)) ENGINE=InnoDB; > +INSERT INTO t1 VALUES (1, "m1"); > +INSERT INTO t1 VALUES (2, "m2"), (3, "m3"), (4, "m4"); > +include/save_master_gtid.inc > +include/sync_with_master_gtid.inc > +SELECT * FROM t1 ORDER BY a; > +a b > +1 m1 > +2 m2 > +3 m3 > +4 m4 > +include/sync_with_master_gtid.inc > +SELECT * FROM t1 ORDER BY a; > +a b > +1 m1 > +2 m2 > +3 m3 > +4 m4 > +# Cleanup > +DROP TABLE t1; > +include/save_master_gtid.inc > +include/sync_with_master_gtid.inc > +include/sync_with_master_gtid.inc > +STOP SLAVE "M_3"; > +RESET SLAVE "M_3" ALL; > +STOP SLAVE "M_1"; > +RESET SLAVE "M_1" ALL; > +STOP SLAVE "M_2"; > +RESET SLAVE "M_2" ALL; > +STOP SLAVE "M_3"; > +RESET SLAVE "M_3" ALL; > +include/sync_with_master_gtid.inc > +STOP SLAVE; > +CHANGE MASTER TO MASTER_USE_GTID = NO, IGNORE_SERVER_IDS = (); > +include/sync_with_master_gtid.inc > +STOP SLAVE; > +CHANGE MASTER TO MASTER_USE_GTID = NO, IGNORE_SERVER_IDS = (); > +# End of test. > diff --git a/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.cnf > b/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.cnf > new file mode 100644 > index 0000000..80b6649 > --- /dev/null > +++ b/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.cnf > @@ -0,0 +1,20 @@ > +!include ../my.cnf > + > +[mysqld.1] > +log-slave-updates > +loose-innodb > +gtid_domain_id=1 > + > +[mysqld.2] > +log-slave-updates > +loose-innodb > +gtid_domain_id=2 > + > +[mysqld.3] > +log-slave-updates > +loose-innodb > +gtid_domain_id=3 > + > +[ENV] > +SERVER_MYPORT_3= @mysqld.3.port > +SERVER_MYSOCK_3= @mysqld.3.socket > diff --git a/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.test > b/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.test > new file mode 100644 > index 0000000..8b51d96 > --- /dev/null > +++ b/mysql-test/suite/rpl/t/rpl_gtid_mdev9033.test > @@ -0,0 +1,92 @@ > +--source include/have_innodb.inc > +--let $rpl_topology=1->2->3 > +--source include/rpl_init.inc > + > +--connection server_2 > +--source include/stop_slave.inc > +eval CHANGE MASTER TO > + MASTER_USE_GTID = SLAVE_POS, IGNORE_SERVER_IDS = (2,3); > +--replace_result $SERVER_MYPORT_3 SERVER_MYPORT_3 > +eval CHANGE MASTER "M_3" TO > + MASTER_HOST = "127.0.0.1", MASTER_PORT = $SERVER_MYPORT_3, > + MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > + IGNORE_SERVER_IDS = (1,2); > +START ALL SLAVES; > + > +--connection server_3 > +--source include/stop_slave.inc > +--replace_result $MASTER_MYPORT MASTER_MYPORT > +eval CHANGE MASTER "M_1" TO > + MASTER_HOST = "127.0.0.1", MASTER_PORT = $MASTER_MYPORT, > + MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > + IGNORE_SERVER_IDS = (2,3); > +eval CHANGE MASTER TO > + MASTER_USE_GTID = SLAVE_POS, IGNORE_SERVER_IDS = (1,3); > +START ALL SLAVES; > + > +--connection server_1 > +--replace_result $SLAVE_MYPORT SLAVE_MYPORT > +eval CHANGE MASTER "M_2" TO > + MASTER_HOST = "127.0.0.1", MASTER_PORT = $SLAVE_MYPORT, > + MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > + IGNORE_SERVER_IDS = (1,3); > +--replace_result $SERVER_MYPORT_3 SERVER_MYPORT_3 > +eval CHANGE MASTER "M_3" TO > + MASTER_HOST = "127.0.0.1", MASTER_PORT = $SERVER_MYPORT_3, > + MASTER_USER = "root", MASTER_USE_GTID = SLAVE_POS, > + IGNORE_SERVER_IDS = (1,2); > +START ALL SLAVES; > + > +connection server_1; > + > +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(10)) ENGINE=InnoDB; > +INSERT INTO t1 VALUES (1, "m1"); > +INSERT INTO t1 VALUES (2, "m2"), (3, "m3"), (4, "m4"); > + > +--source include/save_master_gtid.inc > + > +connection server_2; > +--source include/sync_with_master_gtid.inc > +let $wait_condition=SELECT COUNT(*)=4 FROM t1; > +--source include/wait_condition.inc > +SELECT * FROM t1 ORDER BY a; > + > +connection server_3; > +--source include/sync_with_master_gtid.inc > +--source include/wait_condition.inc > +SELECT * FROM t1 ORDER BY a; > + > +--echo # Cleanup > +--connection server_1 > +DROP TABLE t1; > +--source include/save_master_gtid.inc > +--connection server_2 > +--source include/sync_with_master_gtid.inc > +--connection server_3 > +--source include/sync_with_master_gtid.inc > + > +--connection server_2 > +STOP SLAVE "M_3"; > +RESET SLAVE "M_3" ALL; > + > +--connection server_3 > +STOP SLAVE "M_1"; > +RESET SLAVE "M_1" ALL; > + > +--connection server_1 > +STOP SLAVE "M_2"; > +RESET SLAVE "M_2" ALL; > +STOP SLAVE "M_3"; > +RESET SLAVE "M_3" ALL; > + > +--connection server_2 > +--source include/sync_with_master_gtid.inc > +STOP SLAVE; > +CHANGE MASTER TO MASTER_USE_GTID = NO, IGNORE_SERVER_IDS = (); > + > +--connection server_3 > +--source include/sync_with_master_gtid.inc > +STOP SLAVE; > +CHANGE MASTER TO MASTER_USE_GTID = NO, IGNORE_SERVER_IDS = (); > + > +--echo # End of test. > diff --git a/sql/slave.cc b/sql/slave.cc > index fed171b..b93fb3d 100644 > --- a/sql/slave.cc > +++ b/sql/slave.cc > @@ -5870,22 +5870,6 @@ static int queue_event(Master_info* mi,const char* > buf, ulong event_len) > } > };); > > - if (mi->using_gtid != Master_info::USE_GTID_NO && > - mi->domain_id_filter.is_group_filtered() && > - mi->events_queued_since_last_gtid > 0 && > - ((mi->last_queued_gtid_standalone && > - !Log_event::is_part_of_group((Log_event_type)(uchar) > - buf[EVENT_TYPE_OFFSET])) || > - (!mi->last_queued_gtid_standalone && > - ((uchar)buf[EVENT_TYPE_OFFSET] == XID_EVENT || > - ((uchar)buf[EVENT_TYPE_OFFSET] == QUERY_EVENT && > - Query_log_event::peek_is_commit_rollback(buf, event_len, > - checksum_alg)))))) > - { > - /* Reset the domain_id_filter flag. */ > - mi->domain_id_filter.reset_filter(); > - } > - > if (mi->using_gtid != Master_info::USE_GTID_NO && mi->gtid_event_seen) > { > if (unlikely(mi->gtid_reconnect_event_skip_count)) > @@ -6071,6 +6055,9 @@ static int queue_event(Master_info* mi,const char* > buf, ulong event_len) > */ > mi->gtid_current_pos.update(&mi->last_queued_gtid); > mi->events_queued_since_last_gtid= 0; > + > + /* Reset the domain_id_filter flag. */ > + mi->domain_id_filter.reset_filter(); > } > > skip_relay_logging: > _______________________________________________ > commits mailing list > [email protected] > https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
_______________________________________________ Mailing list: https://launchpad.net/~maria-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~maria-developers More help : https://help.launchpad.net/ListHelp

