diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-01-17 11:19:41 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-01-17 11:19:41 +0200 |
commit | 343f695c7f660eca6bb97bb09bad317387f59b8f (patch) | |
tree | c484b833a4c27e8eb349ffe9e3966b32126b1c04 | |
parent | 16b87f9890145ff344bfd8cd751e6356a5a8139b (diff) | |
download | mariadb-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.cc | 10 |
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); |