Skip to content

Commit

Permalink
MDEV-8874 Replication filters configured in my.cnf are ignored if sla…
Browse files Browse the repository at this point in the history
…ve reset and reconfigured

Don't delete the rpl_filter on RESET SLAVE.
  • Loading branch information
mariadb-SachinSetiya committed Jun 27, 2019
1 parent aa55d93 commit 7f2cfa8
Show file tree
Hide file tree
Showing 5 changed files with 287 additions and 3 deletions.
8 changes: 7 additions & 1 deletion mysql-test/lib/My/Config.pm
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,13 @@ sub new {
# Skip comment
next;
}

# Correctly process Replication Filter when they are defined
# with connection name.
elsif ( $line =~ /^([\w]+.[\w]+)\s*=\s*(.*)\s*/){
my $option= $1;
my $value= $2;
$self->insert($group_name, $option, $value);
}
else {
croak "Unexpected line '$line' found in '$path'";
}
Expand Down
25 changes: 25 additions & 0 deletions mysql-test/suite/multi_source/mdev-8874.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
!include my.cnf

[mysqld.1]
log-bin
log-slave-updates

[mysqld.2]
log-bin
log-slave-updates

[mysqld.3]
log-bin
log-slave-updates

[mysqld.4]
server-id=4
log-bin=server4-bin
log-slave-updates
m1.replicate_ignore_table='a.t1'
m2.replicate_ignore_table='b.t1'
replicate_ignore_table='c.t1'

[ENV]
SERVER_MYPORT_4= @mysqld.4.port
SERVER_MYSOCK_4= @mysqld.4.socket
114 changes: 114 additions & 0 deletions mysql-test/suite/multi_source/mdev-8874.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
create database a;
use a;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
create database b;
use b;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
create database c;
use c;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
change master 'm1' to master_port=MYPORT_1 , master_host='127.0.0.1', master_user='root';
change master 'm2' to master_port=MYPORT_2 , master_host='127.0.0.1', master_user='root';
change master to master_port=MYPORT_3 , master_host='127.0.0.1', master_user='root';
start all slaves;
set default_master_connection = 'm1';
include/wait_for_slave_to_start.inc
set default_master_connection = 'm2';
include/wait_for_slave_to_start.inc
set default_master_connection = '';
include/wait_for_slave_to_start.inc
select @@global.'m1'.replicate_ignore_table;
@@global.'m1'.replicate_ignore_table
a.t1
select @@global.'m2'.replicate_ignore_table;
@@global.'m2'.replicate_ignore_table
b.t1
select @@global.replicate_ignore_table;
@@global.replicate_ignore_table
c.t1
use a;
#No t1 table
show tables;
Tables_in_a
t2
use b;
#No t1 table
show tables;
Tables_in_b
t2
use c;
#No t1 table
show tables;
Tables_in_c
t2
#TEST
STOP ALL SLAVES;
Warnings:
Note 1938 SLAVE 'm2' stopped
Note 1938 SLAVE '' stopped
Note 1938 SLAVE 'm1' stopped
RESET SLAVE 'm1' ALL ;
RESET SLAVE 'm2' ALL ;
RESET SLAVE ALL ;
drop database a;
drop database b;
drop database c;
change master 'm1' to master_port=MYPORT_1 , master_host='127.0.0.1', master_user='root';
change master 'm2' to master_port=MYPORT_2 , master_host='127.0.0.1', master_user='root';
change master to master_port=MYPORT_3 , master_host='127.0.0.1', master_user='root';
start all slaves;
Warnings:
Note 1937 SLAVE 'm2' started
Note 1937 SLAVE '' started
Note 1937 SLAVE 'm1' started
set default_master_connection = 'm1';
include/wait_for_slave_to_start.inc
set default_master_connection = 'm2';
include/wait_for_slave_to_start.inc
set default_master_connection = '';
include/wait_for_slave_to_start.inc
#Replication Filter should be intact (t1 still not replicated)
select @@global.'m1'.replicate_ignore_table;
@@global.'m1'.replicate_ignore_table
a.t1
select @@global.'m2'.replicate_ignore_table;
@@global.'m2'.replicate_ignore_table
b.t1
select @@global.replicate_ignore_table;
@@global.replicate_ignore_table
c.t1
use a;
#No t1 table
show tables;
Tables_in_a
t2
use b;
#No t1 table
show tables;
Tables_in_b
t2
use c;
#No t1 table
show tables;
Tables_in_c
t2
#CleanUp
drop database a;
drop database b;
drop database c;
stop all slaves;
SET default_master_connection = "m1";
include/wait_for_slave_to_stop.inc
SET default_master_connection = "m2";
include/wait_for_slave_to_stop.inc
SET default_master_connection = "";
include/wait_for_slave_to_stop.inc
141 changes: 141 additions & 0 deletions mysql-test/suite/multi_source/mdev-8874.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
--source include/not_embedded.inc
--source include/have_innodb.inc
--source include/have_debug.inc
# MDEV-8874
# In Named Master slave connection if we do reset slave 'connection_name' ALL and then
# if we reconnect slave, replication filters are ignored.
# This patch fixes this issue.
--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1)
--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2)
--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3)
--connect (server_4,127.0.0.1,root,,,$SERVER_MYPORT_4)

