summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-05-04 18:19:13 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-05-04 18:31:30 +0300
commit5e7e7153b439ea1b12588f5830d66b3a0cf13414 (patch)
treebd3751b69f9470f1b9b9f26cc301c340ca70d293 /storage
parentf5cff8980a7f55069b01dcc9e124880c75930c91 (diff)
downloadmariadb-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.cc25
-rw-r--r--storage/innobase/include/trx0trx.h1
-rw-r--r--storage/innobase/trx/trx0roll.cc3
-rw-r--r--storage/innobase/trx/trx0trx.cc21
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 */
}
/****************************************************************//**