summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-12-11 10:06:32 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2017-12-11 10:12:14 +0200
commit40eee1da17d529e35b554298e6bc400be8ed0e9c (patch)
treec412252c7ed875bc87310163dba1a3900ac98e61
parent86beb08774178d50453f5163c01abaf2505f2778 (diff)
downloadmariadb-git-40eee1da17d529e35b554298e6bc400be8ed0e9c.tar.gz
MDEV-14614 InnoDB: Failing assertion: trx->error_state == DB_SUCCESS or lock wait timeout upon saving statistics
The assertion failure was caused by MDEV-14511 Use fewer transactions for updating InnoDB persistent statistics We are reusing a transaction object after commit, and sometimes, even after a successful operation, the trx_t::error_state may be something else than DB_SUCCESS. Reset the field when needed.
-rw-r--r--storage/innobase/btr/btr0defragment.cc1
-rw-r--r--storage/innobase/dict/dict0defrag_bg.cc7
-rw-r--r--storage/innobase/dict/dict0stats_bg.cc1
-rw-r--r--storage/innobase/handler/ha_innodb.cc3
-rw-r--r--storage/innobase/handler/handler0alter.cc1
5 files changed, 13 insertions, 0 deletions
diff --git a/storage/innobase/btr/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc
index cdbe47d48f8..86df5a077a8 100644
--- a/storage/innobase/btr/btr0defragment.cc
+++ b/storage/innobase/btr/btr0defragment.cc
@@ -831,6 +831,7 @@ DECLARE_THREAD(btr_defragment_thread)(void*)
mtr_commit(&mtr);
/* Reaching the end of the index. */
dict_stats_empty_defrag_stats(index);
+ trx->error_state = DB_SUCCESS;
ut_d(trx->persistent_stats = true);
++trx->will_lock;
dberr_t err = dict_stats_save_defrag_stats(index, trx);
diff --git a/storage/innobase/dict/dict0defrag_bg.cc b/storage/innobase/dict/dict0defrag_bg.cc
index e43a75b2cf7..34120f0bdc9 100644
--- a/storage/innobase/dict/dict0defrag_bg.cc
+++ b/storage/innobase/dict/dict0defrag_bg.cc
@@ -213,6 +213,7 @@ dict_stats_process_entry_from_defrag_pool(trx_t* trx)
index_id_t index_id;
ut_ad(!srv_read_only_mode);
+ ut_ad(trx->persistent_stats);
/* pop the first index from the auto defrag pool */
if (!dict_stats_defrag_pool_get(&table_id, &index_id)) {
@@ -242,6 +243,7 @@ dict_stats_process_entry_from_defrag_pool(trx_t* trx)
}
mutex_exit(&dict_sys->mutex);
+ trx->error_state = DB_SUCCESS;
++trx->will_lock;
dberr_t err = dict_stats_save_defrag_stats(index, trx);
@@ -275,6 +277,8 @@ dict_defrag_process_entries_from_defrag_pool(trx_t* trx)
dberr_t
dict_stats_save_defrag_summary(dict_index_t* index, trx_t* trx)
{
+ ut_ad(trx->persistent_stats);
+
if (dict_index_is_ibuf(index)) {
return DB_SUCCESS;
}
@@ -294,6 +298,9 @@ dict_stats_save_defrag_summary(dict_index_t* index, trx_t* trx)
dberr_t
dict_stats_save_defrag_stats(dict_index_t* index, trx_t* trx)
{
+ ut_ad(trx->error_state == DB_SUCCESS);
+ ut_ad(trx->persistent_stats);
+
if (dict_index_is_ibuf(index)) {
return DB_SUCCESS;
}
diff --git a/storage/innobase/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc
index 0f76c73bc96..3f5419a0751 100644
--- a/storage/innobase/dict/dict0stats_bg.cc
+++ b/storage/innobase/dict/dict0stats_bg.cc
@@ -378,6 +378,7 @@ dict_stats_process_entry_from_recalc_pool(trx_t* trx)
dict_stats_recalc_pool_add(table);
} else {
+ trx->error_state = DB_SUCCESS;
++trx->will_lock;
dict_stats_update(table, DICT_STATS_RECALC_PERSISTENT, trx);
if (trx->state != TRX_STATE_NOT_STARTED) {
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index a87ab677d04..e7a4532a604 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -6480,6 +6480,7 @@ no_such_table:
}
ut_ad(!trx->persistent_stats);
ut_d(trx->persistent_stats = true);
+ trx->error_state = DB_SUCCESS;
++trx->will_lock;
dict_stats_init(ib_table, trx);
innobase_commit_low(trx);
@@ -13281,6 +13282,7 @@ create_table_info_t::create_table_update_dict()
innobase_copy_frm_flags_from_create_info(innobase_table, m_create_info);
++m_trx->will_lock;
+ m_trx->error_state = DB_SUCCESS;
dict_stats_update(innobase_table, DICT_STATS_EMPTY_TABLE, m_trx);
innobase_commit_low(m_trx);
@@ -14045,6 +14047,7 @@ ha_innobase::rename_table(
normalize_table_name(norm_from, from);
normalize_table_name(norm_to, to);
+ trx->error_state = DB_SUCCESS;
++trx->will_lock;
ret = dict_stats_rename_table(norm_from, norm_to,
errstr, sizeof errstr, trx);
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index d2401bd4e2d..44c40d05b4c 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -9073,6 +9073,7 @@ foreign_fail:
}
row_mysql_unlock_data_dictionary(trx);
+ trx->error_state = DB_SUCCESS;
++trx->will_lock;
/* TODO: The following code could be executed