diff options
author | Sujatha <sujatha.sivakumar@mariadb.com> | 2020-01-09 12:45:05 +0530 |
---|---|---|
committer | Sujatha <sujatha.sivakumar@mariadb.com> | 2020-01-09 12:45:05 +0530 |
commit | 41cde4fe2219ea20ad5364c3b648bdebf2927270 (patch) | |
tree | c593bf08fd00d3aa25c8104760a4c28a86dfd1ce /sql/log.cc | |
parent | 8317f77ccc490c94f2f43d2e6d4104c87f232563 (diff) | |
download | mariadb-git-41cde4fe2219ea20ad5364c3b648bdebf2927270.tar.gz |
MDEV-18514: Assertion `!writer.checksum_len || writer.remains == 0' failed
Analysis:
========
'max_binlog_cache_size' is configured and a huge transaction is executed. When
the transaction specific events size exceeds 'max_binlog_cache_size' the event
cannot be written to the binary log cache and cache write error is raised.
Upon cache write error the statement is rolled back and the transaction cache
should be truncated to a previous statement specific position. The truncate
operation should reset the cache to earlier valid positions and flush the new
changes. Even though the flush is successful the cache write error is still in
marked state. The truncate code interprets the cache write error as cache flush
failure and returns abruptly without modifying the write cache parameters.
Hence cache is in a invalid state. When a COMMIT statement is executed in this
session it tries to flush the contents of transaction cache to binary log.
Since cache has partial events the cache write operation will report
'writer.remains' assert.
Fix:
===
Binlog truncate function resets the cache to a specified size. As a first step
of truncation, clear the cache write error flag that was raised during earlier
execution. With this new errors that surface during cache truncation can be
clearly identified.
Diffstat (limited to 'sql/log.cc')
-rw-r--r-- | sql/log.cc | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sql/log.cc b/sql/log.cc index 5fd384d55a0..91dfac07993 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -448,6 +448,7 @@ private: void truncate(my_off_t pos) { DBUG_PRINT("info", ("truncating to position %lu", (ulong) pos)); + cache_log.error=0; if (pending()) { delete pending(); @@ -456,7 +457,7 @@ private: reinit_io_cache(&cache_log, WRITE_CACHE, pos, 0, 0); cache_log.end_of_file= saved_max_binlog_cache_size; } - + binlog_cache_data& operator=(const binlog_cache_data& info); binlog_cache_data(const binlog_cache_data& info); }; |