mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-31 18:24:25 +03:00
Pass callback to get provider options to provider_v26 constructor
Passing a callback allows constructing the options string using config service after loading the provider but before initializing the provider.
This commit is contained in:
committed by
Daniele Sciascia
parent
2dc8339ff1
commit
cb8f870d58
@ -29,6 +29,7 @@
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@ -527,10 +528,9 @@ namespace wsrep
|
||||
static std::unique_ptr<provider> make_provider(
|
||||
wsrep::server_state&,
|
||||
const std::string& provider_spec,
|
||||
const std::string& provider_options,
|
||||
const std::function<std::string()>& provider_options_cb,
|
||||
const wsrep::provider::services& services
|
||||
= wsrep::provider::services());
|
||||
|
||||
protected:
|
||||
wsrep::server_state& server_state_;
|
||||
};
|
||||
|
@ -287,18 +287,43 @@ namespace wsrep
|
||||
* Load WSRep provider.
|
||||
*
|
||||
* @param provider WSRep provider library to be loaded.
|
||||
* @param provider_options Provider specific options string
|
||||
* to be passed for provider during initialization.
|
||||
* @param provider_options_cb Callback to get provider options.
|
||||
* The function to be called must be
|
||||
* idempotent.
|
||||
* @param services Application defined services passed to
|
||||
* the provider.
|
||||
*
|
||||
* @return Zero on success, non-zero on error.
|
||||
*/
|
||||
int load_provider(const std::string& provider,
|
||||
const std::string& provider_options,
|
||||
const std::function<std::string()>& provider_options_cb,
|
||||
const wsrep::provider::services& services
|
||||
= wsrep::provider::services());
|
||||
|
||||
|
||||
/**
|
||||
* Load WSRep provider.
|
||||
*
|
||||
* @param provider WSRep provider library to be loaded.
|
||||
* @param provider_options Provider specific options string
|
||||
* to be passed for provider during initialization.
|
||||
* @param services Application defined services passed to
|
||||
* the provider.
|
||||
*
|
||||
* @return Zero on success, non-zero on error.
|
||||
*
|
||||
* @note Provided for backward compatibility.
|
||||
*/
|
||||
int load_provider(const std::string& provider,
|
||||
const std::string& provider_options,
|
||||
const wsrep::provider::services& services
|
||||
= wsrep::provider::services())
|
||||
{
|
||||
return load_provider(provider,
|
||||
[provider_options]() { return provider_options; },
|
||||
services);
|
||||
}
|
||||
|
||||
using provider_factory_func =
|
||||
std::function<decltype(wsrep::provider::make_provider)>;
|
||||
|
||||
|
@ -29,19 +29,19 @@
|
||||
std::unique_ptr<wsrep::provider> wsrep::provider::make_provider(
|
||||
wsrep::server_state& server_state,
|
||||
const std::string& provider_spec,
|
||||
const std::string& provider_options,
|
||||
const std::function<std::string()>& provider_options_cb,
|
||||
const wsrep::provider::services& services)
|
||||
{
|
||||
try
|
||||
{
|
||||
return std::unique_ptr<wsrep::provider>(new wsrep::wsrep_provider_v26(
|
||||
server_state, provider_options, provider_spec, services));
|
||||
server_state, provider_spec, provider_options_cb, services));
|
||||
}
|
||||
catch (const wsrep::runtime_error& e)
|
||||
{
|
||||
wsrep::log_error() << "Failed to create a new provider '"
|
||||
<< provider_spec << "'"
|
||||
<< " with options '" << provider_options
|
||||
<< " with options '" << provider_options_cb()
|
||||
<< "': " << e.what();
|
||||
}
|
||||
catch (...)
|
||||
@ -49,7 +49,7 @@ std::unique_ptr<wsrep::provider> wsrep::provider::make_provider(
|
||||
wsrep::log_error() << "Caught unknown exception when trying to "
|
||||
<< "create a new provider '"
|
||||
<< provider_spec << "'"
|
||||
<< " with options '" << provider_options;
|
||||
<< " with options '" << provider_options_cb();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -499,13 +499,14 @@ static int apply_toi(wsrep::provider& provider,
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int wsrep::server_state::load_provider(
|
||||
const std::string& provider_spec, const std::string& provider_options,
|
||||
const std::string& provider_spec,
|
||||
const std::function<std::string()>& provider_options_cb,
|
||||
const wsrep::provider::services& services)
|
||||
{
|
||||
wsrep::log_info() << "Loading provider " << provider_spec
|
||||
<< " initial position: " << initial_position_;
|
||||
provider_
|
||||
= provider_factory_(*this, provider_spec, provider_options, services);
|
||||
= provider_factory_(*this, provider_spec, provider_options_cb, services);
|
||||
return (provider_ ? 0 : 1);
|
||||
}
|
||||
|
||||
|
@ -775,8 +775,8 @@ void wsrep::wsrep_provider_v26::deinit_services()
|
||||
|
||||
wsrep::wsrep_provider_v26::wsrep_provider_v26(
|
||||
wsrep::server_state& server_state,
|
||||
const std::string& provider_options,
|
||||
const std::string& provider_spec,
|
||||
const std::function<std::string()>& provider_options_cb,
|
||||
const wsrep::provider::services& services)
|
||||
: provider(server_state)
|
||||
, wsrep_()
|
||||
@ -796,6 +796,7 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26(
|
||||
init_args.node_address = server_state_.address().c_str();
|
||||
init_args.node_incoming = server_state_.incoming_address().c_str();
|
||||
init_args.data_dir = server_state_.working_dir().c_str();
|
||||
const auto& provider_options = provider_options_cb();
|
||||
init_args.options = provider_options.c_str();
|
||||
init_args.proto_ver = server_state.max_protocol_version();
|
||||
init_args.state_id = &state_id;
|
||||
|
@ -33,7 +33,7 @@ namespace wsrep
|
||||
void init_services(const wsrep::provider::services& services);
|
||||
void deinit_services();
|
||||
wsrep_provider_v26(wsrep::server_state&, const std::string&,
|
||||
const std::string&,
|
||||
const std::function<std::string()>&,
|
||||
const wsrep::provider::services& services);
|
||||
~wsrep_provider_v26() WSREP_OVERRIDE;
|
||||
enum wsrep::provider::status
|
||||
|
@ -262,7 +262,7 @@ namespace wsrep
|
||||
{
|
||||
set_provider_factory([&](wsrep::server_state&,
|
||||
const std::string&,
|
||||
const std::string&,
|
||||
const std::function<std::string()>&,
|
||||
const wsrep::provider::services&)
|
||||
{
|
||||
// The provider object is destroyed upon server state
|
||||
|
Reference in New Issue
Block a user