Skip to content

Commit

Permalink
MDEV-22452: Missing call to wsrep_commit_ordered in trx_t::commit()
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dr-m committed May 4, 2020
1 parent f5cff89 commit 5e7e715
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 17 deletions.
25 changes: 18 additions & 7 deletions storage/innobase/handler/ha_innodb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
}
}

/*****************************************************************//**
Expand Down Expand Up @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions storage/innobase/include/trx0trx.h
Original file line number Diff line number Diff line change
Expand Up @@ -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); \
Expand Down
3 changes: 3 additions & 0 deletions storage/innobase/trx/trx0roll.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
21 changes: 11 additions & 10 deletions storage/innobase/trx/trx0trx.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "";

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
}

/****************************************************************//**
Expand Down

0 comments on commit 5e7e715

Please sign in to comment.