1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge 10.2 into 10.3

This commit is contained in:
Marko Mäkelä
2021-10-21 13:41:04 +03:00
70 changed files with 1947 additions and 527 deletions

View File

@@ -0,0 +1,48 @@
# This file ensures that a slave's id filtering variables (i.e. DO_DOMAIN_IDS,
# IGNORE_DOMAIN_IDS, and IGNORE_SERVER_IDS) are cleared after issuing
# `RESET SLAVE ALL`.
#
# param $_do_domain_ids Integer list of values to use for DO_DOMAIN_IDS
# param $_ignore_domain_ids Integer list of values to use for IGNORE_DOMAIN_IDS
# param $_ignore_server_ids Integer list of values to use for IGNORE_SERVER_IDS
#
--echo # Id filtering variable values should be empty initially
let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1);
let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1);
let $ignore_server_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Server_Ids, 1);
if (`SELECT "$do_domain_ids_before" != "" OR
"$ignore_domain_ids_before" != "" OR
"$ignore_server_ids_before" != ""`)
{
die("CHANGE MASTER TO id filter variables are not empty initially");
}
--echo # Set id filtering variables
eval CHANGE MASTER TO DO_DOMAIN_IDS=$_do_domain_ids, IGNORE_DOMAIN_IDS=$_ignore_domain_ids, IGNORE_SERVER_IDS=$_ignore_server_ids, MASTER_USE_GTID=SLAVE_POS;
let $do_domain_ids_set= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1);
let $ignore_domain_ids_set= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1);
let $ignore_server_ids_set= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Server_Ids, 1);
--echo # do domain id list: $do_domain_ids_set
--echo # ignore domain id list: $ignore_domain_ids_set
--echo # ignore server id list: $ignore_server_ids_set
--echo # RESET SLAVE ALL should clear values for all id filtering variables
RESET SLAVE ALL;
--replace_result $MASTER_MYPORT MASTER_MYPORT
eval change master to master_port=$MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
--source include/start_slave.inc
--source include/stop_slave.inc
let $do_domain_ids_cleared= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1);
let $ignore_domain_ids_cleared= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1);
let $ignore_server_ids_cleared= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Server_Ids, 1);
if (`SELECT "$do_domain_ids_cleared" != "" OR
"$ignore_domain_ids_cleared" != "" OR
"$ignore_server_ids_cleared" != ""`)
{
die("RESET SLAVE ALL did not clear id filtering variables");
}

View File

@@ -0,0 +1,43 @@
include/master-slave.inc
[connection master]
#
# Failed CHANGE MASTER TO should not change relay log status
#
connection slave;
include/stop_slave.inc
SET @@debug_dbug="d,simulate_find_log_pos_error";
CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS;
ERROR HY000: Target log not found in binlog index
SET @@debug_dbug="";
include/start_slave.inc
#
# Ensure relay log can be updated after a failed CHANGE MASTER
#
FLUSH RELAY LOGS;
include/wait_for_slave_param.inc [Relay_Log_File]
#
# Slave should continue to receive data from old master after failed
# CHANGE MASTER TO
#
connection master;
CREATE TABLE t1 (a int);
insert into t1 values (1);
connection slave;
connection slave;
#
# Future CHANGE MASTER calls should succeed
#
include/stop_slave.inc
CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS;
include/start_slave.inc
########################
# Cleanup
########################
connection master;
DROP TABLE t1;
connection slave;
include/stop_slave.inc
RESET SLAVE ALL;
change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/start_slave.inc
include/rpl_end.inc

View File

@@ -0,0 +1,54 @@
include/master-slave.inc
[connection master]
connection slave;
include/stop_slave.inc
#
# Category 1) DO_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
#
# Id filtering variable values should be empty initially
# Set id filtering variables
CHANGE MASTER TO DO_DOMAIN_IDS=(1), IGNORE_DOMAIN_IDS=(), IGNORE_SERVER_IDS=(3), MASTER_USE_GTID=SLAVE_POS;
# do domain id list: 1
# ignore domain id list:
# ignore server id list: 3
# RESET SLAVE ALL should clear values for all id filtering variables
RESET SLAVE ALL;
change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/start_slave.inc
include/stop_slave.inc
#
# Category 2) IGNORE_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
#
# Id filtering variable values should be empty initially
# Set id filtering variables
CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(2), IGNORE_SERVER_IDS=(3), MASTER_USE_GTID=SLAVE_POS;
# do domain id list:
# ignore domain id list: 2
# ignore server id list: 3
# RESET SLAVE ALL should clear values for all id filtering variables
RESET SLAVE ALL;
change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/start_slave.inc
include/stop_slave.inc
#
# Category 3) Null check - edge case with all empty lists to ensure a
# lack of specification doesn't break anything
#
# Id filtering variable values should be empty initially
# Set id filtering variables
CHANGE MASTER TO DO_DOMAIN_IDS=(), IGNORE_DOMAIN_IDS=(), IGNORE_SERVER_IDS=(), MASTER_USE_GTID=SLAVE_POS;
# do domain id list:
# ignore domain id list:
# ignore server id list:
# RESET SLAVE ALL should clear values for all id filtering variables
RESET SLAVE ALL;
change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/start_slave.inc
include/stop_slave.inc
############################
# Cleanup
############################
connection slave;
change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/start_slave.inc
include/rpl_end.inc

