mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-25284: Assertion `info->type == READ_CACHE || info->type == WRITE_CACHE' failed
Problem: ======== This patch addresses two issues. First, if a CHANGE MASTER command is issued and an error happens while locating the replica’s relay logs, the logs can be put into an invalid state where future updates fail and future CHANGE MASTER calls crash the server. 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 errors in-between the temporary log closure and purge, i.e. during the function find_log_pos, the log should be closed. MDEV-25284 reveals the log is not properly closed. Second, upon issuing a RESET SLAVE ALL command, a slave’s GTID filters are not cleared (DO_DOMAIN_IDS, IGNORE_DOMIAN_IDS, IGNORE_SERVER_IDS). MySQL had a similar bug report, Bug #18816897, which fixed this issue to clear IGNORE_SERVER_IDS after issuing RESET SLAVE ALL in version 5.7. Solution: ========= To fix the first problem, the CHANGE MASTER error handling logic was extended to transition the relay log state to LOG_CLOSED from LOG_TO_BE_OPENED. To fix the second problem, the RESET SLAVE ALL logic is extended to clear the domain_id filter and ignore_server_ids. Reviewed By: ============ Andrei Elkin <andrei.elkin@mariadb.com>
This commit is contained in:
48
mysql-test/suite/rpl/include/rpl_reset_slave_all_check.inc
Normal file
48
mysql-test/suite/rpl/include/rpl_reset_slave_all_check.inc
Normal 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");
|
||||
}
|
Reference in New Issue
Block a user