Skip to content

Commit 9349f85

Browse files
committed
Make it possible to retrieve before provider is initialized
Create an instance of provider_options in server_state, and provider_options so that it does not depend on provider. Call into config_service when provider is created, i.e. after library is loaded, before it is initialized, so that we can inject additional options at startup.
1 parent 59fecbe commit 9349f85

10 files changed

+44
-32
lines changed

Diff for: include/wsrep/provider.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ namespace wsrep
5151
class event_service;
5252
class client_service;
5353
class connection_monitor_service;
54+
class provider_options;
5455
class stid
5556
{
5657
public:
@@ -521,6 +522,7 @@ namespace wsrep
521522
wsrep::server_state&,
522523
const std::string& provider_spec,
523524
const std::function<std::string()>& provider_options_cb,
525+
provider_options& options,
524526
const wsrep::provider::services& services
525527
= wsrep::provider::services());
526528
protected:

Diff for: include/wsrep/provider_options.hpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ namespace wsrep
214214
int flags_;
215215
};
216216

217-
provider_options(wsrep::provider&);
217+
provider_options();
218218
provider_options(const provider_options&) = delete;
219219
provider_options& operator=(const provider_options&) = delete;
220220

@@ -224,6 +224,7 @@ namespace wsrep
224224
* Individual options should be accessed through set()/get().
225225
*
226226
* @return Provider status code.
227+
* @deprecated Provider options are now loaded in provider ctor
227228
*/
228229
enum wsrep::provider::status initial_options();
229230

@@ -241,8 +242,9 @@ namespace wsrep
241242
* @return wsrep::provider::error_size_exceeded if memory could
242243
* not be allocated for the new value.
243244
*/
244-
enum wsrep::provider::status set(const std::string& name,
245-
std::unique_ptr<option_value> value);
245+
enum wsrep::provider::status set(wsrep::provider& provider,
246+
const std::string& name,
247+
std::unique_ptr<option_value> value);
246248

