mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-16146: MariaDB slave stops with following errors.
Problem: ======== 180511 11:07:58 [ERROR] Slave I/O: Unexpected master's heartbeat data: heartbeat is not compatible with local info;the event's data: log_file_name mysql-bin.000009 log_pos 1054262041, Error_code: 1623 Analysis: ========= In replication setup when master server doesn't have any events to send to slave server it sends an 'Heartbeat_log_event'. This event carries the current binary log filename and offset details. The offset values is stored within 4 bytes of event header. When the size of binary log is higher than UINT32_MAX the log_pos values will not fit in 4 bytes memory. It overflows and hence slave stops with an error. Fix: === Since we cannot extend the common_header of Log_event class, a greater than 4GB value of Log_event::log_pos is made to be transported with a HeartBeat event's sub-header. Log_event::log_pos in such case is set to zero to indicate that the 8 byte sub-header is allocated in the event. In case of cross version replication following behaviour is expected OLD - Server without fix NEW - Server with fix OLD<->NEW : works bidirectionally as long as the binlog offset is (normally) within 4GB. When log_pos > UINT32_MAX OLD->NEW : The 'log_pos' is bound to overflow and NEW slave may report an invalid event/incompatible heart beat event error. NEW->OLD : Since patched server sets log_pos=0 on overflow, OLD slave will report invalid event error.
This commit is contained in:
17
mysql-test/suite/rpl/r/rpl_incompatible_heartbeat.result
Normal file
17
mysql-test/suite/rpl/r/rpl_incompatible_heartbeat.result
Normal file
@@ -0,0 +1,17 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
connection master;
|
||||
SET @saved_dbug = @@GLOBAL.debug_dbug;
|
||||
SET @@global.debug_dbug= 'd,simulate_pos_4G';
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD=0.001;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
||||
connection slave;
|
||||
connection master;
|
||||
CREATE TABLE t (f INT) ENGINE=INNODB;
|
||||
INSERT INTO t VALUES (10);
|
||||
DROP TABLE t;
|
||||
include/rpl_end.inc
|
44
mysql-test/suite/rpl/t/rpl_incompatible_heartbeat.test
Normal file
44
mysql-test/suite/rpl/t/rpl_incompatible_heartbeat.test
Normal file
@@ -0,0 +1,44 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Test verifies that slave IO thread can process heartbeat events with log_pos
|
||||
# values higher than UINT32_MAX.
|
||||
#
|
||||
# ==== Implementation ====
|
||||
#
|
||||
# Steps:
|
||||
# 0 - Stop slave threads. Configure a small master_heartbeat_period.
|
||||
# 1 - Using debug points, simulate a huge binlog offset higher than
|
||||
# UINT32_MAX on master.
|
||||
# 2 - Start the slave and observe that slave IO thread is able to process
|
||||
# the offset received through heartbeat event.
|
||||
#
|
||||
# ==== References ====
|
||||
#
|
||||
# MDEV-16146: MariaDB slave stops with incompatible heartbeat
|
||||
#
|
||||
--source include/have_debug.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
# Test simulates binarylog offsets higher than UINT32_MAX
|
||||
--source include/have_64bit.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--connection master
|
||||
SET @saved_dbug = @@GLOBAL.debug_dbug;
|
||||
SET @@global.debug_dbug= 'd,simulate_pos_4G';
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD=0.001;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
sleep 1;
|
||||
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
||||
--sync_slave_with_master
|
||||
|
||||
--connection master
|
||||
CREATE TABLE t (f INT) ENGINE=INNODB;
|
||||
INSERT INTO t VALUES (10);
|
||||
DROP TABLE t;
|
||||
--source include/rpl_end.inc
|
Reference in New Issue
Block a user