mirror of
https://github.com/MariaDB/server.git
synced 2025-02-04 21:02:17 +01:00
eb4458e993
The current semi-sync binlog fail-over recovery process uses rpl_semi_sync_slave_enabled==TRUE as its condition to truncate a primary server’s binlog, as it is anticipating the server to re-join a replication topology as a replica. However, for servers configured with both rpl_semi_sync_master_enabled=1 and rpl_semi_sync_slave_enabled=1, if a primary is just re-started (i.e. retaining its role as master), it can truncate its binlog to drop transactions which its replica(s) has already received and executed. If this happens, when the replica reconnects, its gtid_slave_pos can be ahead of the recovered primary’s gtid_binlog_pos, resulting in an error state where the replica’s state is ahead of the primary’s. This patch changes the condition for semi-sync recovery to truncate the binlog to instead use the configuration variable --init-rpl-role, when set to SLAVE. This allows for both rpl_semi_sync_master_enabled and rpl_semi_sync_slave_enabled to be set for a primary that is restarted, and no transactions will be lost, so long as --init-rpl-role is not set to SLAVE. Reviewed By: ============ Sergei Golubchik <serg@mariadb.com>
87 lines
2.7 KiB
Text
87 lines
2.7 KiB
Text
# ==== Purpose ====
|
|
#
|
|
# Test verifies truncation of multiple binary logs.
|
|
#
|
|
# ==== References ====
|
|
# MDEV-21117: recovery for --rpl-semi-sync-slave-enabled server
|
|
|
|
--source include/have_innodb.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/have_binlog_format_row.inc
|
|
|
|
call mtr.add_suppression("Can.t init tc log");
|
|
call mtr.add_suppression("Aborting");
|
|
|
|
SET @@global.max_binlog_size= 4096;
|
|
SET @@global.sync_binlog= 1;
|
|
RESET MASTER;
|
|
FLUSH LOGS;
|
|
CREATE TABLE ti (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb;
|
|
CREATE TABLE tm (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=MyISAM;
|
|
|
|
connect(master1,localhost,root,,);
|
|
--echo "List of binary logs before rotation"
|
|
--source include/show_binary_logs.inc
|
|
|
|
# Some load to either non- and transactional egines
|
|
# that should not affect the following recovery:
|
|
INSERT INTO ti VALUES(1,"I am gonna survive");
|
|
INSERT INTO tm VALUES(1,"me too!");
|
|
|
|
# hold on near engine commit
|
|
SET DEBUG_SYNC= "commit_after_release_LOCK_after_binlog_sync SIGNAL master1_ready WAIT_FOR master1_go_never_arrives";
|
|
--send INSERT INTO ti VALUES (2, REPEAT("x", 4100))
|
|
|
|
connect(master2,localhost,root,,);
|
|
# The 2nd trx for recovery, it does not rotate binlog
|
|
SET DEBUG_SYNC= "now WAIT_FOR master1_ready";
|
|
SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL master2_ready WAIT_FOR master2_go_never_arrives";
|
|
--send INSERT INTO ti VALUES (3, "not gonna survive")
|
|
|
|
--connection default
|
|
SET DEBUG_SYNC= "now WAIT_FOR master2_ready";
|
|
|
|
connect(master3,localhost,root,,);
|
|
# The 3nd trx for recovery, it won't get into binlog nor therefore recover
|
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL master3_ready WAIT_FOR master3_go_never_arrives";
|
|
--send INSERT INTO ti VALUES (4, "not gonna be log therefore survive"),(5, "ditto")
|
|
|
|
--connection default
|
|
SET DEBUG_SYNC= "now WAIT_FOR master3_ready";
|
|
|
|
--echo "List of binary logs before crash"
|
|
--source include/show_binary_logs.inc
|
|
--echo # The gtid binlog state prior the crash will be truncated at the end of the test
|
|
SELECT @@global.gtid_binlog_state;
|
|
|
|
--connection default
|
|
--source include/kill_mysqld.inc
|
|
--disconnect master1
|
|
--disconnect master2
|
|
--disconnect master3
|
|
|
|
#
|
|
# Server restart
|
|
#
|
|
--let $restart_parameters= --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3
|
|
--source include/start_mysqld.inc
|
|
|
|
# Check error log for a successful truncate message.
|
|
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
|
|
--let SEARCH_FILE=$log_error_
|
|
--let SEARCH_PATTERN=truncated binlog file:.*master.*000002
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
|
|
--echo "One record should be present in table"
|
|
SELECT * FROM ti;
|
|
|
|
--echo # The truncated gtid binlog state
|
|
SELECT @@global.gtid_binlog_state;
|
|
SELECT @@global.gtid_binlog_pos;
|
|
|
|
--echo # Cleanup
|
|
DROP TABLE ti;
|
|
SET @@global.sync_binlog= default;
|
|
--echo # End of the tests
|