mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
Add support for custom provider implementation
- Add a set_provider_factory() method to server_state to allow injecting provider factory which will be called when the provider is loaded. Other related changes: - Implement to_string() helper method for id class. - Fix id ostream operator human readable id printing. - Pass victim client_service as an argument to provider::bf_abort() to allow passing victim context to custom provider. - Implement prev() helper method for seqno class. - Make server_state recover_streaming_appliers_if_not_recovered() public. In some recovery scenarios the method must be called outside of server_state internal code paths. - Add storage_service requires_globals() method. The storage service implementation may override this to return false if changing to storage service context does not require store/reset globals. - Change view final() to also require that the view status is not primary for the view to be final. Also change the method name to is_final() to avoid confusion with C++ final identifier. - Fixes to server state handling in disconnecting and disconnected states. - Keep TOI meta data over whole TOI critical section. Co-authored-by: Denis Protivensky <denis.protivensky@galeracluster.com>
This commit is contained in:
@ -258,12 +258,31 @@ namespace wsrep
|
||||
rollback_mode)
|
||||
, mutex_()
|
||||
, cond_()
|
||||
, provider_(*this)
|
||||
{ }
|
||||
, provider_()
|
||||
{
|
||||
set_provider_factory([&](wsrep::server_state&,
|
||||
const std::string&,
|
||||
const std::string&,
|
||||
const wsrep::provider::services&)
|
||||
{
|
||||
// The provider object is destroyed upon server state
|
||||
// destruction, so using a raw pointer is safe.
|
||||
provider_ = new wsrep::mock_provider(*this);
|
||||
return std::unique_ptr<wsrep::provider>(provider_);
|
||||
});
|
||||
|
||||
wsrep::mock_provider& provider() const WSREP_OVERRIDE
|
||||
{ return provider_; }
|
||||
const int ret WSREP_UNUSED = load_provider("mock", "");
|
||||
assert(ret == 0);
|
||||
assert(provider_ != nullptr);
|
||||
}
|
||||
|
||||
mock_server_state(const mock_server_state&) = delete;
|
||||
mock_server_state& operator=(const mock_server_state&) = delete;
|
||||
|
||||
wsrep::mock_provider& provider() const
|
||||
{
|
||||
return *provider_;
|
||||
}
|
||||
// mock connected state for tests without overriding the connect()
|
||||
// method.
|
||||
int mock_connect(const std::string& own_id,
|
||||
@ -308,7 +327,7 @@ namespace wsrep
|
||||
private:
|
||||
wsrep::default_mutex mutex_;
|
||||
wsrep::default_condition_variable cond_;
|
||||
mutable wsrep::mock_provider provider_;
|
||||
wsrep::mock_provider* provider_;
|
||||
};
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user