mariadb/mysql-test/suite/rpl/t/rpl_mdev13831.test
Kristian Nielsen d13eb66f4f MDEV-13831: Assertion on event group missing XID/COMMIT event
The assertion occurred in the SQL thread if an event group was incompletely
written, missing the end XID or COMMIT event, and immediately followed by a
new event group. This could also lead to the incomplete event group being
committed, and with the wrong GTID.

Fix by rolling back any active transaction from a prior event group when
applying the following GTID event.

Getting an incomplete event like this is somewhat rare to happen. If the
server crashes in the middle of writing an event group, the server restart
will write a new format description event, which makes the slave roll back
the partial event group. But presumably it could happen if the master
experiences temporary write errors in the binlog, like intermittent disk
full for example.

Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
2024-12-05 12:08:12 +01:00

41 lines
1.2 KiB
Text

--source include/have_debug.inc
--source include/have_innodb.inc
--source include/have_binlog_format_mixed.inc
--source include/master-slave.inc
--echo *** MDEV-13831: Assertion on event group missing XID/COMMIT event
--connection slave
--source include/stop_slave.inc
# Use non-GTID mode. In GTID mode, the IO thread will fail if it sees an
# incomplete event group after MDEV-27697 patch.
CHANGE MASTER TO Master_use_gtid= No;
--source include/start_slave.inc
--connection master
# The dbug injection below is only active in legacy mode.
SET @old_legacy= @@GLOBAL.binlog_legacy_event_pos;
SET GLOBAL binlog_legacy_event_pos= 1;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
--connection master1
SET @old_dbug= @@SESSION.debug_dbug;
SET SESSION debug_dbug = '+d,fail_binlog_write_1';
--error ER_ERROR_ON_WRITE
UPDATE t1 SET a = 2;
SET debug_dbug= @old_dbug;
--error ER_BAD_TABLE_ERROR
DROP TEMPORARY TABLE t1;
--connection master
CREATE TEMPORARY TABLE t1 (i INT) ENGINE=InnoDB;
--sync_slave_with_master
--connection master
SET GLOBAL binlog_legacy_event_pos= @old_legacy;
CALL mtr.add_suppression("Error writing file.*No space left on device");
DROP TEMPORARY TABLE t1;
DROP TABLE t1;
--source include/rpl_end.inc