mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-10-22 10:52:18 +03:00
Implemented convenience methods to desync/pause, resume/resync.
This commit is contained in:
@@ -371,6 +371,21 @@ namespace wsrep
|
|||||||
|
|
||||||
void resume();
|
void resume();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desync and pause the provider on one go. Will return
|
||||||
|
* pause seqno if successful. In case of failure,
|
||||||
|
* undefined seqno will be returned.
|
||||||
|
*/
|
||||||
|
wsrep::seqno desync_and_pause();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resume and resync the provider on one go. Prior this
|
||||||
|
* call the provider must have been both desynced and paused,
|
||||||
|
* by either desync_and_pause() or separate calls to desync()
|
||||||
|
* and pause().
|
||||||
|
*/
|
||||||
|
void resume_and_resync();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares server state for SST.
|
* Prepares server state for SST.
|
||||||
*
|
*
|
||||||
@@ -508,7 +523,6 @@ namespace wsrep
|
|||||||
, desync_count_()
|
, desync_count_()
|
||||||
, pause_count_()
|
, pause_count_()
|
||||||
, pause_seqno_()
|
, pause_seqno_()
|
||||||
, desynced_on_pause_()
|
|
||||||
, streaming_appliers_()
|
, streaming_appliers_()
|
||||||
, provider_()
|
, provider_()
|
||||||
, name_(name)
|
, name_(name)
|
||||||
@@ -548,7 +562,6 @@ namespace wsrep
|
|||||||
size_t desync_count_;
|
size_t desync_count_;
|
||||||
size_t pause_count_;
|
size_t pause_count_;
|
||||||
wsrep::seqno pause_seqno_;
|
wsrep::seqno pause_seqno_;
|
||||||
bool desynced_on_pause_;
|
|
||||||
typedef std::map<std::pair<wsrep::id, wsrep::transaction_id>, wsrep::high_priority_service*> streaming_appliers_map;
|
typedef std::map<std::pair<wsrep::id, wsrep::transaction_id>, wsrep::high_priority_service*> streaming_appliers_map;
|
||||||
streaming_appliers_map streaming_appliers_;
|
streaming_appliers_map streaming_appliers_;
|
||||||
wsrep::provider* provider_;
|
wsrep::provider* provider_;
|
||||||
|
@@ -272,28 +272,19 @@ wsrep::seqno wsrep::server_state::pause()
|
|||||||
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
||||||
// Disallow concurrent calls to pause to in order to have non-concurrent
|
// Disallow concurrent calls to pause to in order to have non-concurrent
|
||||||
// access to desynced_on_pause_ which is checked in resume() call.
|
// access to desynced_on_pause_ which is checked in resume() call.
|
||||||
|
wsrep::log_info() << "pause";
|
||||||
while (pause_count_ > 0)
|
while (pause_count_ > 0)
|
||||||
{
|
{
|
||||||
cond_.wait(lock);
|
cond_.wait(lock);
|
||||||
}
|
}
|
||||||
++pause_count_;
|
++pause_count_;
|
||||||
assert(pause_seqno_.is_undefined());
|
assert(pause_seqno_.is_undefined());
|
||||||
if (state_ == s_synced)
|
|
||||||
{
|
|
||||||
if (desync(lock))
|
|
||||||
{
|
|
||||||
return wsrep::seqno::undefined();
|
|
||||||
}
|
|
||||||
desynced_on_pause_ = true;
|
|
||||||
}
|
|
||||||
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())
|
||||||
{
|
{
|
||||||
--pause_count_;
|
--pause_count_;
|
||||||
resync();
|
|
||||||
desynced_on_pause_ = false;
|
|
||||||
}
|
}
|
||||||
return pause_seqno_;
|
return pause_seqno_;
|
||||||
}
|
}
|
||||||
@@ -301,13 +292,9 @@ wsrep::seqno wsrep::server_state::pause()
|
|||||||
void wsrep::server_state::resume()
|
void wsrep::server_state::resume()
|
||||||
{
|
{
|
||||||
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
||||||
|
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 (desynced_on_pause_)
|
|
||||||
{
|
|
||||||
resync(lock);
|
|
||||||
desynced_on_pause_ = false;
|
|
||||||
}
|
|
||||||
if (provider_->resume())
|
if (provider_->resume())
|
||||||
{
|
{
|
||||||
throw wsrep::runtime_error("Failed to resume provider");
|
throw wsrep::runtime_error("Failed to resume provider");
|
||||||
@@ -317,6 +304,40 @@ void wsrep::server_state::resume()
|
|||||||
cond_.notify_all();
|
cond_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wsrep::seqno wsrep::server_state::desync_and_pause()
|
||||||
|
{
|
||||||
|
wsrep::log_info() << "desync_and_pause";
|
||||||
|
if (desync())
|
||||||
|
{
|
||||||
|
wsrep::log_warning() << "Failed to desync server";
|
||||||
|
return wsrep::seqno::undefined();
|
||||||
|
}
|
||||||
|
wsrep::seqno ret(pause());
|
||||||
|
if (ret.is_undefined())
|
||||||
|
{
|
||||||
|
wsrep::log_warning() << "Failed to pause provider";
|
||||||
|
resync();
|
||||||
|
return wsrep::seqno::undefined();
|
||||||
|
}
|
||||||
|
wsrep::log_info() << "Provider paused at: " << ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsrep::server_state::resume_and_resync()
|
||||||
|
{
|
||||||
|
wsrep::log_info() << "resume_and_resync";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
resume();
|
||||||
|
resync();
|
||||||
|
}
|
||||||
|
catch (const wsrep::runtime_error& e)
|
||||||
|
{
|
||||||
|
wsrep::log_warning()
|
||||||
|
<< "Resume and resync failed, server may have to be restarted";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string wsrep::server_state::prepare_for_sst()
|
std::string wsrep::server_state::prepare_for_sst()
|
||||||
{
|
{
|
||||||
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
||||||
|
Reference in New Issue
Block a user