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

View File

@ -481,3 +481,35 @@ BOOST_FIXTURE_TEST_CASE(
ss.on_sync(); ss.on_sync();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); 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);
}