mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
51b28b24ca
Problem: ======== The test logic checked for the wrong condition to validate that the slave had caught up with the master. Specifically, it used the thread stage of the IO and SQL thread to be in the “Waiting for master to send event” and “Slave has read all relay log; waiting for more updates” states, respectively. The problem exposed by this MDEV is that, this state is also the initial slave state before reading data from the primary (whereas the intended state was having already read all available events from the primary and now waiting for new events). This made the MTR test validate data that it had not yet received, and thereby fail. Solution: ======== Instead of using the IO/SQL thread states, use the existing helper functions save_master_gtid.inc and sync_with_master_gtid.inc. Note that the test result file also needed to be updated to reflect this fix. Special thanks to Angelique Sklavounos for pointing out that --stop-position was not specified in any buildbot failures, as this led to an IF block in the MTR test that was the source of the test failure. Reviewed By ============ Andrei Elkin <andrei.elkin@mariadb.com>
194 lines
5.7 KiB
PHP
194 lines
5.7 KiB
PHP
# This file provides the structure to run a single test that ensures the
|
|
# mariadb-binlog command line tool is consistent with replicas for event
|
|
# filtering. The test is configured using the following input parameters, where
|
|
# each is nullable (i.e. it will not be used to configure mariadb-binlog or
|
|
# the replica).
|
|
#
|
|
# param $do_domain_ids : A list of domain ids to include in replication
|
|
# param $ignore_domain_ids : A list of domain ids to exclude from replication
|
|
# param $ignore_server_ids : A list of server ids to exclude from replication
|
|
# param $start_position : The GTID positions to begin replication from in
|
|
# the specified domains
|
|
# param $stop_position : The GTID positions that mark the end of an event
|
|
# stream in a particular domain
|
|
#
|
|
# param $con1 : The connection name of the primary server
|
|
# param $con2 : The connection name of the replica server
|
|
# param $strict_mode : Uses input and checks for out of order GTIDs
|
|
# param $strict_mode_err : A boolean that provides expectations for strict
|
|
# mode to error
|
|
# param $slave_sql_errno : Expected error number of the slave SQL thread
|
|
|
|
|
|
--let $include_filename= mysqlbinlog_slave_consistency.inc
|
|
--source include/begin_include_file.inc
|
|
|
|
--enable_query_log
|
|
|
|
if (!$con1)
|
|
{
|
|
--let $con1=master
|
|
}
|
|
if (!$con2)
|
|
{
|
|
--let $con2=slave
|
|
}
|
|
|
|
if (!$strict_mode)
|
|
{
|
|
--connection $con2
|
|
set @@global.gtid_strict_mode=0;
|
|
--let $sql_input_file=include/sql_multisource.inc
|
|
}
|
|
|
|
if ($strict_mode)
|
|
{
|
|
--connection $con2
|
|
set @@global.gtid_strict_mode=1;
|
|
--let $sql_input_file=include/sql_out_of_order_gtid.inc
|
|
}
|
|
|
|
--connection $con2
|
|
--source include/stop_slave.inc
|
|
|
|
--connection $con1
|
|
--echo # Populating $con1 data
|
|
--source $sql_input_file
|
|
--source include/save_master_gtid.inc
|
|
|
|
--let $MYSQLD_DATADIR=`select @@datadir`
|
|
--let $MYSQLBINLOG_STDERR=$MYSQLD_DATADIR/mysqlbinlog_stderr.out
|
|
--let BINLOG_FILENAME= query_get_value(SHOW BINARY LOGS, Log_name, 1)
|
|
--let BINLOG_FILE_PARAM= $MYSQLD_DATADIR/$BINLOG_FILENAME.orig
|
|
--copy_file $MYSQLD_DATADIR/$BINLOG_FILENAME $BINLOG_FILE_PARAM
|
|
|
|
--connection $con2
|
|
--let $msbl_args=
|
|
if (`SELECT strcmp("$start_position","") != 0`)
|
|
{
|
|
eval set global gtid_slave_pos="$start_position";
|
|
--let $msbl_args= $msbl_args --start-position=$start_position
|
|
}
|
|
|
|
--let $cm_args= MASTER_USE_GTID=slave_pos
|
|
if (`SELECT strcmp("$do_domain_ids","") != 0`)
|
|
{
|
|
--let $cm_args= $cm_args, DO_DOMAIN_IDS=($do_domain_ids)
|
|
--let $msbl_args= $msbl_args --do-domain-ids=$do_domain_ids
|
|
}
|
|
if (`SELECT strcmp("$ignore_domain_ids","") != 0`)
|
|
{
|
|
--let $cm_args= $cm_args, IGNORE_DOMAIN_IDS=($ignore_domain_ids)
|
|
--let $msbl_args= $msbl_args --ignore-domain-ids=$ignore_domain_ids
|
|
}
|
|
if (`SELECT strcmp("$ignore_server_ids","") != 0`)
|
|
{
|
|
--let $cm_args= $cm_args, IGNORE_SERVER_IDS=($ignore_server_ids)
|
|
--let $msbl_args= $msbl_args --ignore-server-ids=$ignore_server_ids
|
|
}
|
|
if ($strict_mode)
|
|
{
|
|
--let $msbl_args= $msbl_args --gtid-strict-mode
|
|
}
|
|
eval CHANGE MASTER TO $cm_args;
|
|
|
|
--let $start_slave_args=
|
|
if (`SELECT strcmp("$stop_position","") != 0`)
|
|
{
|
|
--let $start_slave_args= UNTIL master_gtid_pos="$stop_position"
|
|
--let $msbl_args= $msbl_args --stop-position=$stop_position
|
|
}
|
|
|
|
eval START SLAVE $start_slave_args;
|
|
|
|
if ($slave_sql_errno)
|
|
{
|
|
--echo # $con2 SQL Thread error expected - waiting for errno $slave_sql_errno
|
|
--source include/wait_for_slave_sql_error.inc
|
|
}
|
|
|
|
# If we are not expecting an error, wait for con2 to catch up
|
|
if (!$slave_sql_errno)
|
|
{
|
|
--echo # No $con2 error expecting - waiting for $con2 to catch up to $con1
|
|
|
|
# Stop position was not specified
|
|
if (`SELECT strcmp("$stop_position","") = 0`)
|
|
{
|
|
--source include/sync_with_master_gtid.inc
|
|
}
|
|
|
|
# Stop position was specified
|
|
if (`SELECT strcmp("$stop_position","") != 0`)
|
|
{
|
|
--echo # Because there is a stop position we wait for all events to process
|
|
--echo # and $con2 to automatically stop
|
|
--source include/wait_for_slave_to_stop.inc
|
|
}
|
|
}
|
|
|
|
--echo # Stop $con2 so it stops receiving $con1 events.
|
|
--source include/stop_slave.inc
|
|
|
|
--connection $con1
|
|
DROP TABLE IF EXISTS t1, t2, t3, t4, t5;
|
|
RESET MASTER;
|
|
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM $msbl_args 2> MYSQLBINLOG_STDERR | MYSQL
|
|
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM $msbl_args 2> $MYSQLBINLOG_STDERR | $MYSQL
|
|
|
|
--source include/rpl_check_table_consistency.inc
|
|
|
|
if ($strict_mode)
|
|
{
|
|
--echo # Strict mode enabled - checking mysqlbinlog error output for out
|
|
--echo # of order GTIDs
|
|
--let SEARCH_FILE=$MYSQLBINLOG_STDERR
|
|
--let SEARCH_PATTERN=Found out of order GTID
|
|
if ($strict_mode_err)
|
|
{
|
|
--echo # Expecting to find out of order GTID error..
|
|
}
|
|
if (!$strict_mode_err)
|
|
{
|
|
--echo # Not expecting to find out of order GTID error..
|
|
}
|
|
--source include/search_pattern_in_file.inc
|
|
}
|
|
|
|
--echo # Test finished - resetting $con1 and $con2..
|
|
--connection $con2
|
|
RESET SLAVE;
|
|
RESET MASTER;
|
|
set global gtid_slave_pos="";
|
|
CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(), IGNORE_SERVER_IDS=();
|
|
|
|
--connection $con1
|
|
RESET MASTER;
|
|
DROP TABLE IF EXISTS t1, t2, t3, t4, t5;
|
|
--source include/save_master_gtid.inc
|
|
|
|
--connection $con2
|
|
--source include/start_slave.inc
|
|
--source include/wait_for_slave_to_start.inc
|
|
--source include/sync_with_master_gtid.inc
|
|
--source include/stop_slave.inc
|
|
RESET SLAVE;
|
|
set global gtid_slave_pos="";
|
|
RESET MASTER;
|
|
|
|
--connection $con1
|
|
RESET MASTER;
|
|
|
|
--connection $con2
|
|
if ($strict_mode)
|
|
{
|
|
set @@global.gtid_strict_mode=0;
|
|
}
|
|
--source include/start_slave.inc
|
|
|
|
--connection $con1
|
|
--remove_file $BINLOG_FILE_PARAM
|
|
--remove_file $MYSQLBINLOG_STDERR
|
|
|
|
--let $include_filename= mysqlbinlog_slave_consistency.inc
|
|
--source include/end_include_file.inc
|