1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-10-18 00:31:19 +03:00

Allow read-only access to transaction context through

client context to enforce use of client context interface
for manipulating transaction context state.
This commit is contained in:
Teemu Ollakka
2018-05-31 16:55:57 +03:00
parent 2f46758064
commit ae93785a57
14 changed files with 267 additions and 300 deletions

View File

@@ -70,41 +70,41 @@ public:
public:
transaction(dbms_storage_engine& se)
: se_(se)
, txc_()
, cc_()
{
}
bool active() const { return txc_ != nullptr; }
bool active() const { return cc_ != nullptr; }
void start(trrep::transaction_context* txc)
void start(trrep::client_context* cc)
{
trrep::unique_lock<trrep::mutex> lock(se_.mutex_);
if (se_.transactions_.insert(txc).second == false)
if (se_.transactions_.insert(cc).second == false)
{
::abort();
}
txc_ = txc;
cc_ = cc;
}
void commit()
{
if (txc_)
if (cc_)
{
trrep::unique_lock<trrep::mutex> lock(se_.mutex_);
se_.transactions_.erase(txc_);
se_.transactions_.erase(cc_);
}
txc_ = nullptr;
cc_ = nullptr;
}
void abort()
{
if (txc_)
if (cc_)
{
trrep::unique_lock<trrep::mutex> lock(se_.mutex_);
se_.transactions_.erase(txc_);
se_.transactions_.erase(cc_);
}
txc_ = nullptr;
cc_ = nullptr;
}
~transaction()
@@ -117,7 +117,7 @@ public:
private:
dbms_storage_engine& se_;
trrep::transaction_context* txc_;
trrep::client_context* cc_;
};
void bf_abort_some(const trrep::transaction_context& txc)
@@ -131,7 +131,7 @@ public:
trrep::unique_lock<trrep::mutex> victim_txc_lock(
victim_txc->mutex());
lock.unlock();
if (victim_txc->bf_abort(victim_txc_lock, txc))
if (victim_txc->bf_abort(victim_txc_lock, txc.seqno()))
{
trrep::log() << "BF aborted " << victim_txc->id().get();
++bf_aborts_;
@@ -146,7 +146,7 @@ public:
}
private:
trrep::default_mutex mutex_;
std::unordered_set<trrep::transaction_context*> transactions_;
std::unordered_set<trrep::client_context*> transactions_;
size_t alg_freq_;
std::atomic<long long> bf_aborts_;
};
@@ -337,28 +337,28 @@ public:
}
private:
bool do_2pc() const override { return false; }
int apply(trrep::transaction_context& txc, const trrep::data& data) override
int apply(const trrep::data& data) override
{
return server_.apply_to_storage_engine(txc, data);
return server_.apply_to_storage_engine(transaction(), data);
}
int commit(trrep::transaction_context& transaction_context) override
int commit() override
{
assert(mode() == trrep::client_context::m_applier);
int ret(0);
ret = transaction_context.before_commit();
ret = before_commit();
se_trx_.commit();
ret = ret || transaction_context.ordered_commit();
ret = ret || transaction_context.after_commit();
ret = ret || ordered_commit();
ret = ret || after_commit();
return ret;
}
int rollback(trrep::transaction_context& transaction_context) override
int rollback() override
{
trrep::log() << "rollback: " << transaction_context.id().get()
trrep::log() << "rollback: " << transaction().id().get()
<< "state: "
<< trrep::to_string(transaction_context.state());
transaction_context.before_rollback();
<< trrep::to_string(transaction().state());
before_rollback();
se_trx_.abort();
transaction_context.after_rollback();
after_rollback();
return 0;
}
@@ -404,7 +404,7 @@ private:
{
err = start_transaction(server_.next_transaction_id());
assert(err == 0);
se_trx_.start(&transaction());
se_trx_.start(this);
return err;
});
err = err || current_error();