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

Provided methods to clone subset of transaction state for replay.

This commit is contained in:
Teemu Ollakka
2019-04-03 18:36:07 +03:00
parent ae746fb289
commit e9dafb7373
3 changed files with 48 additions and 0 deletions

View File

@ -489,6 +489,31 @@ namespace wsrep
transaction_.adopt(transaction); transaction_.adopt(transaction);
} }
/**
* Clone enough state from another transaction so that replaing will
* be possible with a transaction contained in this client state.
* Method after_replay() must be used to inject the state after
* replaying back to this client state.
*
* @param transaction Transaction which is to be replied in this
* client state
*/
void clone_transaction_for_replay(const wsrep::transaction& transaction)
{
// assert(mode_ == m_high_priority);
transaction_.clone_for_replay(transaction);
}
/**
* Copy state from another transaction context after replay.
*
* @param transaction Transaction which was used for replaying.
*/
void after_replay(const wsrep::transaction& transaction)
{
transaction_.after_replay(transaction);
}
/** @name Non-transactional operations */ /** @name Non-transactional operations */
/** @{*/ /** @{*/

View File

@ -168,6 +168,11 @@ namespace wsrep
wsrep::seqno bf_seqno); wsrep::seqno bf_seqno);
bool total_order_bf_abort(wsrep::unique_lock<wsrep::mutex>&, bool total_order_bf_abort(wsrep::unique_lock<wsrep::mutex>&,
wsrep::seqno bf_seqno); wsrep::seqno bf_seqno);
void clone_for_replay(const wsrep::transaction& other);
void after_replay(const wsrep::transaction& other);
bool bf_aborted() const bool bf_aborted() const
{ {
return (bf_abort_client_state_ != 0); return (bf_abort_client_state_ != 0);

View File

@ -935,6 +935,24 @@ bool wsrep::transaction::total_order_bf_abort(
return ret; return ret;
} }
void wsrep::transaction::clone_for_replay(const wsrep::transaction& other)
{
assert(other.state() == s_replaying);
id_ = other.id_;
ws_handle_ = other.ws_handle_;
ws_meta_ = other.ws_meta_;
streaming_context_ = other.streaming_context_;
state_ = s_replaying;
}
void wsrep::transaction::after_replay(const wsrep::transaction& other)
{
// Other must have been terminated
assert(other.state() == s_committed || other.state() == s_aborted);
state_ = other.state();
clear_fragments();
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Private // // Private //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////