summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-01-17 11:19:41 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2022-01-17 11:19:41 +0200
commit343f695c7f660eca6bb97bb09bad317387f59b8f (patch)
treec484b833a4c27e8eb349ffe9e3966b32126b1c04
parent16b87f9890145ff344bfd8cd751e6356a5a8139b (diff)
downloadmariadb-git-343f695c7f660eca6bb97bb09bad317387f59b8f.tar.gz
MDEV-27469: Assertion failure in defragment due to tx_read_only
In commit c5fd9aa562fb15e8d6ededceccbec0c9792a3243 (MDEV-25919) we prevented the function dict_stats_save_index_stat() from being called in read-only mode in dict_stats_save(), but not elsewhere. dict_stats_save_defrag_summary(), dict_stats_save_defrag_stats(): If the transaction is in read-only mode, return DB_READ_ONLY and do not attempt to lock or modify anything.
-rw-r--r--storage/innobase/dict/dict0defrag_bg.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/storage/innobase/dict/dict0defrag_bg.cc b/storage/innobase/dict/dict0defrag_bg.cc
index f843fcf5152..043ea24ccbf 100644
--- a/storage/innobase/dict/dict0defrag_bg.cc
+++ b/storage/innobase/dict/dict0defrag_bg.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 2016, 2021, MariaDB Corporation.
+Copyright (c) 2016, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -253,7 +253,9 @@ release_and_exit:
trx_t *trx= trx_create();
trx->mysql_thd= thd;
trx_start_internal(trx);
- dberr_t ret= lock_table_for_trx(table_stats, trx, LOCK_X);
+ dberr_t ret= trx->read_only
+ ? DB_READ_ONLY
+ : lock_table_for_trx(table_stats, trx, LOCK_X);
if (ret == DB_SUCCESS)
ret= lock_table_for_trx(index_stats, trx, LOCK_X);
row_mysql_lock_data_dictionary(trx);
@@ -388,7 +390,9 @@ release_and_exit:
trx_t *trx= trx_create();
trx->mysql_thd= thd;
trx_start_internal(trx);
- dberr_t ret= lock_table_for_trx(table_stats, trx, LOCK_X);
+ dberr_t ret= trx->read_only
+ ? DB_READ_ONLY
+ : lock_table_for_trx(table_stats, trx, LOCK_X);
if (ret == DB_SUCCESS)
ret= lock_table_for_trx(index_stats, trx, LOCK_X);