1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-28 20:02:00 +03:00

Fixed deadlock in replaying, keep trx state in cleanup

This commit is contained in:
Teemu Ollakka
2018-04-24 12:12:20 +03:00
parent ea512d9c36
commit 77bef0fe9d
3 changed files with 11 additions and 5 deletions

View File

@ -12,9 +12,10 @@ trrep::provider& trrep::client_context::provider() const
// TODO: This should be pure virtual method, implemented by // TODO: This should be pure virtual method, implemented by
// DBMS integration or mock classes only. // DBMS integration or mock classes only.
int trrep::client_context::replay(trrep::transaction_context& tc) int trrep::client_context::replay(
trrep::unique_lock<trrep::mutex>& lock,
trrep::transaction_context& tc)
{ {
trrep::unique_lock<trrep::mutex> lock(mutex_);
tc.state(lock, trrep::transaction_context::s_replaying); tc.state(lock, trrep::transaction_context::s_replaying);
tc.state(lock, trrep::transaction_context::s_committed); tc.state(lock, trrep::transaction_context::s_committed);
return 0; return 0;

View File

@ -84,7 +84,8 @@ namespace trrep
virtual int rollback(trrep::transaction_context&) = 0; virtual int rollback(trrep::transaction_context&) = 0;
virtual void will_replay(trrep::transaction_context&) { } virtual void will_replay(trrep::transaction_context&) { }
virtual int replay(trrep::transaction_context& tc); virtual int replay(trrep::unique_lock<trrep::mutex>&,
trrep::transaction_context& tc);
virtual int apply(trrep::transaction_context&, virtual int apply(trrep::transaction_context&,

View File

@ -70,6 +70,7 @@ int trrep::transaction_context::start_transaction(
{ {
assert(active() == false); assert(active() == false);
id_ = id; id_ = id;
state_ = s_executing;
ws_handle_.trx_id = id_.get(); ws_handle_.trx_id = id_.get();
flags_ |= WSREP_FLAG_TRX_START; flags_ |= WSREP_FLAG_TRX_START;
switch (client_context_.mode()) switch (client_context_.mode())
@ -419,7 +420,7 @@ int trrep::transaction_context::after_statement()
case s_aborted: case s_aborted:
break; break;
case s_must_replay: case s_must_replay:
ret = client_context_.replay(*this); ret = client_context_.replay(lock, *this);
break; break;
default: default:
assert(0); assert(0);
@ -703,7 +704,10 @@ void trrep::transaction_context::cleanup()
// << client_context_.id().get() // << client_context_.id().get()
// << ": " << id_.get() << "\n"; // << ": " << id_.get() << "\n";
id_ = trrep::transaction_id::invalid(); id_ = trrep::transaction_id::invalid();
state_ = s_executing; if (is_streaming())
{
state_ = s_executing;
}
state_hist_.clear(); state_hist_.clear();
trx_meta_.gtid = WSREP_GTID_UNDEFINED; trx_meta_.gtid = WSREP_GTID_UNDEFINED;
trx_meta_.stid.node = WSREP_UUID_UNDEFINED; trx_meta_.stid.node = WSREP_UUID_UNDEFINED;