mariadb/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc
Brandon Nesterenko 51b28b24ca MDEV-28435: rpl.rpl_mysqlbinlog_slave_consistency fails intermittently on tables comparison
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>
2022-04-28 11:46:08 -06:00

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