247249
/**
248250
* Create a new option with default value.
@@ -255,7 +257,6 @@ namespace wsrep
255257
void for_each(const std::function<void(option*)>& fn);
256258

257259
private:
258-
provider& provider_;
259260
using options_map = std::map<std::string, std::unique_ptr<option>>;
260261
options_map options_;
261262
};

Diff for: include/wsrep/server_state.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
#include "provider.hpp"
9292
#include "compiler.hpp"
9393
#include "xid.hpp"
94+
#include "provider_options.hpp"
9495

9596
#include <memory>
9697
#include <deque>
@@ -356,6 +357,11 @@ namespace wsrep
356357
return *provider_;
357358
}
358359

360+
wsrep::provider_options* provider_options()
361+
{
362+
return &provider_options_;
363+
}
364+
359365
/**
360366
* Initialize connection to cluster.
361367
*
@@ -664,6 +670,7 @@ namespace wsrep
664670
, streaming_appliers_recovered_()
665671
, provider_()
666672
, provider_factory_(wsrep::provider::make_provider)
673+
, provider_options_()
667674
, name_(name)
668675
, id_(wsrep::id::undefined())
669676
, incoming_address_(incoming_address)
@@ -746,6 +753,7 @@ namespace wsrep
746753
bool streaming_appliers_recovered_;
747754
std::unique_ptr<wsrep::provider> provider_;
748755
provider_factory_func provider_factory_;
756+
wsrep::provider_options provider_options_;
749757
std::string name_;
750758
wsrep::id id_;
751759
std::string incoming_address_;

Diff for: src/config_service_v1.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
#include "config_service_v1.hpp"
21+
#include "wsrep_api.h"
2122
#include "service_helpers.hpp"
2223
#include "v26/wsrep_config_service.h"
2324
#include "wsrep/logger.hpp"
@@ -147,10 +148,9 @@ static void config_service_v1_deinit(void* dlh)
147148
dlh, WSREP_CONFIG_SERVICE_DEINIT_FUNC_V1, "config service v1");
148149
}
149150

150-
int wsrep::config_service_v1_fetch(wsrep::provider& provider,
151+
int wsrep::config_service_v1_fetch(struct wsrep_st* wsrep,
151152
wsrep::provider_options* options)
152153
{
153-
struct wsrep_st* wsrep = (struct wsrep_st*)provider.native();
154154
if (wsrep == nullptr)
155155
{
156156
// Not a provider which was loaded via wsrep-API

Diff for: src/config_service_v1.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
#ifndef WSREP_CONFIG_SERVICE_V1_HPP
2121
#define WSREP_CONFIG_SERVICE_V1_HPP
2222

23+
struct wsrep_st;
24+
2325
namespace wsrep
2426
{
2527
class provider;
2628
class provider_options;
27-
int config_service_v1_fetch(provider& provider, provider_options* opts);
29+
int config_service_v1_fetch(struct wsrep_st* wsrep, provider_options* opts);
2830
} // namespace wsrep
2931

3032
#endif // WSREP_CONFIG_SERVICE_V1_HPP

Diff for: src/provider.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ std::unique_ptr<wsrep::provider> wsrep::provider::make_provider(
3030
wsrep::server_state& server_state,
3131
const std::string& provider_spec,
3232
const std::function<std::string()>& provider_options_cb,
33+
provider_options& provider_options,
3334
const wsrep::provider::services& services)
3435
{
3536
try
3637
{
3738
return std::unique_ptr<wsrep::provider>(new wsrep::wsrep_provider_v26(
38-
server_state, provider_spec, provider_options_cb, services));
39+
server_state, provider_spec, provider_options_cb, provider_options,
40+
services));
3941
}
4042
catch (const wsrep::runtime_error& e)
4143
{

Diff for: src/provider_options.cpp

+5-14
Original file line numberDiff line numberDiff line change
@@ -92,23 +92,14 @@ void wsrep::provider_options::option::update_value(
9292

9393
wsrep::provider_options::option::~option() {}
9494

95-
wsrep::provider_options::provider_options(wsrep::provider& provider)
96-
: provider_(provider)
97-
, options_()
95+
wsrep::provider_options::provider_options()
96+
: options_()
9897
{
9998
}
10099

101100
enum wsrep::provider::status wsrep::provider_options::initial_options()
102101
{
103-
options_.clear();
104-
if (config_service_v1_fetch(provider_, this))
105-
{
106-
return wsrep::provider::error_not_implemented;
107-
}
108-
else
109-
{
110-
return wsrep::provider::success;
111-
}
102+
return wsrep::provider::error_not_implemented;
112103
}
113104

114105
const wsrep::provider_options::option*
@@ -123,7 +114,7 @@ wsrep::provider_options::get_option(const std::string& name) const
123114
}
124115

125116
enum wsrep::provider::status wsrep::provider_options::set(
126-
const std::string& name,
117+
wsrep::provider& provider, const std::string& name,
127118
std::unique_ptr<wsrep::provider_options::option_value> value)
128119
{
129120
auto option(options_.find(name));
@@ -132,7 +123,7 @@ enum wsrep::provider::status wsrep::provider_options::set(
132123
return not_found_error;
133124
}
134125
provider_options_sep sep;
135-
auto ret(provider_.options(std::string(option->second->real_name())
126+
auto ret(provider.options(std::string(option->second->real_name())
136127
+ sep.key_value + value->as_string()
137128
+ sep.param));
138129
if (ret == provider::success)

Diff for: src/server_state.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,8 @@ int wsrep::server_state::load_provider(
505505
{
506506
wsrep::log_info() << "Loading provider " << provider_spec
507507
<< " initial position: " << initial_position_;
508-
provider_
509-
= provider_factory_(*this, provider_spec, provider_options_cb, services);
508+
provider_ = provider_factory_(*this, provider_spec, provider_options_cb,
509+
provider_options_, services);
510510
return (provider_ ? 0 : 1);
511511
}
512512

Diff for: src/wsrep_provider_v26.cpp

+11-7
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "tls_service_v1.hpp"
3636
#include "allowlist_service_v1.hpp"
3737
#include "event_service_v1.hpp"
38+
#include "config_service_v1.hpp"
3839
#include "v26/wsrep_api.h"
3940
#include "v26/wsrep_node_isolation.h"
4041
#include "connection_monitor_service_v1.hpp"
@@ -773,6 +774,7 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26(
773774
wsrep::server_state& server_state,
774775
const std::string& provider_spec,
775776
const std::function<std::string()>& provider_options_cb,
777+
provider_options& options,
776778
const wsrep::provider::services& services)
777779
: provider(server_state)
778780
, wsrep_()
@@ -785,6 +787,15 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26(
785787
server_state.initial_position().id().data(),
786788
sizeof(state_id.uuid.data));
787789
state_id.seqno = server_state.initial_position().seqno().get();
790+
791+
if (wsrep_load(provider_spec.c_str(), &wsrep_, logger_cb))
792+
{
793+
throw wsrep::runtime_error("Failed to load wsrep library");
794+
}
795+
796+
init_services(services);
797+
config_service_v1_fetch(wsrep_, &options);
798+
788799
struct wsrep_init_args init_args;
789800
memset(&init_args, 0, sizeof(init_args));
790801
init_args.app_ctx = &server_state;
@@ -807,13 +818,6 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26(
807818
init_args.sst_donate_cb = &sst_donate_cb;
808819
init_args.synced_cb = &synced_cb;
809820

810-
if (wsrep_load(provider_spec.c_str(), &wsrep_, logger_cb))
811-
{
812-
throw wsrep::runtime_error("Failed to load wsrep library");
813-
}
814-
815-
init_services(services);
816-
817821
if (wsrep_->init(wsrep_, &init_args) != WSREP_OK)
818822
{
819823
throw wsrep::runtime_error("Failed to initialize wsrep provider");

Diff for: src/wsrep_provider_v26.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ struct wsrep_st;
2626

2727
namespace wsrep
2828
{
29-
class thread_service;
29+
class provider_options;
30+
3031
class wsrep_provider_v26 : public wsrep::provider
3132
{
3233
public:
3334
void init_services(const wsrep::provider::services& services);
3435
void deinit_services();
3536
wsrep_provider_v26(wsrep::server_state&, const std::string&,
3637
const std::function<std::string()>&,
38+
provider_options& provider_options,
3739
const wsrep::provider::services& services);
3840
~wsrep_provider_v26() WSREP_OVERRIDE;
3941
enum wsrep::provider::status

0 commit comments

Comments
 (0)