1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-05 03:41:13 +03:00

Added test cases for donor transitions.

Replaced all references to provider_ in server_state methods to
provider() call which is virtual and can be overridden by test classes.
Provider pointer may not be initialized during unit tests yet.
This commit is contained in:
Teemu Ollakka
2018-12-19 15:19:05 +02:00
parent e5e5d409ed
commit 728eaa80b5
2 changed files with 40 additions and 8 deletions

View File

@ -377,7 +377,7 @@ wsrep::server_state::~server_state()
std::vector<wsrep::provider::status_variable>
wsrep::server_state::status() const
{
return provider_->status();
return provider().status();
}
@ -394,7 +394,7 @@ wsrep::seqno wsrep::server_state::pause()
++pause_count_;
assert(pause_seqno_.is_undefined());
lock.unlock();
pause_seqno_ = provider_->pause();
pause_seqno_ = provider().pause();
lock.lock();
if (pause_seqno_.is_undefined())
{
@ -409,7 +409,7 @@ void wsrep::server_state::resume()
wsrep::log_info() << "resume";
assert(pause_seqno_.is_undefined() == false);
assert(pause_count_ == 1);
if (provider_->resume())
if (provider().resume())
{
throw wsrep::runtime_error("Failed to resume provider");
}
@ -512,7 +512,7 @@ void wsrep::server_state::sst_sent(const wsrep::gtid& gtid, int error)
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
state(lock, s_joined);
lock.unlock();
if (provider_->sst_sent(gtid, error))
if (provider().sst_sent(gtid, error))
{
server_service_.log_message(wsrep::log::warning,
"Provider sst_sent() returned an error");
@ -624,13 +624,13 @@ enum wsrep::provider::status
wsrep::server_state::wait_for_gtid(const wsrep::gtid& gtid, int timeout)
const
{
return provider_->wait_for_gtid(gtid, timeout);
return provider().wait_for_gtid(gtid, timeout);
}
std::pair<wsrep::gtid, enum wsrep::provider::status>
wsrep::server_state::causal_read(int timeout) const
{
return provider_->causal_read(timeout);
return provider().causal_read(timeout);
}
void wsrep::server_state::on_connect(const wsrep::view& view)
@ -1045,7 +1045,7 @@ int wsrep::server_state::desync(wsrep::unique_lock<wsrep::mutex>& lock)
assert(lock.owns_lock());
++desync_count_;
lock.unlock();
int ret(provider_->desync());
int ret(provider().desync());
lock.lock();
if (ret)
{
@ -1062,7 +1062,7 @@ void wsrep::server_state::resync(wsrep::unique_lock<wsrep::mutex>&
if (desync_count_ > 0)
{
--desync_count_;
if (provider_->resync())
if (provider().resync())
{
throw wsrep::runtime_error("Failed to resync");
}

View File

@ -481,3 +481,35 @@ BOOST_FIXTURE_TEST_CASE(
ss.on_sync();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced);
}
/////////////////////////////////////////////////////////////////////////////
// Donor state transitions //
/////////////////////////////////////////////////////////////////////////////
BOOST_FIXTURE_TEST_CASE(
server_state_sst_first_donate_success,
sst_first_server_fixture)
{
bootstrap();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced);
ss.start_sst("", wsrep::gtid(cluster_id, wsrep::seqno(2)), false);
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_donor);
ss.sst_sent(wsrep::gtid(cluster_id, wsrep::seqno(2)), 0);
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_joined);
ss.on_sync();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced);
}
BOOST_FIXTURE_TEST_CASE(
server_state_sst_first_donate_error,
sst_first_server_fixture)
{
bootstrap();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced);
ss.start_sst("", wsrep::gtid(cluster_id, wsrep::seqno(2)), false);
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_donor);
ss.sst_sent(wsrep::gtid(cluster_id, wsrep::seqno(2)), 1);
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_joined);
ss.on_sync();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced);
}