summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2018-05-15 11:46:55 +0300
committerMonty <monty@mariadb.org>2018-05-15 11:46:55 +0300
commit2b749a7bf4f6a6d70f05e8e4b42d088b397adea8 (patch)
tree6f81ed3e36863c24b492702eec05703b2fceae29
parent318097bb8f6e12c546b5dcd287416158209dbb39 (diff)
downloadmariadb-git-2b749a7bf4f6a6d70f05e8e4b42d088b397adea8.tar.gz
MDEV-654 Assertion `share->now_transactional' failed in flush_log_for_bitmap on concurrent workload with Aria tables
Problem was that we the bitmap needs to be flushed before disabling logging of redo entires, as writing the bitmap to disk by background checkpoint may cause redo entries.
-rw-r--r--storage/maria/ha_maria.cc1
-rw-r--r--storage/maria/ma_recovery.c8
2 files changed, 9 insertions, 0 deletions
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index 0c41037f33e..ca2d050ddfe 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -1312,6 +1312,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
old_proc_info= thd_proc_info(thd, "Checking status");
thd_progress_init(thd, 3);
error= maria_chk_status(param, file); // Not fatal
+ /* maria_chk_size() will flush the page cache for this file */
if (maria_chk_size(param, file))
error= 1;
if (!error)
diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c
index 75a8f4f4559..af0d9476f2a 100644
--- a/storage/maria/ma_recovery.c
+++ b/storage/maria/ma_recovery.c
@@ -3521,6 +3521,14 @@ void _ma_tmp_disable_logging_for_table(MARIA_HA *info,
{
MARIA_SHARE *share= info->s;
DBUG_ENTER("_ma_tmp_disable_logging_for_table");
+
+ /*
+ We have to ensure that bitmap is flushed, as it's checking
+ that share->now_transactional is set
+ */
+ if (share->now_transactional && share->data_file_type == BLOCK_RECORD)
+ _ma_bitmap_flush_all(share);
+
if (log_incomplete)
{
uchar log_data[FILEID_STORE_SIZE];