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:
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user