386 lines
14 KiB
Plaintext
386 lines
14 KiB
Plaintext
# Testing master to slave heartbeat protocol
|
|
#
|
|
# Including:
|
|
# - user interface, grammar, checking the range and warnings about
|
|
# unreasonable values for the heartbeat period
|
|
# - no rotation of relay log if heartbeat is less that slave_net_timeout
|
|
# - SELECT COUNT_RECEIVED_HEARTBEATS FROM p_S.replication_connection_status
|
|
# - SELECT HEARTBEAT_INTERVAL FROM p_s.replication_connection_configuration
|
|
# - SELECT LAST_HEARTBEAT_TIMESTAMP FROM p_s.replication_connection_status
|
|
|
|
--source include/not_group_replication_plugin.inc
|
|
--let $rpl_skip_start_slave= 1
|
|
--let $rpl_skip_reset_master_and_slave= 1
|
|
--let $rpl_skip_change_master= 1
|
|
--source include/master-slave.inc
|
|
|
|
--let $rpl_connection_name= slave
|
|
--source include/rpl_connection.inc
|
|
|
|
set @restore_slave_net_timeout= @@global.slave_net_timeout;
|
|
set @@global.slave_net_timeout= 10;
|
|
|
|
#
|
|
# check for null value of the last_heartbeat_timestamp variable when the slave is not enabled
|
|
#
|
|
--query_vertical SELECT LAST_HEARTBEAT_TIMESTAMP FROM performance_schema.replication_connection_status
|
|
|
|
###
|
|
### Checking the range
|
|
###
|
|
|
|
#
|
|
# default period slave_net_timeout/2
|
|
#
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root';
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
#
|
|
# the max for the heartbeat_interval is ULONG_MAX/1000; an attempt to exceed it is denied
|
|
#
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
--error ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 4294968;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
#
|
|
# the min value for the heartbeat_interval is 1 millisecond an attempt to assign a
|
|
# lesser will be warned with treating the value as zero
|
|
#
|
|
--let $rpl_connection_name= slave
|
|
--source include/rpl_connection.inc
|
|
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
### 5.1 mtr does not have --warning ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 0.0009999;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
#
|
|
# the actual max and min must be accepted
|
|
#
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 4294967;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 0.001;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
reset slave;
|
|
|
|
#
|
|
# A warning if heartbeat_interval greater than slave_net_timeout
|
|
#
|
|
set @@global.slave_net_timeout= 5;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 5.001;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
reset slave;
|
|
|
|
#
|
|
# A warning if slave_net_timeout is set to less than the current HB period
|
|
#
|
|
set @@global.slave_net_timeout= 5;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 4;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
set @@global.slave_net_timeout= 3 /* must be a warning */;
|
|
|
|
reset slave;
|
|
|
|
###
|
|
### checking no rotation
|
|
###
|
|
|
|
--let $rpl_connection_name= master
|
|
--source include/rpl_connection.inc
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
#
|
|
# Even though master_heartbeat_period= 0.5 is 20 times less than
|
|
# @@global.slave_net_timeout= 10 in some circumstances master will
|
|
# not be able to send any heartbeat during the slave's net timeout
|
|
# and slave's relay log will rotate.
|
|
# The probability for such a scenario is pretty small so the following
|
|
# part is almost deterministic.
|
|
#
|
|
|
|
--let $rpl_connection_name= slave
|
|
--source include/rpl_connection.inc
|
|
set @@global.slave_net_timeout= 10;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
# no error this time but rather a warning
|
|
--replace_column 2 ####
|
|
eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, master_user='root', master_heartbeat_period= 0.5;
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
start slave;
|
|
|
|
--let $rpl_connection_name= master
|
|
--source include/rpl_connection.inc
|
|
create table t1 (f1 int);
|
|
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
let $slave_param= Relay_Log_File;
|
|
let $slave_param_value= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1);
|
|
|
|
# there is an explicit sleep lasting longer than slave_net_timeout
|
|
# to ensure that nothing will come to slave from master for that period.
|
|
# That would cause reconnecting and relaylog rotation w/o the fix i.e
|
|
# without a heartbeat received.
|
|
|
|
real_sleep 15;
|
|
|
|
# check (compare with the previous show's results) that no rotation happened
|
|
source include/check_slave_param.inc;
|
|
|
|
###
|
|
### Check the values of HEARTBEAT_INTERVAL and COUNT_RECEIVED_HEARTBEATS
|
|
###
|
|
|
|
--query_vertical SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration
|
|
|
|
#
|
|
# proof that there has been received at least one heartbeat;
|
|
# The exact number of received heartbeat is an indeterministic value
|
|
# and therefore it's not recorded into results.
|
|
#
|
|
|
|
# Checking the fact that at least one heartbeat is received
|
|
--let $wait_condition = SELECT COUNT_RECEIVED_HEARTBEATS > 0 FROM performance_schema.replication_connection_status
|
|
--source include/wait_condition.inc
|
|
|
|
--echo A heartbeat has been received by the slave
|
|
|
|
#
|
|
# check for non-null value of the last_heartbeat_timestamp variable when the slave is enabled
|
|
#
|
|
--let $assert_text= last_heartbeat_timestamp should not be empty
|
|
--let $assert_cond= \'[SELECT LAST_HEARTBEAT_TIMESTAMP FROM performance_schema.replication_connection_status]\' != ""
|
|
--source include/assert.inc
|
|
|
|
# cleanup
|
|
|
|
--let $rpl_connection_name= master
|
|
--source include/rpl_connection.inc
|
|
drop table t1;
|
|
|
|
--source include/sync_slave_sql_with_master.inc
|
|
set @@global.slave_net_timeout= @restore_slave_net_timeout;
|
|
|
|
|
|
# ==== Bug#18185490: IF MASTER_HEARTBEAT_PERIOD OPTION IS NOT PROVIDED IT IS AUTO SETTING TO DEFAULT ====
|
|
|
|
# Change master was always resetting the heartbeat_interval to default value
|
|
# and count_received_heartbeats to 0 on change master. After the bug fix,
|
|
# change master should only change heartbeat_interval if the corresponding option
|
|
# is given and never change count_received_heartbeats
|
|
|
|
--let $rpl_connection_name= slave
|
|
--source include/rpl_connection.inc
|
|
--source include/stop_slave.inc
|
|
|
|
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD= 10;
|
|
|
|
--let $assert_text= HEARTBEAT_INTERVAL should be 10.000
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = 10.000
|
|
--source include/assert.inc
|
|
|
|
--echo
|
|
--echo # Verify that heartbeat period is not reset to default implicitly and
|
|
--echo # received_heartbeat is not set to 0 by this.
|
|
--echo
|
|
|
|
CHANGE MASTER TO MASTER_RETRY_COUNT= 3;
|
|
|
|
--let $assert_text= HEARTBEAT_INTERVAL should be 10.000
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = 10.000
|
|
--source include/assert.inc
|
|
|
|
--let $assert_text= COUNT_RECEIVED_HEARTBEATS should NOT be set to 0
|
|
--let $assert_cond= [SELECT COUNT_RECEIVED_HEARTBEATS FROM performance_schema.replication_connection_status] <> 0
|
|
--source include/assert.inc
|
|
|
|
|
|
###############################################################################
|
|
# BUG#18777899 HEARTBEAT_PERIOD AUTOMATICALLY SETS TO DEFAULT POST RESET SLAVE
|
|
# COMMAND
|
|
#
|
|
# Due to the buggy behaviour, a RESET SLAVE command on the slave server
|
|
# reset heartbeat_period to default. RESET SLAVE is generally expected to
|
|
# delete slave logs and forget the replicaiton positions. This erroneous
|
|
# behavior was therefore un-intuitive.
|
|
#
|
|
# In the test we test the behaviour of heartbeat_period with RESET SLAVE,
|
|
# STOP SLAVE, CHANGE MASTER, START SLAVE and RESET SLAVE ALL.
|
|
#
|
|
# 1. RESET SLAVE:
|
|
# ===========
|
|
#
|
|
# Execute a RESET SLAVE and verify that the heartbeat_period is what we
|
|
# set in the latest CHANGE MASTER and not the the default value.
|
|
#
|
|
# 2. CHANGE MASTER, START SLAVE:
|
|
# ==========================
|
|
#
|
|
# a. Changing host resets heartbeat_period to default.
|
|
# b. Changing port resets heartbeat_period to default.
|
|
# c. changing host and port resets heartbeat_period to default.
|
|
#
|
|
# 3. RESET SLAVE ALL:
|
|
# ===============
|
|
#
|
|
# Execute a RESET SLAVE ALL and verify that the heartbeat_period is set to 0.
|
|
###############################################################################
|
|
|
|
--source include/stop_slave.inc
|
|
RESET SLAVE;
|
|
RESET MASTER;
|
|
|
|
--let $MASTER_AUTO_POSITION=MASTER_AUTO_POSITION=0
|
|
if (`SELECT @@GLOBAL.gtid_mode = 'ON'`)
|
|
{
|
|
--let $MASTER_AUTO_POSITION=MASTER_AUTO_POSITION=1
|
|
}
|
|
--replace_result $MASTER_AUTO_POSITION MASTER_AUTO_POSITION
|
|
--eval CHANGE MASTER TO $MASTER_AUTO_POSITION
|
|
|
|
--source include/start_slave.inc
|
|
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = 10.000
|
|
--let $assert_text= HEARTBEAT_INTERVAL should still be 10.000 after RESET SLAVE.
|
|
--source include/assert.inc
|
|
|
|
--source include/stop_slave_io.inc
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
eval CHANGE MASTER TO MASTER_HOST= 'localhost', MASTER_PORT= $MASTER_MYPORT;
|
|
--source include/start_slave.inc
|
|
|
|
--let $default_heartbeat_period= @@global.slave_net_timeout/2;
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = $default_heartbeat_period
|
|
--let $assert_text= HEARTBEAT_INTERVAL should reset to default.
|
|
--source include/assert.inc
|
|
|
|
--echo #
|
|
--echo # Change from default to make sure changing HOST resets heartbeat_interval
|
|
--echo # to default.
|
|
--echo #
|
|
--source include/stop_slave_io.inc
|
|
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD = 10;
|
|
--source include/start_slave.inc
|
|
|
|
# The DROP TABLE below is a transaction that will make MTS to be synced
|
|
# properly on very slow systems.
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--source include/stop_slave.inc
|
|
eval CHANGE MASTER TO MASTER_HOST= '127.0.0.1';
|
|
--source include/start_slave.inc
|
|
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = $default_heartbeat_period
|
|
--let $assert_text= heartbeat_interval should reset to default on changing host.
|
|
--source include/assert.inc
|
|
|
|
# The DROP TABLE below is a transaction that will make MTS to be synced
|
|
# properly on very slow systems.
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--echo #
|
|
--echo # Change from default to make sure changing PORT resets heartbeat_interval
|
|
--echo # to default.
|
|
--echo #
|
|
--source include/stop_slave.inc
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD = 10;
|
|
--source include/start_slave.inc
|
|
|
|
# The DROP TABLE below is a transaction that will make MTS to be synced
|
|
# properly on very slow systems.
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--source include/stop_slave.inc
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
eval CHANGE MASTER TO MASTER_PORT= $MASTER_MYPORT;
|
|
--source include/start_slave.inc
|
|
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = $default_heartbeat_period
|
|
--let $assert_text= heartbeat_interval should reset to default on changing port.
|
|
--source include/assert.inc
|
|
|
|
# The DROP TABLE below is a transaction that will make MTS to be synced
|
|
# properly on very slow systems.
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--echo #
|
|
--echo # Change from default to make sure changing HOST and PORT resets
|
|
--echo # heartbeat_period to default.
|
|
--echo #
|
|
--source include/stop_slave.inc
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
eval CHANGE MASTER TO MASTER_HOST= '127.0.0.1', MASTER_PORT= $MASTER_MYPORT;
|
|
--source include/start_slave.inc
|
|
|
|
--let $assert_cond= [SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration] = $default_heartbeat_period
|
|
--let $assert_text= heartbeat_interval should reset to default on changing host and port.
|
|
--source include/assert.inc
|
|
|
|
# The DROP TABLE below is a transaction that will make MTS to be synced
|
|
# properly on very slow systems.
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--source include/stop_slave.inc
|
|
RESET SLAVE ALL;
|
|
|
|
--let $assert_cond= \'[SELECT HEARTBEAT_INTERVAL FROM performance_schema.replication_connection_configuration]\' = ""
|
|
--let $assert_text= heartbeat_interval should reset to zero by RESET SLAVE ALL.
|
|
--source include/assert.inc
|
|
|
|
# Make this a slave again to successfully pass through cleanup routines.
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 2 ####
|
|
--eval change master to master_host= '127.0.0.1', master_port= $MASTER_MYPORT, master_user= 'root'
|
|
|
|
# The table might have replicated again after RESET SLAVE.
|
|
--source include/start_slave.inc
|
|
--connection master
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--source include/sync_slave_sql_with_master.inc
|
|
--enable_warnings
|
|
|
|
--source include/rpl_end.inc
|
|
|
|
--connection master
|
|
--source suite/xengine/include/check_xengine_log_error.inc
|