mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
555c12a541
Problem: ======= This patch addresses two issues: 1. An incident event can be incorrectly reported for transactions which are rolled back successfully. That is, an incident event should only be generated for failed “non-transactional transactions” (i.e., those which modify non-transactional tables) because they cannot be rolled back. 2. When the mariadb slave (error) stops at receiving the incident event there's no description of what led to it. Neither in the event nor in the master's error log. Solution: ======== Before reporting an incident event for a transaction, first validate that it is “non-transactional” (i.e. cannot be safely rolled back). To determine if a transaction is non-transactional, lex->stmt_accessed_table(LEX::STMT_WRITES_NON_TRANS_TABLE) is used because it is set previously in THD::decide_logging_format(). Additionally, when an incident event is written, write an error message to the server’s error log to indicate the underlying issue. Reviewed by: =========== Andrei Elkin <andrei.elkin@mariadb.com>
50 lines
1.6 KiB
Text
50 lines
1.6 KiB
Text
#############################################################
|
|
# Bug#23533: CREATE SELECT max_binlog_cache_size test
|
|
# case needed
|
|
#############################################################
|
|
|
|
--source include/have_innodb.inc
|
|
--source include/have_log_bin.inc
|
|
--source include/have_binlog_format_row.inc
|
|
call mtr.add_suppression("Write to binary log failed: Multi-statement transaction required more than .max_binlog_cache_size.*");
|
|
SET AUTOCOMMIT=0;
|
|
|
|
# Create 1st table
|
|
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b TEXT, PRIMARY KEY(a)) ENGINE=InnoDB;
|
|
--disable_query_log
|
|
let $i= 1000;
|
|
while ($i)
|
|
{
|
|
BEGIN;
|
|
eval INSERT INTO t1 VALUES($i, REPEAT('x', 4096));
|
|
COMMIT;
|
|
dec $i;
|
|
}
|
|
--enable_query_log
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
# Set small value for max_binlog_cache_size
|
|
let $saved_binlog_cache_size= query_get_value(SELECT @@binlog_cache_size AS Value, Value, 1);
|
|
let $saved_max_binlog_cache_size= query_get_value(SELECT @@max_binlog_cache_size AS Value, Value, 1);
|
|
SET GLOBAL binlog_cache_size=4096;
|
|
SET GLOBAL max_binlog_cache_size=4096;
|
|
|
|
# New value of max_binlog_cache_size will apply to new session
|
|
disconnect default;
|
|
connect(default,localhost,root,,test);
|
|
|
|
# Copied data from t1 into t2 large than max_binlog_cache_size
|
|
START TRANSACTION;
|
|
--error ER_TRANS_CACHE_FULL
|
|
CREATE TABLE t2 SELECT * FROM t1;
|
|
COMMIT;
|
|
SHOW TABLES LIKE 't%';
|
|
|
|
# 5.1 End of Test
|
|
--disable_query_log
|
|
eval SET GLOBAL max_binlog_cache_size=$saved_max_binlog_cache_size;
|
|
eval SET GLOBAL binlog_cache_size=$saved_binlog_cache_size;
|
|
--enable_query_log
|
|
DROP TABLE t1;
|
|
disconnect default;
|
|
connect(default,localhost,root,,test);
|