Details
-
Technical task
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
-
None
Description
If I set global sql_slave_skip_counter, then configure a replication connection with a non-default name and start the slave, it doesn't take into account the value of the skip_counter, even if the connection name is set as default_master_connection.
I'm not exactly sure how it should work, my best guess is that sql_slave_skip_counter should affect all connections that get started after the value was set.
Below is the test case (hopefully a full one, so it can be used as is in multi_source suite), and a result file as I imagine it (it's patched manually).
cat suite/multi_source/skip_counter.test
---enable_connect_log
|
|
# Create a schema and a table i
|
# on the 1st master
|
|
--connect (master1,127.0.0.1,root,,,$SERVER_MYPORT_1)
|
|
--disable_warnings
|
drop database if exists db;
|
--enable_warnings
|
create database db;
|
create table db.t1 (i int) engine=MyISAM;
|
--save_master_pos
|
|
|
# Create the same schema and another table
|
# on the 2nd master
|
|
--connect (master2,127.0.0.1,root,,,$SERVER_MYPORT_2)
|
|
--disable_warnings
|
drop database if exists db;
|
--enable_warnings
|
create database db;
|
create table db.t2 (i int) engine=MyISAM;
|
|
--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3)
|
--disable_connect_log
|
|
# Start replication from the first master
|
|
--replace_result $SERVER_MYPORT_1 MYPORT_1
|
eval change master 'master1' to
|
master_port=$SERVER_MYPORT_1,
|
master_host='127.0.0.1',
|
master_user='root';
|
|
start slave 'master1';
|
set default_master_connection = 'master1';
|
--source include/wait_for_slave_to_start.inc
|
--sync_with_master 0,'master1'
|
|
# Start replication from the second master
|
|
set default_master_connection = 'master2';
|
|
--replace_result $SERVER_MYPORT_2 MYPORT_2
|
eval change master 'master2' to
|
master_port=$SERVER_MYPORT_2,
|
master_host='127.0.0.1',
|
master_user='root';
|
|
# the schema creation will be replicated from the 1st master,
|
# so we want to skip it in the second replication connection.
|
|
# Normally it should have been 2 events, but
|
# currently Binlog_checkpoint also counts. Maybe we'll need
|
# to modify the test later
|
|
--let $skip_counter_saved = `select @@global.sql_slave_skip_counter`
|
set global sql_slave_skip_counter = 3;
|
|
start slave 'master2';
|
--source include/wait_for_slave_to_start.inc
|
set default_master_connection = '';
|
|
--enable_connect_log
|
|
--connection master2
|
--save_master_pos
|
|
--connection slave
|
|
--disable_connect_log
|
--sync_with_master 0,'master2'
|
|
# If the skip_counter worked as expected, we should
|
# get here (replication shouldn't have broken)
|
# and should see both tables here
|
# (drop database which came from master2 shoudn't have been executed
|
# so t1 should still exist)
|
|
show tables in db;
|
|
# Cleanup
|
|
drop database db;
|
set default_master_connection = 'master1';
|
stop slave;
|
|
--source include/wait_for_slave_to_stop.inc
|
set default_master_connection = 'master2';
|
stop slave;
|
|
--source include/wait_for_slave_to_stop.inc
|
--eval set global sql_slave_skip_counter = $skip_counter_saved
|
|
--enable_connect_log
|
--disconnect slave
|
|
--connection master1
|
drop database db;
|
--disconnect master1
|
|
--connection master2
|
drop database db;
|
--disconnect master2
|
|
cat suite/multi_source/skip_counter.result
connect master1,127.0.0.1,root,,,$SERVER_MYPORT_1;
|
drop database if exists db;
|
create database db;
|
create table db.t1 (i int) engine=MyISAM;
|
connect master2,127.0.0.1,root,,,$SERVER_MYPORT_2;
|
drop database if exists db;
|
create database db;
|
create table db.t2 (i int) engine=MyISAM;
|
connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3;
|
change master 'master1' to
|
master_port=MYPORT_1,
|
master_host='127.0.0.1',
|
master_user='root';
|
start slave 'master1';
|
set default_master_connection = 'master1';
|
include/wait_for_slave_to_start.inc
|
set default_master_connection = 'master2';
|
change master 'master2' to
|
master_port=MYPORT_2,
|
master_host='127.0.0.1',
|
master_user='root';
|
set global sql_slave_skip_counter = 3;
|
start slave 'master2';
|
include/wait_for_slave_to_start.inc
|
set default_master_connection = '';
|
connection master2;
|
connection slave;
|
show tables in db;
|
Tables_in_db
|
t1
|
t2
|
drop database db;
|
set default_master_connection = 'master1';
|
stop slave;
|
include/wait_for_slave_to_stop.inc
|
set default_master_connection = 'master2';
|
stop slave;
|
include/wait_for_slave_to_stop.inc
|
set global sql_slave_skip_counter = 0;
|
disconnect slave;
|
connection master1;
|
drop database db;
|
disconnect master1;
|
connection master2;
|
drop database db;
|
disconnect master2;
|