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

* Added tests for voluntary transaction rollback

* Finished applier 2pc test
This commit is contained in:
Teemu Ollakka
2018-04-18 13:33:21 +03:00
parent bed41a5ffd
commit e8f4b2d183
3 changed files with 83 additions and 17 deletions

View File

@ -53,19 +53,6 @@ namespace trrep
s_quitting
};
//
// Client context constuctor
//
client_context(trrep::mutex& mutex,
trrep::server_context& server_context,
client_id id,
enum mode mode)
: mutex_(mutex)
, server_context_(server_context)
, id_(id)
, mode_(mode)
, state_(s_idle)
{ }
virtual ~client_context() { }
// Accessors
@ -130,8 +117,22 @@ namespace trrep
{
abort();
}
private:
protected:
//
// Client context constuctor
//
client_context(trrep::mutex& mutex,
trrep::server_context& server_context,
client_id id,
enum mode mode)
: mutex_(mutex)
, server_context_(server_context)
, id_(id)
, mode_(mode)
, state_(s_idle)
{ }
private:
void state(enum state state);
trrep::mutex& mutex_;

View File

@ -248,8 +248,8 @@ int trrep::transaction_context::before_commit()
{
// 1pc
state(lock, s_certifying);
state(lock, s_committing);
}
state(lock, s_committing);
}
break;
}
@ -437,7 +437,7 @@ void trrep::transaction_context::state(
assert(lock.owns_lock());
static const char allowed[n_states][n_states] =
{ /* ex pr ce co oc ct cf ma ab ad mr re from/to */
{ 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, /* ex */
{ 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0}, /* ex */
{ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, /* pr */
{ 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0}, /* ce */
{ 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0}, /* co */

View File

@ -139,6 +139,43 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc)
BOOST_REQUIRE(tc.certified() == false);
}
//
// Test a voluntary rollback
//
BOOST_AUTO_TEST_CASE(transaction_context_rollback)
{
trrep::mock_server_context sc("s1", "s1",
trrep::server_context::rm_sync);
trrep::mock_client_context cc(sc,trrep::client_id(1),
trrep::client_context::m_replicating);
trrep::transaction_context tc(cc);
// Verify initial state
BOOST_REQUIRE(tc.active() == false);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_executing);
// Start a new transaction with ID 1
tc.start_transaction(1);
BOOST_REQUIRE(tc.active());
BOOST_REQUIRE(tc.id() == trrep::transaction_id(1));
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_executing);
// Run before commit
BOOST_REQUIRE(tc.before_rollback() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_aborting);
// Run after commit
BOOST_REQUIRE(tc.after_rollback() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_aborted);
// Cleanup after statement
BOOST_REQUIRE(tc.after_statement() == 0);
BOOST_REQUIRE(tc.active() == false);
BOOST_REQUIRE(tc.ordered() == false);
BOOST_REQUIRE(tc.certified() == false);
}
//
// Test a 1PC transaction which gets BF aborted before before_commit
//
@ -397,5 +434,33 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc_applying)
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_preparing);
BOOST_REQUIRE(tc.after_prepare() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_committing);
BOOST_REQUIRE(tc.before_commit() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_committing);
BOOST_REQUIRE(tc.ordered_commit() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_ordered_commit);
BOOST_REQUIRE(tc.after_commit() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_committed);
}
BOOST_AUTO_TEST_CASE(transaction_context_applying_rollback)
{
trrep::mock_server_context sc("s1", "s1",
trrep::server_context::rm_sync);
trrep::mock_client_context cc(sc,
trrep::client_id(1),
trrep::client_context::m_applier);
trrep::transaction_context tc(applying_transaction(
cc, 1, 1,
WSREP_FLAG_TRX_START | WSREP_FLAG_TRX_END));
BOOST_REQUIRE(tc.active() == false);
BOOST_REQUIRE(tc.start_transaction() == 0);
BOOST_REQUIRE(tc.active() == true);
BOOST_REQUIRE(tc.certified() == true);
BOOST_REQUIRE(tc.ordered() == true);
BOOST_REQUIRE(tc.before_rollback() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_aborting);
BOOST_REQUIRE(tc.after_rollback() == 0);
BOOST_REQUIRE(tc.state() == trrep::transaction_context::s_aborted);
}