mirror of
https://github.com/MariaDB/server.git
synced 2025-05-07 04:01:59 +03:00
These tests use search_pattern_in_file.inc to search the error log for expected output. However, search_pattern_in_file.inc by default searched only the first 50000 bytes, so if the error log grew too big the tests would fail. This patch extends search_pattern_in_file.inc with an option to specify how much of the file to search, and whether to search from the start of the file or from the end. Then the rpl.rpl_checksum and rpl.rpl_gtid_errorlog test cases are fixed to search the last 50000 bytes of the error log, which will work no matter how large prior tests have made it.
327 lines
9.0 KiB
Plaintext
327 lines
9.0 KiB
Plaintext
# WL2540 replication events checksum
|
|
# Testing configuration parameters
|
|
|
|
--source include/master-slave.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_binlog_format_mixed.inc
|
|
|
|
call mtr.add_suppression('Slave can not handle replication events with the checksum that master is configured to log');
|
|
call mtr.add_suppression('Replication event checksum verification failed');
|
|
# due to C failure simulation
|
|
call mtr.add_suppression('Relay log write failure: could not queue event from master');
|
|
call mtr.add_suppression('Master is configured to log replication events with checksum, but will not send such events to slaves that cannot process them');
|
|
|
|
# A. read/write access to the global vars:
|
|
# binlog_checksum master_verify_checksum slave_sql_verify_checksum
|
|
|
|
connection master;
|
|
|
|
set @master_save_binlog_checksum= @@global.binlog_checksum;
|
|
set @save_master_verify_checksum = @@global.master_verify_checksum;
|
|
|
|
select @@global.binlog_checksum as 'must be CRC32 because of the command line option';
|
|
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
|
select @@session.binlog_checksum as 'no session var';
|
|
|
|
select @@global.master_verify_checksum as 'must be zero because of default';
|
|
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
|
select @@session.master_verify_checksum as 'no session var';
|
|
|
|
connection slave;
|
|
|
|
set @slave_save_binlog_checksum= @@global.binlog_checksum;
|
|
set @save_slave_sql_verify_checksum = @@global.slave_sql_verify_checksum;
|
|
|
|
select @@global.slave_sql_verify_checksum as 'must be one because of default';
|
|
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
|
select @@session.slave_sql_verify_checksum as 'no session var';
|
|
|
|
connection master;
|
|
|
|
source include/show_binary_logs.inc;
|
|
set @@global.binlog_checksum = NONE;
|
|
select @@global.binlog_checksum;
|
|
--echo *** must be rotations seen ***
|
|
source include/show_binary_logs.inc;
|
|
|
|
set @@global.binlog_checksum = default;
|
|
select @@global.binlog_checksum;
|
|
|
|
# testing lack of side-effects in non-effective update of binlog_checksum:
|
|
set @@global.binlog_checksum = CRC32;
|
|
select @@global.binlog_checksum;
|
|
set @@global.binlog_checksum = CRC32;
|
|
|
|
set @@global.master_verify_checksum = 0;
|
|
set @@global.master_verify_checksum = default;
|
|
|
|
--error ER_WRONG_VALUE_FOR_VAR
|
|
set @@global.binlog_checksum = ADLER32;
|
|
--error ER_WRONG_VALUE_FOR_VAR
|
|
set @@global.master_verify_checksum = 2; # the var is of bool type
|
|
|
|
connection slave;
|
|
|
|
set @@global.slave_sql_verify_checksum = 0;
|
|
set @@global.slave_sql_verify_checksum = default;
|
|
--error ER_WRONG_VALUE_FOR_VAR
|
|
set @@global.slave_sql_verify_checksum = 2; # the var is of bool type
|
|
|
|
#
|
|
# B. Old Slave to New master conditions
|
|
#
|
|
# while master does not send a checksum-ed binlog the Old Slave can
|
|
# work with the New Master
|
|
|
|
connection master;
|
|
|
|
set @@global.binlog_checksum = NONE;
|
|
create table t1 (a int);
|
|
|
|
# testing that binlog rotation preserves opt_binlog_checksum value
|
|
flush logs;
|
|
flush logs;
|
|
flush logs;
|
|
|
|
sync_slave_with_master;
|
|
#connection slave;
|
|
# checking that rotation on the slave side leaves slave stable
|
|
flush logs;
|
|
flush logs;
|
|
flush logs;
|
|
select count(*) as zero from t1;
|
|
|
|
source include/stop_slave.inc;
|
|
|
|
connection master;
|
|
set @@global.binlog_checksum = CRC32;
|
|
insert into t1 values (1) /* will not be applied on slave due to simulation */;
|
|
|
|
# instruction to the dump thread
|
|
|
|
connection slave;
|
|
set @@global.debug_dbug='d,simulate_slave_unaware_checksum';
|
|
start slave;
|
|
--let $slave_io_errno= 1236
|
|
--let $show_slave_io_error= 1
|
|
source include/wait_for_slave_io_error.inc;
|
|
|
|
select count(*) as zero from t1;
|
|
|
|
###connection master;
|
|
set @@global.debug_dbug='';
|
|
|
|
connection slave;
|
|
source include/start_slave.inc;
|
|
|
|
#
|
|
# C. checksum failure simulations
|
|
#
|
|
|
|
# C1. Failure by a client thread
|
|
connection master;
|
|
set @@global.master_verify_checksum = 1;
|
|
set @@session.debug_dbug='d,simulate_checksum_test_failure';
|
|
--error ER_ERROR_WHEN_EXECUTING_COMMAND
|
|
show binlog events;
|
|
set @@session.debug_dbug='';
|
|
set @@global.master_verify_checksum = default;
|
|
|
|
#connection master;
|
|
sync_slave_with_master;
|
|
|
|
connection slave;
|
|
source include/stop_slave.inc;
|
|
|
|
connection master;
|
|
create table t2 (a int);
|
|
let $pos_master= query_get_value(SHOW MASTER STATUS, Position, 1);
|
|
|
|
connection slave;
|
|
|
|
# C2. Failure by IO thread
|
|
# instruction to io thread
|
|
set @@global.debug_dbug='d,simulate_checksum_test_failure';
|
|
start slave io_thread;
|
|
# When the checksum error is detected, the slave sets error code 1913
|
|
# (ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE) in queue_event(), then immediately
|
|
# sets error 1595 (ER_SLAVE_RELAY_LOG_WRITE_FAILURE) in handle_slave_io().
|
|
# So we usually get 1595, but it is occasionally possible to get 1913.
|
|
--let $slave_io_errno= 1595,1913
|
|
--let $show_slave_io_error= 0
|
|
source include/wait_for_slave_io_error.inc;
|
|
set @@global.debug_dbug='';
|
|
|
|
# to make IO thread re-read it again w/o the failure
|
|
start slave io_thread;
|
|
let $slave_param= Read_Master_Log_Pos;
|
|
let $slave_param_value= $pos_master;
|
|
source include/wait_for_slave_param.inc;
|
|
|
|
# C3. Failure by SQL thread
|
|
# instruction to sql thread;
|
|
set @@global.slave_sql_verify_checksum = 1;
|
|
|
|
set @@global.debug_dbug='d,simulate_checksum_test_failure';
|
|
|
|
start slave sql_thread;
|
|
--let $slave_sql_errno= 1593
|
|
--let $show_slave_sql_error= 1
|
|
source include/wait_for_slave_sql_error.inc;
|
|
|
|
# resuming SQL thread to parse out the event w/o the failure
|
|
|
|
set @@global.debug_dbug='';
|
|
source include/start_slave.inc;
|
|
|
|
connection master;
|
|
sync_slave_with_master;
|
|
|
|
#connection slave;
|
|
select count(*) as 'must be zero' from t2;
|
|
|
|
#
|
|
# D. Reset slave, Change-Master, Binlog & Relay-log rotations with
|
|
# random value on binlog_checksum on both master and slave
|
|
#
|
|
connection slave;
|
|
stop slave;
|
|
reset slave;
|
|
|
|
# randomize slave server's own checksum policy
|
|
set @@global.binlog_checksum= IF(floor((rand()*1000)%2), "CRC32", "NONE");
|
|
flush logs;
|
|
|
|
connection master;
|
|
set @@global.binlog_checksum= CRC32;
|
|
reset master;
|
|
flush logs;
|
|
create table t3 (a int, b char(5));
|
|
|
|
connection slave;
|
|
source include/start_slave.inc;
|
|
|
|
connection master;
|
|
sync_slave_with_master;
|
|
|
|
#connection slave;
|
|
select count(*) as 'must be zero' from t3;
|
|
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, master_user='root';
|
|
|
|
connection master;
|
|
flush logs;
|
|
reset master;
|
|
insert into t3 value (1, @@global.binlog_checksum);
|
|
|
|
connection slave;
|
|
source include/start_slave.inc;
|
|
flush logs;
|
|
|
|
connection master;
|
|
sync_slave_with_master;
|
|
|
|
#connection slave;
|
|
select count(*) as 'must be one' from t3;
|
|
|
|
connection master;
|
|
set @@global.binlog_checksum= IF(floor((rand()*1000)%2), "CRC32", "NONE");
|
|
insert into t3 value (1, @@global.binlog_checksum);
|
|
sync_slave_with_master;
|
|
|
|
#connection slave;
|
|
|
|
#clean-up
|
|
|
|
connection master;
|
|
drop table t1, t2, t3;
|
|
set @@global.binlog_checksum = @master_save_binlog_checksum;
|
|
set @@global.master_verify_checksum = @save_master_verify_checksum;
|
|
|
|
#
|
|
# BUG#58564: flush_read_lock fails in mysql-trunk-bugfixing after merging with WL#2540
|
|
#
|
|
# Sanity check that verifies that no assertions are triggered because
|
|
# of old FD events (generated by versions prior to server released with
|
|
# checksums feature)
|
|
#
|
|
# There is no need for query log, if something wrong this should trigger
|
|
# an assertion
|
|
|
|
--disable_query_log
|
|
|
|
BINLOG '
|
|
MfmqTA8BAAAAZwAAAGsAAAABAAQANS41LjctbTMtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAx+apMEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
|
|
';
|
|
|
|
--enable_query_log
|
|
|
|
#connection slave;
|
|
sync_slave_with_master;
|
|
|
|
|
|
--echo *** Bug#59123 / MDEV-5799: INCIDENT_EVENT checksum written to error log as garbage characters ***
|
|
|
|
--connection master
|
|
|
|
--source include/wait_for_binlog_checkpoint.inc
|
|
CREATE TABLE t4 (a INT PRIMARY KEY);
|
|
INSERT INTO t4 VALUES (1);
|
|
|
|
SET sql_log_bin=0;
|
|
CALL mtr.add_suppression("\\[ERROR\\] Can't generate a unique log-filename");
|
|
SET sql_log_bin=1;
|
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
|
SET debug_dbug= '+d,binlog_inject_new_name_error';
|
|
--error ER_NO_UNIQUE_LOGFILE
|
|
FLUSH LOGS;
|
|
SET debug_dbug= @old_dbug;
|
|
|
|
INSERT INTO t4 VALUES (2);
|
|
|
|
--connection slave
|
|
--let $slave_sql_errno= 1590
|
|
--source include/wait_for_slave_sql_error.inc
|
|
|
|
# Search the error log for the error message.
|
|
# The bug was that 4 garbage bytes were output in the middle of the error
|
|
# message; by searching for a pattern that spans that location, we can
|
|
# catch the error.
|
|
let $log_error_= `SELECT @@GLOBAL.log_error`;
|
|
if(!$log_error_)
|
|
{
|
|
# MySQL Server on windows is started with --console and thus
|
|
# does not know the location of its .err log, use default location
|
|
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
|
|
}
|
|
--let SEARCH_FILE= $log_error_
|
|
--let SEARCH_RANGE=-50000
|
|
--let SEARCH_PATTERN= Slave SQL: The incident LOST_EVENTS occured on the master\. Message: error writing to the binary log, Internal MariaDB error code: 1590
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
SELECT * FROM t4 ORDER BY a;
|
|
STOP SLAVE IO_THREAD;
|
|
SET sql_slave_skip_counter= 1;
|
|
--source include/start_slave.inc
|
|
|
|
--connection master
|
|
--save_master_pos
|
|
|
|
--connection slave
|
|
--sync_with_master
|
|
SELECT * FROM t4 ORDER BY a;
|
|
|
|
|
|
--connection slave
|
|
set @@global.binlog_checksum = @slave_save_binlog_checksum;
|
|
set @@global.slave_sql_verify_checksum = @save_slave_sql_verify_checksum;
|
|
|
|
--echo End of tests
|
|
|
|
--connection master
|
|
DROP TABLE t4;
|
|
|
|
--source include/rpl_end.inc
|