View File

@@ -0,0 +1,93 @@
#
# Purpose:
# This test ensures that issuing a CHANGE MASTER will not put a replica into
# an inconsistent state if the slave cannot find the log files (i.e. the call to
# find_log_pos in reset_logs fails). More specifically, right before a replica
# purges the relay logs (part of the `CHANGE MASTER TO` logic), the relay log is
# temporarily closed with state LOG_TO_BE_OPENED. If the server is issued a
# CHANGE MASTER and it errors in-between the temporary log closure and purge,
# i.e. during the function find_log_pos, the log should be closed. The bug
# reported by MDEV-25284 revealed the log is not properly closed, such that
# future relay log updates fail, and future CHANGE MASTER calls crash the
# server.
#
# Methodology:
# This test ensures that the relay log is properly closed by ensuring future
# updates and CHANGE MASTER calls succeed.
#
# References:
# MDEV-25284: Assertion `info->type == READ_CACHE ||
# info->type == WRITE_CACHE' failed
#
--source include/master-slave.inc
--source include/have_debug.inc
--echo #
--echo # Failed CHANGE MASTER TO should not change relay log status
--echo #
--connection slave
--source include/stop_slave.inc
SET @@debug_dbug="d,simulate_find_log_pos_error";
error 1373;
CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=SLAVE_POS;
SET @@debug_dbug="";
--source include/start_slave.inc
--echo #
--echo # Ensure relay log can be updated after a failed CHANGE MASTER
--echo #
FLUSH RELAY LOGS;
--let $slave_param= Relay_Log_File
--let $slave_param_value= slave-relay-bin.000003
--source include/wait_for_slave_param.inc
--echo #
--echo # Slave should continue to receive data from old master after failed
--echo # CHANGE MASTER TO
--echo #
--connection master
CREATE TABLE t1 (a int);
insert into t1 values (1);
--let $master_checksum= `CHECKSUM TABLE t1`
--sync_slave_with_master
--connection slave
if ($master_checksum != `CHECKSUM TABLE t1`)
{
die("Replica failed to pull data from primary after failed CHANGE MASTER TO");
}
--echo #
--echo # Future CHANGE MASTER calls should succeed
--echo #
--source include/stop_slave.inc
CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS;
--source include/start_slave.inc
--echo ########################
--echo # Cleanup
--echo ########################
--connection master
DROP TABLE t1;
--connection slave
--source include/stop_slave.inc
RESET SLAVE ALL;
--replace_result $MASTER_MYPORT MASTER_MYPORT
eval change master to master_port=$MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
--source include/start_slave.inc
--disable_query_log
call mtr.add_suppression("Failed to locate old binlog or relay log files");
--enable_query_log
--source include/rpl_end.inc

View File

@@ -0,0 +1,72 @@
#
# Purpose:
# This test validates that after issuing the `SLAVE RESET ALL` command,
# any corresponding IGNORE_DOMAIN_IDS/DO_DOMAIN_IDS and IGNORE_SERVER_IDS
# values are cleared.
#
#
# Methodology:
# To ensure the filtering variables are properly cleared after issuing
# SLAVE RESET ALL, we categorize different combinations of allowable input
# into three different options, and ensure that the variables are cleared for
# each category. The categories are as follows:
# Category 1) DO_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
# Category 2) IGNORE_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
# Category 3) Null check - edge case with all empty lists to ensure a lack
# of specification doesn't break anything
#
# To specify the values, the variables are set in `CHANGE MASTER TO`. To
# ensure the slave state is correct, we test the domain/server id filtering
# variable values at the following times while testing each category.
#
# Before CHANGE MASTER TO the filtering variables are tested to all be
# empty.
#
# After CHANGE MASTER TO the variables are tested to ensure they reflect
# those set in the CHANGE MASTER command.
#
# After RESET SLAVE ALL the filtering variables are tested to all be
# empty.
#
--source include/master-slave.inc
--source include/have_debug.inc
--connection slave
--source include/stop_slave.inc
--echo #
--echo # Category 1) DO_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
--echo #
--let $_do_domain_ids= (1)
--let $_ignore_domain_ids= ()
--let $_ignore_server_ids= (3)
--source include/rpl_reset_slave_all_check.inc
--echo #
--echo # Category 2) IGNORE_DOMAIN_IDS and IGNORE_SERVER_IDS specified together
--echo #
--let $_do_domain_ids= ()
--let $_ignore_domain_ids= (2)
--let $_ignore_server_ids= (3)
--source include/rpl_reset_slave_all_check.inc
--echo #
--echo # Category 3) Null check - edge case with all empty lists to ensure a
--echo # lack of specification doesn't break anything
--echo #
--let $_do_domain_ids= ()
--let $_ignore_domain_ids= ()
--let $_ignore_server_ids= ()
--source include/rpl_reset_slave_all_check.inc
--echo ############################
--echo # Cleanup
--echo ############################
--connection slave
--replace_result $MASTER_MYPORT MASTER_MYPORT
eval change master to master_port=$MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
--source include/start_slave.inc
--source include/rpl_end.inc