summaryrefslogtreecommitdiff
path: root/sql/log.cc
diff options
context:
space:
mode:
authorSujatha <sujatha.sivakumar@mariadb.com>2020-01-09 12:45:05 +0530
committerSujatha <sujatha.sivakumar@mariadb.com>2020-01-09 12:45:05 +0530
commit41cde4fe2219ea20ad5364c3b648bdebf2927270 (patch)
treec593bf08fd00d3aa25c8104760a4c28a86dfd1ce /sql/log.cc
parent8317f77ccc490c94f2f43d2e6d4104c87f232563 (diff)
downloadmariadb-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.cc3
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);
};