Commit 65c632cb authored by Andrei Elkin's avatar Andrei Elkin

MDEV-23832 Crash at startup in Log_event::read_log_event

The crash was caused by improper raising of an error or replication checksum
verification at time of the server initialization. As there is no THD object
associated with the main initializing thread yet the error text should be
assigned with calling a respective macro that is aware of that possibility.

Fixed accordingly.

[At merging to 10.4 the new test result file needs
 +# restart: --master_verify_checksum=ON --debug_dbug=+d,corrupt_read_log_event_char
that mtr run will hint on.]
parent 82301aea
set @@global.binlog_checksum = CRC32;
call mtr.add_suppression("Replication event checksum verification failed");
call mtr.add_suppression("Error in Log_event::read_log_event");
set @@global.debug_dbug = VALUE;
set @@global.master_verify_checksum = DO_CHECKSUM;
set @@global.binlog_checksum = BINLOG_CHECKSUM;
# EOF the test
# The test verifies server binlog-based recovery.
#
# MDEV-23832 checksum error at server binlog recovery should not crash
# The test logic really requires --log-bin.
--source include/have_binlog_format_mixed.inc
--source include/have_debug.inc
--let $do_checksum = `SELECT @@global.master_verify_checksum`
--let $debug_dbug_saved = `SELECT @@global.debug_dbug`
--let $binlog_checksum = `SELECT @@global.binlog_checksum`
set @@global.binlog_checksum = CRC32;
call mtr.add_suppression("Replication event checksum verification failed");
call mtr.add_suppression("Error in Log_event::read_log_event");
# Proof of no crash follows.
# There's no need for actual bin-loggable queries to the server
--let $restart_parameters= --master_verify_checksum=ON --debug_dbug="+d,corrupt_read_log_event_char"
--let $shutdown_timeout=0
--source include/restart_mysqld.inc
--let $restart_parameters=
--let $shutdown_timeout=
#
# Cleanup
--replace_regex /= .*/= VALUE/
--eval set @@global.debug_dbug = "$debug_dbug_saved"
--replace_result $do_checksum DO_CHECKSUM
--eval set @@global.master_verify_checksum = $do_checksum
--replace_result $binlog_checksum BINLOG_CHECKSUM
--eval set @@global.binlog_checksum = $binlog_checksum
#
--echo # EOF the test
#
......@@ -1632,7 +1632,7 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
else
DBUG_RETURN(NULL);
#else
*error= ER(ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE);
*error= ER_THD_OR_DEFAULT(current_thd, ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE);
sql_print_error("%s", *error);
DBUG_RETURN(NULL);
#endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment