mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
Problem: ======== SHOW BINLOG EVENTS FROM <pos> causes a variety of failures, some of which are listed below. It is not a race condition issue, but there is some non-determinism in it. Analysis: ======== "show binlog events from <pos>" code considers the user given position as a valid event start position. The code starts reading data from this event start position onwards and tries to map it to a set of known events. Each event has a specific event structure and asserts have been added to ensure that read event data satisfies the event specific requirements. When a random position is supplied to "show binlog events command" the event structure specific checks will fail and they result in assert. Fix: ==== The fix is split into different parts. Each part addresses either an ASAN issue or an assert/crash. **Part1: Checksum based position validation when checksum is enabled** Using checksum validate the very first event read at the user specified position. If there is a checksum mismatch report an appropriate error for the invalid event.
49 lines
1.3 KiB
Plaintext
49 lines
1.3 KiB
Plaintext
# ==== Purpose ====
|
|
#
|
|
# Test verifies that reading binary log by using "SHOW BINLOG EVENTS" command
|
|
# from various random positions doesn't lead to crash. It should exit
|
|
# gracefully with appropriate error.
|
|
#
|
|
# ==== References ====
|
|
#
|
|
# MDEV-18046:Assortment of crashes, assertion failures and ASAN errors in mysql_show_binlog_events
|
|
|
|
--source include/have_log_bin.inc
|
|
--source include/have_innodb.inc
|
|
|
|
RESET MASTER;
|
|
|
|
call mtr.add_suppression("Error in Log_event::read_log_event*");
|
|
call mtr.add_suppression("Replication event checksum verification failed while reading from a log file*");
|
|
|
|
DROP TABLE /*! IF EXISTS*/ t1;
|
|
CREATE TABLE `t1` (
|
|
`col_int` int,
|
|
pk integer auto_increment,
|
|
`col_char_12_key` char(12),
|
|
`col_int_key` int,
|
|
`col_char_12` char(12),
|
|
primary key (pk),
|
|
key (`col_char_12_key` ),
|
|
key (`col_int_key` )) ENGINE=InnoDB;
|
|
|
|
INSERT /*! IGNORE */ INTO t1 VALUES (183173120, NULL, 'abcd', 1, 'efghijk'), (1, NULL, 'lmno', 2, 'p');
|
|
|
|
--disable_warnings
|
|
ALTER TABLE `t1` ENABLE KEYS;
|
|
--enable_warnings
|
|
|
|
--let $max_pos= query_get_value(SHOW MASTER STATUS,Position,1)
|
|
--let $pos= 1
|
|
while ($pos <= $max_pos)
|
|
{
|
|
--disable_query_log
|
|
--disable_result_log
|
|
--error 0,1220
|
|
eval SHOW BINLOG EVENTS FROM $pos;
|
|
--inc $pos
|
|
--enable_result_log
|
|
--enable_query_log
|
|
}
|
|
DROP TABLE t1;
|