polardbxengine/mysql-test/suite/xengine_rpl_nogtid/t/rpl_gtid_mode.test

721 lines
25 KiB
Plaintext

# ==== Purpose ====
#
# Test replication errors that depend on GTID_MODE.
#
# The following classes of errors are tested:
#
# - Errors generated when the server starts.
# - GTID_MODE and ENFORCE_GTID_CONSISTENCY are incompatible.
# - todo: GTID_MODE and AUTO_POSITION are incompatible.
# - Errors generated by the master in the replication protocol
# handshake.
# - todo: GTID_MODE on master is incompatible with AUTO_POSITION.
# - Errors generated by the slave in the replication protocol
# handshake.
# - GTID_MODE on master and slave are incompatible.
# - GTID_MODE on master is incompatible with AUTO_POSITION.
# - GTID_MODE on slave is incompatibale with AUTO_POSITION.
# - Slave receiver thread can not start in AUTO_POSITION mode because
# slave has GTID-MODE = OFF.
# - Errors generated by a running sender thread.
# - Cannot replicate GTID-transaction when GTID_MODE = OFF.
# - Cannot replicate anonymous transaction when GTID_MODE = ON.
# - Cannot replicate anonymous transaction when AUTO_POSITION = 1.
# - Errors generated by a running receiver thread.
# - Cannot replicate GTID-transaction when GTID_MODE = OFF.
# - Cannot replicate anonymous transaction when GTID_MODE = ON.
# - Cannot replicate anonymous transaction when AUTO_POSITION = 1.
# - GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.
# - Errors when rotate fails while setting gtid_mode.
#
# ==== References ====
#
# WL#3584: Global Transaction Identifiers
# - Added in this worklog
# WL#7083: GTIDs: Set GTID_MODE=ON online
# - Rewrote the test.
--source include/no_valgrind_without_big.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
# include/assert_command_output.inc doesn't work for mysqld on windows
--source include/not_windows.inc
--source include/not_group_replication_plugin.inc
--let $rpl_gtid_utils= 1
--source include/master-slave.inc
--echo ==== Initialize ====
call mtr.add_suppression("Slave I/O for channel '': The replication receiver thread cannot start");
call mtr.add_suppression("Slave I/O for channel '': The slave IO thread stops");
call mtr.add_suppression("Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF");
call mtr.add_suppression("Slave I/O for channel '': Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF");
call mtr.add_suppression("GTID_LOG_EVENT or ANONYMOUS_GTID_LOG_EVENT is not expected in an event stream after a GTID_LOG_EVENT or an ANONYMOUS_GTID_LOG_EVENT.");
call mtr.add_suppression("An unexpected event sequence was detected by the IO thread while queuing the event received from master");
call mtr.add_suppression("Detected misconfiguration: replication channel '' was configured with AUTO_POSITION = 1, but the server was started with --gtid-mode=off.");
call mtr.add_suppression("Slave I/O for channel '': Relay log write failure: could not queue event from master");
call mtr.add_suppression("Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON");
call mtr.add_suppression("Slave I/O for channel '': Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON");
call mtr.add_suppression("Slave I/O for channel '': Cannot replicate anonymous transaction when AUTO_POSITION = 1");
call mtr.add_suppression("Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate anonymous transaction when AUTO_POSITION = 1,");
call mtr.add_suppression("Slave I/O for channel '': The master uses an unknown GTID_MODE 'on_something'. Treating it as 'ON'.");
call mtr.add_suppression("Slave I/O for channel '': The master uses an unknown GTID_MODE 'off_something'. Treating it as 'OFF'.");
call mtr.add_suppression("Could not open .* for logging.*. Turning logging off for the whole duration of the MySQL server process.");
--let $saved_binlog_error_action=`SELECT @@GLOBAL.binlog_error_action`
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave.inc
--let $saved_innodb_page_size_server2=`SELECT @@innodb_page_size`
--connection master
--let $saved_innodb_page_size_server1=`SELECT @@innodb_page_size`
--let $server1_cmd= $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --default-storage-engine=XENGINE --recovery-inconsistency-check=off --default-tmp-storage-engine=InnoDB --innodb-page-size=$saved_innodb_page_size_server1
--let $server2_cmd= $MYSQLD --defaults-group-suffix=.2 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --default-storage-engine=XENGINE --recovery-inconsistency-check=off --default-tmp-storage-engine=InnoDB --innodb-page-size=$saved_innodb_page_size_server2
--echo ==== Checks performed at server start ====
--echo ---- gtid-mode=ON requires enforce-gtid-consistency ----
--let $rpl_server_number= 2
--source include/rpl_stop_server.inc
--let $assert_command= $server2_cmd --gtid-mode=on 2>&1
--let $assert_regex= GTID_MODE = ON requires ENFORCE_GTID_CONSISTENCY = ON
--let $assert_status= 1
--source include/assert_command_output.inc
--let $rpl_server_number= 2
--let $rpl_start_with_gtids= 0
--source include/rpl_start_server.inc
--echo ==== Master-slave handshake checks ====
--source include/rpl_connection_master.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
--source include/rpl_connection_slave.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
# Prevent rpl_set_gtid_mode.inc from trying to sync.
--let $rpl_skip_sync= 1
--let $master_gtid_mode= 0
while ($master_gtid_mode <= 3)
{
--let $rpl_gtid_mode= $master_gtid_mode
--let $rpl_server_numbers= 1
--source include/rpl_set_gtid_mode.inc
--let $slave_gtid_mode= 0
while ($slave_gtid_mode <= 3)
{
--let $rpl_gtid_mode= $slave_gtid_mode
--let $rpl_server_numbers= 2
--source include/rpl_set_gtid_mode.inc
--connection slave
# Master and slave gtid_mode compatibility.
--let $gtid_modes_compatible= 1
if ($slave_gtid_mode == 0)
{
if ($master_gtid_mode >= 2)
{
--let $gtid_modes_compatible= 0
}
}
if ($slave_gtid_mode == 3)
{
if ($master_gtid_mode <= 1)
{
--let $gtid_modes_compatible= 0
}
}
START SLAVE IO_THREAD;
if ($gtid_modes_compatible)
{
--source include/wait_for_slave_io_to_start.inc
--source include/stop_slave_io.inc
}
if (!$gtid_modes_compatible)
{
--let $slave_io_errno= convert_error(ER_SLAVE_FATAL_ERROR)
--source include/wait_for_slave_io_error.inc
}
# Auto_position compatible with slave and/or master
if ($slave_gtid_mode == 0)
{
--error ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
CHANGE MASTER TO MASTER_AUTO_POSITION = 0;
}
if ($slave_gtid_mode != 0)
{
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
START SLAVE IO_THREAD;
if ($master_gtid_mode != 3)
{
--let $slave_io_errno= convert_error(ER_SLAVE_FATAL_ERROR)
--source include/wait_for_slave_io_error.inc
}
if ($master_gtid_mode == 3)
{
--source include/wait_for_slave_io_to_start.inc
--source include/stop_slave_io.inc
}
CHANGE MASTER TO MASTER_AUTO_POSITION = 0;
}
--inc $slave_gtid_mode
}
--inc $master_gtid_mode
}
#
# In all the test cases below for catching an error in sender thread,
# we follow the steps (1-2) mentioned below.
# Before the steps, lets look at some theory:
#
# 0. The way we report errors in sender (aka dump) thread is this:
#
# a) Relay the error in sender thread to receiver thread.
#
# b) Receiver thread prefixes 'Got fatal error 1236 from master
# when reading data from binary log...' to the error that it
# received from sender thread. Let call this concatenated
# message '$concated_message'
#
# c) Receiver thread reports this error in
# performance_schema.replication_connection_status as
# c.1. LAST_ERROR_NUMBER= 1236
# c.2. LAST_ERROR_MESSAGE= '$concated_message'.
#
# And now the steps:
#
# 1. Wait until receiver thread reports error number 1236 in
# performance_schema.rpelication_connection_status::LAST_ERROR_MESSAGE
# This is merely a synchronization point for us to wait until
# the error was generated. This is done using
# include/wait_for_slave_io_error.inc
#
# 2. Check that 1236 was reported for the exact sender thread error
# that we are testing This is done using include/assert.inc to
# make sure the correct error messsage was passed from sender
# thread.
--echo #
--echo # Test for ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF
--echo # eng "Cannot replicate GTID-transaction when GTID_MODE = OFF, at file %.512s, position %lld. Found a Gtid_log_event when @@GLOBAL.GTID_MODE = OFF.
--echo #
--echo #
--echo # Case 1: Error on Master(sender thread)
--echo #
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t1 (a int);
--let $rpl_server_numbers= 1,2
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
START SLAVE IO_THREAD;
--let $slave_io_errno= 13114 # ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF
--source include/wait_for_slave_io_error.inc
--let $assert_text= sender thread should report - Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF.
--let $assert_cond= COUNT(*) = 1 FROM performance_schema.replication_connection_status WHERE LAST_ERROR_MESSAGE LIKE "%Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF%";
--source include/assert.inc
--let $assert_text= Receiver thread should report - Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF
--let $assert_only_after= Slave I/O thread for channel '': connected to master
--let $assert_count= 2
--source include/assert_grep.inc
--source include/rpl_connection_master.inc
DROP TABLE t1;
RESET MASTER;
--source include/rpl_connection_slave.inc
RESET SLAVE;
--echo #
--echo # Case 2: Error on Slave(receiver thread)
--echo #
--let $rpl_server_numbers= 1,2
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
--source include/start_slave.inc
--let $rpl_server_numbers= 2
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t2(a int);
--source include/rpl_connection_slave.inc
# Errors in queue_event() are overwritten in SHOW SLAVE STATUS/P_S
# by (13122 ER_SLAVE_RELAY_LOG_WRITE_FAILURE).
# So the only place where old error exists is slave error log.
# Grep error log to look for old error.
--let $slave_io_errno= 13122 # ER_SLAVE_RELAY_LOG_WRITE_FAILURE
--source include/wait_for_slave_io_error.inc
--let $assert_text= Receiver thread should report - Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF
--let $assert_only_after= Slave I/O thread for channel '': connected to master
--let $assert_count= 1
--source include/assert_grep.inc
--source include/rpl_connection_master.inc
DROP TABLE t2;
--source include/rpl_connection_slave.inc
--let $rpl_server_numbers= 2
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/start_slave.inc
--echo #
--echo # Warning: "Detected misconfiguration: replication channel '%.192s' was configured with AUTO_POSITION = 1, but the server was started with --gtid-mode=off. Either reconfigure replication using CHANGE MASTER TO MASTER_AUTO_POSITION = 0 FOR CHANNEL '%.192s', or change GTID_MODE to some value other than OFF, before starting the slave receiver thread."
--echo #
--let $rpl_server_numbers= 1,2
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
--source include/stop_slave.inc
CHANGE MASTER TO MASTER_AUTO_POSITION= 1;
--let $rpl_server_number=2
--let $rpl_start_with_gtids= 0
--source include/rpl_restart_server.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
--let $assert_text= While AUTO_POSITION is set, attempt to restart the slave with gtid-mode= off to get ER_STARTING_WITH_GTID_MODE_OFF_AND_AUTO_POSITION.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Detected misconfiguration: replication channel '' was configured with AUTO_POSITION = 1, but the server was started with --gtid-mode=off
--let $assert_count= 1
--source include/assert_grep.inc
--echo #
--echo # ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF
--echo # eng "The replication receiver thread for channel '%s' cannot start in AUTO_POSITION mode: this server uses GTID_MODE = OFF."
--echo #
# This should follow the previous test case of warning for the detected misconfiguration between autposition and gtid-mode.
--error ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF
START SLAVE IO_THREAD;
CHANGE MASTER TO MASTER_AUTO_POSITION= 0;
--echo #
--echo # ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON
--echo # eng "Cannot replicate anonymous transaction when GTID_MODE = ON, at file %.512s, position %lld."
--echo #
--echo # Case 1: Error on master(sender thread)
--echo #
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t3(a int);
--let $rpl_server_numbers= 1,2
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
START SLAVE IO_THREAD;
--let $slave_io_errno= 13114 # ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON
--source include/wait_for_slave_io_error.inc
--let $assert_text= sender thread should report - Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON.
--let $assert_cond= COUNT(*) = 1 FROM performance_schema.replication_connection_status WHERE LAST_ERROR_MESSAGE LIKE "%Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON%";
--source include/assert.inc
--let $assert_text= While gtid-mode=on, slave expects an anonymous event to get ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON
--let $assert_only_after= Slave I/O thread for channel '': connected to master
--let $assert_count= 2
--source include/assert_grep.inc
--source include/rpl_connection_master.inc
DROP TABLE t3;
--let $slave_io_errno= convert_error(ER_SERVER_MASTER_FATAL_ERROR_READING_BINLOG)
--source include/rpl_reset.inc
--echo #
--echo # Case 2: Error on slave(receiver thread)
--echo #
--let $rpl_server_numbers= 1
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t4(a int);
--source include/rpl_connection_slave.inc
--let $slave_io_errno= 13122 # ER_SLAVE_RELAY_LOG_WRITE_FAILURE
--source include/wait_for_slave_io_error.inc
--let $assert_text= While gtid-mode=on, slave expects an anonymous event to get ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON
--let $assert_only_after= Slave I/O thread for channel '': connected to master
--let $assert_count= 1
--source include/assert_grep.inc
--source include/stop_slave_sql.inc
--let $rpl_server_numbers= 2
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
DROP TABLE t4;
RESET MASTER;
--source include/rpl_connection_slave.inc
RESET SLAVE;
--source include/start_slave.inc
--source include/rpl_connection_master.inc
--source include/sync_slave_sql_with_master.inc
--echo #
--echo # ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION
--echo # eng "Cannot replicate anonymous transaction when AUTO_POSITION = 1, at file %.512s, position %lld."
--echo #
--echo #
--echo # Case 1: Error on master(sender thread).
--echo #
--let $rpl_server_numbers= 1,2
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t5(a int); # gtid1
# sync here so that we are sure table exists on slave, so we can sync DROP TABLE later.
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave.inc
--source include/rpl_connection_master.inc
# Generate at least one GTID transaction before the anonymous for autoposition
# to start from here and then discover the anonymous transaction in binary log.
INSERT INTO t5 VALUES(2);
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON_PERMISSIVE
--source include/rpl_set_gtid_mode.inc
SET @@SESSION.GTID_NEXT = 'ANONYMOUS';
INSERT INTO t5 VALUES(1); # anonymous transaction
--let $rpl_server_numbers= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--let $rpl_server_numbers= 2
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
CHANGE MASTER TO MASTER_AUTO_POSITION= 1;
START SLAVE IO_THREAD;
--let $slave_io_errno= 13114 # ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION
--source include/wait_for_slave_io_error.inc
--let $assert_text= sender thread should report - Cannot replicate anonymous transaction when AUTO_POSITION = 1.
--let $assert_cond= COUNT(*) = 1 FROM performance_schema.replication_connection_status WHERE LAST_ERROR_MESSAGE LIKE "%Cannot replicate anonymous transaction when AUTO_POSITION = 1%";
--source include/assert.inc
--let $assert_text= While AUTO_POSITION is enabled, Master sends an anonymous transaction resulting into ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate anonymous transaction when AUTO_POSITION = 1
--let $assert_count= 2
--source include/assert_grep.inc
--let $rpl_server_number=1
--let $rpl_start_with_gtids= 0
--source include/rpl_restart_server.inc
--source include/rpl_connection_master.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
--source include/rpl_connection_slave.inc
CHANGE MASTER TO MASTER_AUTO_POSITION= 0;
--let $rpl_server_numbers= 2
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
DROP TABLE t5;
RESET MASTER;
--source include/rpl_connection_slave.inc
RESET SLAVE;
--let $rpl_skip_sync=0
--source include/start_slave.inc
--source include/rpl_connection_master.inc
--source include/sync_slave_sql_with_master.inc
--echo #
--echo # Case 2: Error on Slave(receiver thread).
--echo #
# Same test as Case 1 but this time we disable the error in sender thread
# using DBUG_EXECUTE_IF so that receiver thread sees this error now.
# We next verify that the same error is also caught by receiver thread.
--source include/rpl_connection_master.inc
SET @debug_saved= @@GLOBAL.DEBUG;
SET GLOBAL DEBUG= "d,skip_sender_anon_autoposition_error";
--let $rpl_server_numbers= 1,2
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
CREATE TABLE t6(a int); # gtid1
# sync here so that we are sure table exists on slave, so we can sync DROP TABLE later.
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave.inc
--source include/rpl_connection_master.inc
# Generate at least one GTID transaction before the anonymous for autoposition
# to start from here and then discover the anonymous transaction in binary log.
INSERT INTO t6 VALUES(2);
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON_PERMISSIVE
--source include/rpl_set_gtid_mode.inc
SET @@SESSION.GTID_NEXT = 'ANONYMOUS';
INSERT INTO t6 VALUES(1); # anonymous transaction
--let $rpl_server_numbers= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--let $rpl_server_numbers= 2
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_slave.inc
CHANGE MASTER TO MASTER_AUTO_POSITION= 1;
START SLAVE IO_THREAD;
--let $slave_io_errno= 13122 # ER_SLAVE_RELAY_LOG_WRITE_FAILURE
--source include/wait_for_slave_io_error.inc
--let $assert_text= While AUTO_POSITION is enabled, Master sends an anonymous transaction resulting into ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION.
--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_select= Cannot replicate anonymous transaction when AUTO_POSITION = 1
--let $assert_count= 1
--source include/assert_grep.inc
--source include/rpl_connection_slave.inc
CHANGE MASTER TO MASTER_AUTO_POSITION= 0;
--let $rpl_server_numbers= 1,2
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
SET @@GLOBAL.DEBUG= @debug_saved;
SET DEBUG_SYNC= 'RESET';
DROP TABLE t6;
RESET MASTER;
--source include/rpl_connection_slave.inc
RESET SLAVE;
--let $rpl_skip_sync=0
--source include/start_slave.inc
--source include/rpl_connection_master.inc
--source include/sync_slave_sql_with_master.inc
# It is enough to run this test on 1 server, no replication required.
--echo #
--echo # Verify the behaviour when rotate fails while setting gtid_mode.
--echo #
--source include/rpl_connection_slave.inc
--source include/start_slave.inc
--source include/rpl_connection_master.inc
call mtr.add_suppression("Could not open * for logging");
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave.inc
SET @debug_saved= @@GLOBAL.DEBUG;
SET GLOBAL DEBUG= "d,fault_injection_new_file_rotate_event";
SET GLOBAL binlog_error_action= IGNORE_ERROR;
--error ER_ERROR_ON_WRITE
SET @@GLOBAL.GTID_MODE= OFF_PERMISSIVE;
# Cleanup
SET @@GLOBAL.GTID_MODE= OFF;
SET @@GLOBAL.DEBUG= @debug_saved;
--eval SET GLOBAL binlog_error_action= $saved_binlog_error_action
# Binlog was closed as a result of the error, restart server to recover.
--let $rpl_server_number= 1
--source include/rpl_restart_server.inc
--source include/rpl_connection_master.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
--echo #
--echo # ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON
--echo # generated when re-acquiring anonymous ownership
--echo #
--source include/rpl_connection_master.inc
SET GTID_NEXT='ANONYMOUS';
CREATE TABLE t7(a int);
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= ON
--source include/rpl_set_gtid_mode.inc
--error ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON
INSERT INTO t7 values (1);
SET GTID_NEXT='AUTOMATIC';
DROP TABLE t7;
RESET MASTER;
--let $rpl_server_numbers= 1
--let $rpl_skip_sync= 1
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
# Get rid of the manually generated slave error log file.
#--remove_file $MYSQLTEST_VARDIR/tmp/slave-rpl-gtid-mode.err
--echo #
--echo # Error generated if master has an unknown gtid_mode
--echo #
--connection slave
--source include/stop_slave.inc
RESET SLAVE;
SET @@GLOBAL.DEBUG= 'd,simulate_master_has_unknown_gtid_mode';
START SLAVE IO_THREAD;
--let $slave_io_errno= convert_error(ER_SLAVE_FATAL_ERROR)
--let $show_slave_io_error= 1
--source include/wait_for_slave_io_error.inc
SET @@GLOBAL.DEBUG= @debug_saved;
--echo #
--echo # Warning generated if master has unknown gtid_mode that begins
--echo # with ON or OFF.
--echo #
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
SET @@GLOBAL.DEBUG = 'd,simulate_master_has_gtid_mode_on_something';
--source include/start_slave.inc
--let $assert_file=$MYSQLTEST_VARDIR/log/mysqld.2.err
--let $assert_count= 1
--let $assert_only_after= Slave I/O thread for channel '': connected to master
--let $assert_text= Receiver thread should report that on_something is unknown
--let $assert_select= Slave I/O for channel '': The master uses an unknown GTID_MODE 'on_something'. Treating it as 'ON'.
--source include/assert_grep.inc
--source include/stop_slave.inc
SET @@GLOBAL.DEBUG = 'd,simulate_master_has_gtid_mode_off_something';
--source include/start_slave.inc
--let $assert_text= Receiver thread should report that off_something is unknown
--let $assert_select= Slave I/O for channel '': The master uses an unknown GTID_MODE 'off_something'. Treating it as 'OFF'.
--source include/assert_grep.inc
--source include/stop_slave.inc
RESET SLAVE;
--echo #
--echo # ER_CANT_SET_GTID_MODE generated because AUTO_POSITION = 1.
--echo #
--let $rpl_server_numbers= 1
--let $rpl_gtid_mode= ON
--let $rpl_skip_sync= 1
--source include/rpl_set_gtid_mode.inc
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
--error ER_CANT_SET_GTID_MODE
SET @@GLOBAL.GTID_MODE = OFF;
CHANGE MASTER TO MASTER_AUTO_POSITION = 0;
SET @@GLOBAL.GTID_MODE = OFF;
--let $rpl_server_numbers= 1
--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
--source include/rpl_connection_master.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
--source include/rpl_connection_slave.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
--let $rpl_skip_sync= 0
--let $rpl_only_running_threads= 1
--source include/rpl_end.inc