diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-04 18:19:13 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-04 18:31:30 +0300 |
commit | 5e7e7153b439ea1b12588f5830d66b3a0cf13414 (patch) | |
tree | bd3751b69f9470f1b9b9f26cc301c340ca70d293 /storage | |
parent | f5cff8980a7f55069b01dcc9e124880c75930c91 (diff) | |
download | mariadb-git-5e7e7153b439ea1b12588f5830d66b3a0cf13414.tar.gz |
MDEV-22452: Missing call to wsrep_commit_ordered in trx_t::commit()
This is a follow-up fix to the changes that were made in MDEV-7962.
assert_trx_is_free(): Assert !is_wsrep().
trx_init(): Do not initialize trx->wsrep, because it must have been
initialized already.
trx_t::commit_in_memory(): Invoke wsrep_commit_ordered(). This call
was being skipped, because the transaction object had already been
freed to the pool.
trx_rollback_for_mysql(), innobase_commit_low(),
innobase_close_connection(): Always reset trx->wsrep.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 25 | ||||
-rw-r--r-- | storage/innobase/include/trx0trx.h | 1 | ||||
-rw-r--r-- | storage/innobase/trx/trx0roll.cc | 3 | ||||
-rw-r--r-- | storage/innobase/trx/trx0trx.cc | 21 |
4 files changed, 33 insertions, 17 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 26a876c6244..45682804f50 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4356,27 +4356,35 @@ innobase_commit_low( { #ifdef WITH_WSREP const char* tmp = 0; - if (trx->is_wsrep()) { + const bool is_wsrep = trx->is_wsrep(); + THD* thd = trx->mysql_thd; + if (is_wsrep) { #ifdef WSREP_PROC_INFO char info[64]; info[sizeof(info) - 1] = '\0'; snprintf(info, sizeof(info) - 1, "innobase_commit_low():trx_commit_for_mysql(%lld)", - (long long) wsrep_thd_trx_seqno(trx->mysql_thd)); - tmp = thd_proc_info(trx->mysql_thd, info); + (long long) wsrep_thd_trx_seqno(thd)); + tmp = thd_proc_info(thd, info); #else - tmp = thd_proc_info(trx->mysql_thd, "innobase_commit_low()"); + tmp = thd_proc_info(thd, "innobase_commit_low()"); #endif /* WSREP_PROC_INFO */ } #endif /* WITH_WSREP */ if (trx_is_started(trx)) { - trx_commit_for_mysql(trx); + } else { + trx->will_lock = 0; +#ifdef WITH_WSREP + trx->wsrep = false; +#endif /* WITH_WSREP */ } - trx->will_lock = 0; + #ifdef WITH_WSREP - if (trx->is_wsrep()) { thd_proc_info(trx->mysql_thd, tmp); } + if (is_wsrep) { + thd_proc_info(thd, tmp); #endif /* WITH_WSREP */ + } } /*****************************************************************//** @@ -4739,6 +4747,9 @@ innobase_rollback_trx( if (!trx->has_logged()) { trx->will_lock = 0; +#ifdef WITH_WSREP + trx->wsrep = false; +#endif DBUG_RETURN(0); } diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 3856915f8a6..87bf97f00cf 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -443,6 +443,7 @@ Check transaction state */ ut_ad(!(t)->id); \ ut_ad(!(t)->has_logged()); \ ut_ad(!(t)->is_referenced()); \ + ut_ad(!(t)->is_wsrep()); \ ut_ad(!(t)->read_view.is_open()); \ ut_ad((t)->lock.wait_thr == NULL); \ ut_ad(UT_LIST_GET_LEN((t)->lock.trx_locks) == 0); \ diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index 75bffd91aa7..637f8b709f5 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -228,6 +228,9 @@ dberr_t trx_rollback_for_mysql(trx_t* trx) case TRX_STATE_NOT_STARTED: trx->will_lock = 0; ut_ad(trx->mysql_thd); +#ifdef WITH_WSREP + trx->wsrep = false; +#endif return(DB_SUCCESS); case TRX_STATE_ACTIVE: diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 7c25d5b61c2..b1f88b1226f 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -109,9 +109,6 @@ trx_init( trx->state = TRX_STATE_NOT_STARTED; trx->is_recovered = false; -#ifdef WITH_WSREP - trx->wsrep = false; -#endif /* WITH_WSREP */ trx->op_info = ""; @@ -1504,6 +1501,17 @@ inline void trx_t::commit_in_memory(const mtr_t *mtr) DBUG_LOG("trx", "Commit in memory: " << this); state= TRX_STATE_NOT_STARTED; +#ifdef WITH_WSREP + /* Serialization history has been written and the transaction is + committed in memory, which makes this commit ordered. Release commit + order critical section. */ + if (wsrep) + { + wsrep= false; + wsrep_commit_ordered(mysql_thd); + } +#endif /* WITH_WSREP */ + assert_trx_is_free(this); trx_init(this); trx_mutex_exit(this); @@ -1581,13 +1589,6 @@ void trx_t::commit() local_mtr.start(); } commit_low(mtr); -#ifdef WITH_WSREP - /* Serialization history has been written and the transaction is - committed in memory, which makes this commit ordered. Release commit - order critical section. */ - if (mtr && is_wsrep()) - wsrep_commit_ordered(mysql_thd); -#endif /* WITH_WSREP */ } /****************************************************************//** |