--connection server_1
create database a;
use a;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
--save_master_pos

--connection server_2
create database b;
use b;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
--save_master_pos

--connection server_3
create database c;
use c;
create table t1(a int);
insert into t1 values(1);
create table t2(a int);
insert into t2 values(1);
--save_master_pos

--connection server_4
--disable_warnings
--replace_result $SERVER_MYPORT_1 MYPORT_1
eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root';
--replace_result $SERVER_MYPORT_2 MYPORT_2
eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root';
--replace_result $SERVER_MYPORT_3 MYPORT_3
eval change master to master_port=$SERVER_MYPORT_3 , master_host='127.0.0.1', master_user='root';
start all slaves;
set default_master_connection = 'm1';
--source include/wait_for_slave_to_start.inc
set default_master_connection = 'm2';
--source include/wait_for_slave_to_start.inc
set default_master_connection = '';
--source include/wait_for_slave_to_start.inc
select @@global.'m1'.replicate_ignore_table;
select @@global.'m2'.replicate_ignore_table;
select @@global.replicate_ignore_table;

--enable_warnings
--sync_with_master 0,'m1'
--sync_with_master 0,'m2'
--sync_with_master 0,''
use a;
--echo #No t1 table
show tables;
use b;
--echo #No t1 table
show tables;
use c;
--echo #No t1 table
show tables;
--echo #TEST
STOP ALL SLAVES;
RESET SLAVE 'm1' ALL ;
RESET SLAVE 'm2' ALL ;
RESET SLAVE ALL ;
drop database a;
drop database b;
drop database c;
--replace_result $SERVER_MYPORT_1 MYPORT_1
eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root';
--replace_result $SERVER_MYPORT_2 MYPORT_2
eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root';
--replace_result $SERVER_MYPORT_3 MYPORT_3
eval change master to master_port=$SERVER_MYPORT_3 , master_host='127.0.0.1', master_user='root';
start all slaves;
set default_master_connection = 'm1';
--source include/wait_for_slave_to_start.inc
set default_master_connection = 'm2';
--source include/wait_for_slave_to_start.inc
set default_master_connection = '';
--source include/wait_for_slave_to_start.inc
--sync_with_master 0,'m1'
--sync_with_master 0,'m2'
--sync_with_master 0,''

--echo #Replication Filter should be intact (t1 still not replicated)
select @@global.'m1'.replicate_ignore_table;
select @@global.'m2'.replicate_ignore_table;
select @@global.replicate_ignore_table;
use a;
--echo #No t1 table
show tables;
use b;
--echo #No t1 table
show tables;
use c;
--echo #No t1 table
show tables;


#--echo #restart the server
#--source include/restart_mysqld.inc


--echo #CleanUp
--connection server_1
drop database a;
--save_master_pos

--connection server_2
drop database b;
--save_master_pos

--connection server_3
drop database c;
--save_master_pos

--connection server_4
--sync_with_master 0,'m1'
--sync_with_master 0,'m2'
--sync_with_master 0,''
--disable_warnings
stop all slaves;
--enable_warnings
SET default_master_connection = "m1";
--source include/wait_for_slave_to_stop.inc
SET default_master_connection = "m2";
--source include/wait_for_slave_to_stop.inc
SET default_master_connection = "";
--source include/wait_for_slave_to_stop.inc
2 changes: 0 additions & 2 deletions sql/rpl_mi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,6 @@ Master_info::~Master_info()
*/
if (strncmp(connection_name.str, STRING_WITH_LEN("wsrep")))
#endif
rpl_filters.delete_element(connection_name.str, connection_name.length,
(void (*)(const char*, uchar*)) free_rpl_filter);
my_free(connection_name.str);
delete_dynamic(&ignore_server_ids);
mysql_mutex_destroy(&run_lock);
Expand Down

0 comments on commit 7f2cfa8

Please sign in to comment.