Skip to content

Commit efea7a0

Browse files
author
Daniele Sciascia
committed
Fixes for wsrep provider options plugin
The plugin didn't work with options given on the command line or config file.
1 parent 3ae8f11 commit efea7a0

File tree

8 files changed

+190
-9
lines changed

8 files changed

+190
-9
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
SHOW VARIABLES LIKE 'wsrep_provider_pc_npvo';
2+
Variable_name Value
3+
wsrep_provider_pc_npvo ON
4+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'pc.npvo = [^;]+') AS provider_option;
5+
provider_option
6+
pc.npvo = true
7+
SHOW VARIABLES LIKE 'wsrep_provider_repl_max_ws_size';
8+
Variable_name Value
9+
wsrep_provider_repl_max_ws_size 1024
10+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'repl.max_ws_size = [^;]+') AS provider_option;
11+
provider_option
12+
repl.max_ws_size = 1024
13+
SHOW VARIABLES LIKE 'wsrep_provider_evs_install_timeout';
14+
Variable_name Value
15+
wsrep_provider_evs_install_timeout 8.100000
16+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'evs.install_timeout = [^;]+') AS provider_option;
17+
provider_option
18+
evs.install_timeout = PT8.1S
19+
SHOW VARIABLES LIKE 'wsrep_provider_gcache_size';
20+
Variable_name Value
21+
wsrep_provider_gcache_size 10485760
22+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'gcache.size = [^;]+') AS provider_option;
23+
provider_option
24+
gcache.size = 10M
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
!include include/default_my.cnf
2+
3+
[mysqld.1]
4+
wsrep-on=ON
5+
wsrep-cluster-address=gcomm://
6+
wsrep-provider[email protected]_PROVIDER
7+
binlog-format=ROW
8+
plugin-wsrep-provider=ON
9+
wsrep-provider-base-port[email protected]
10+
11+
# Test different type of options
12+
wsrep-provider-gcache-size=1024
13+
wsrep-provider-pc-npvo=ON
14+
wsrep-provider-evs-install-timeout=8.1
15+
16+
# Repeat same variable again
17+
wsrep_provider_gcache_size=10M
18+
wsrep_provider_pc_npvo=OFF
19+
wsrep_provider_pc_npvo=ON
20+
21+
# Option wsrep_provider_options can be used even if plugin-wsrep-provider
22+
# is enabled. However, settings in wsrep_provider_options have lower
23+
# precedence. For instance, the setting gcache.size below will
24+
# be ignored because it was already set through provider options
25+
# plugin above.
26+
wsrep_provider_options='gcache.size=20M;repl.max_ws_size=1024'
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--source include/have_wsrep.inc
2+
--source include/have_innodb.inc
3+
4+
SHOW VARIABLES LIKE 'wsrep_provider_pc_npvo';
5+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'pc.npvo = [^;]+') AS provider_option;
6+
7+
SHOW VARIABLES LIKE 'wsrep_provider_repl_max_ws_size';
8+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'repl.max_ws_size = [^;]+') AS provider_option;
9+
10+
SHOW VARIABLES LIKE 'wsrep_provider_evs_install_timeout';
11+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'evs.install_timeout = [^;]+') AS provider_option;
12+
13+
SHOW VARIABLES LIKE 'wsrep_provider_gcache_size';
14+
SELECT REGEXP_SUBSTR(@@wsrep_provider_options, 'gcache.size = [^;]+') AS provider_option;

sql/wsrep_mysqld.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "wsrep_schema.h"
4646
#include "wsrep_xid.h"
4747
#include "wsrep_trans_observer.h"
48+
#include "wsrep_plugin.h" /* wsrep_load_provider_plugin_defaults() */
4849
#include "mysql/service_wsrep.h"
4950
#include <cstdio>
5051
#include <cstdlib>
@@ -897,9 +898,16 @@ int wsrep_init()
897898

898899
Wsrep_server_state::init_provider_services();
899900
if (Wsrep_server_state::instance().load_provider(
900-
wsrep_provider,
901-
wsrep_provider_options,
902-
Wsrep_server_state::instance().provider_services()))
901+
wsrep_provider,
902+
[&](wsrep::provider_options &opts) {
903+
std::string defaults(wsrep_provider_options);
904+
if (wsrep_load_provider_plugin_defaults(opts, defaults))
905+
{
906+
WSREP_ERROR("Failed to load provider plugin defaults");
907+
}
908+
return defaults;
909+
},
910+
Wsrep_server_state::instance().provider_services()))
903911
{
904912
WSREP_ERROR("Failed to load provider");
905913
Wsrep_server_state::deinit_provider_services();

sql/wsrep_plugin.cc

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
in favor of single options which are initialized from provider.
2121
*/
2222

23+
#include "wsrep_plugin.h"
2324
#include "sql_plugin.h"
2425
#include "sql_priv.h"
2526
#include "sql_class.h"
@@ -131,7 +132,8 @@ static void wsrep_provider_sysvar_update(THD *thd,
131132
T new_value= *((T *) save);
132133

133134
auto options= Wsrep_server_state::get_options();
134-
if (options->set(opt->name(), make_option_value(new_value)))
135+
if (options->set(Wsrep_server_state::get_provider(), opt->name(),
136+
make_option_value(new_value)))
135137
{
136138
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), opt->name(),
137139
make_option_value(new_value)->as_string());
@@ -275,6 +277,107 @@ void wsrep_destroy_sysvar(struct st_mysql_sys_var *var)
275277
my_free(var);
276278
}
277279

280+
struct st_mysql_sys_var
281+
{
282+
MYSQL_PLUGIN_VAR_HEADER;
283+
};
284+
285+
struct my_option_arg
286+
{
287+
wsrep::provider_options::option *option;
288+
struct st_mysql_sys_var *sysvar;
289+
std::string *defaults;
290+
};
291+
292+
static void my_option_init(struct my_option &my_opt,
293+
struct my_option_arg &my_arg)
294+
{
295+
std::string option_name("wsrep-provider-");
296+
option_name.append(my_arg.sysvar->name);
297+
for (size_t i= 0; i < option_name.size(); ++i)
298+
if (option_name[i] == '_')
299+
option_name[i]= '-';
300+
my_opt.name= my_strdup(PSI_INSTRUMENT_ME, option_name.c_str(), MYF(0));
301+
my_opt.id= 0;
302+
plugin_opt_set_limits(&my_opt, my_arg.sysvar);
303+
my_opt.value= my_opt.u_max_value= *(uchar ***) (my_arg.sysvar + 1);
304+
my_opt.block_size= 0;
305+
my_opt.app_type= &my_arg;
306+
}
307+
308+
static void my_option_deinit(struct my_option &my_opt)
309+
{
310+
if (my_opt.name)
311+
my_free((void*)my_opt.name);
312+
}
313+
314+
static void make_my_options(std::vector<struct my_option_arg> &my_args,
315+
std::vector<struct my_option> &my_options)
316+
{
317+
for (auto& arg : my_args)
318+
{
319+
struct my_option my_opt;
320+
my_option_init(my_opt, arg);
321+
my_options.push_back(my_opt);
322+
}
323+
struct my_option null_opt;
324+
null_opt.name= NULL;
325+
my_options.push_back(null_opt);
326+
}
327+
328+
static void make_my_option_args(wsrep::provider_options &options,
329+
std::string &defaults,
330+
std::vector<struct my_option_arg> &my_args)
331+
{
332+
options.for_each([&](wsrep::provider_options::option *opt) {
333+
my_args.push_back({opt, wsrep_make_sysvar_for_option(opt), &defaults});
334+
});
335+
}
336+
337+
static my_bool option_changed(const struct my_option *opt, const char *value,
338+
const char *filename)
339+
{
340+
my_option_arg *my_arg= (struct my_option_arg *) opt->app_type;
341+
if (my_arg->defaults->size())
342+
my_arg->defaults->append(";");
343+
my_arg->defaults->append(my_arg->option->real_name());
344+
my_arg->defaults->append("=");
345+
my_arg->defaults->append(value);
346+
return 0;
347+
}
348+
349+
int wsrep_load_provider_plugin_defaults(wsrep::provider_options &options,
350+
std::string &extra_options)
351+
{
352+
int argc= orig_argc;
353+
char **argv= orig_argv;
354+
355+
if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv))
356+
{
357+
return 1;
358+
}
359+
char **defaults_argv= argv;
360+
361+
std::vector<struct my_option> my_options;
362+
std::vector<struct my_option_arg> my_option_args;
363+
make_my_option_args(options, extra_options, my_option_args);
364+
make_my_options(my_option_args, my_options);
365+
366+
my_bool skip_unknown_orig= my_getopt_skip_unknown;
367+
my_getopt_skip_unknown= TRUE;
368+
int error= handle_options(&argc, &argv, &my_options[0], option_changed);
369+
my_getopt_skip_unknown= skip_unknown_orig;
370+
371+
for (struct my_option &opt : my_options)
372+
my_option_deinit(opt);
373+
for (struct my_option_arg &arg : my_option_args)
374+
wsrep_destroy_sysvar(arg.sysvar);
375+
if (argv)
376+
free_defaults(defaults_argv);
377+
378+
return error;
379+
}
380+
278381
static int wsrep_provider_plugin_init(void *p)
279382
{
280383
WSREP_DEBUG("wsrep_provider_plugin_init()");

sql/wsrep_plugin.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
#ifndef WSREP_PLUGIN_H
1717
#define WSREP_PLUGIN_H
1818

19-
class option;
19+
#include "wsrep/provider_options.hpp"
20+
2021
struct st_mysql_sys_var;
2122

2223
/* Returns true if provider plugin was initialized and is active */
@@ -33,4 +34,9 @@ wsrep_make_sysvar_for_option(wsrep::provider_options::option *);
3334
/* Destroy a sysvar created by make_sysvar_for_option */
3435
void wsrep_destroy_sysvar(struct st_mysql_sys_var *);
3536

37+
/* Parse defaults from config/command line, returns corresponding
38+
provider options string */
39+
int wsrep_load_provider_plugin_defaults(wsrep::provider_options &,
40+
std::string &);
41+
3642
#endif /* WSREP_PLUGIN_H */

sql/wsrep_server_state.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ int Wsrep_server_state::init_provider(const std::string& provider,
9999
int Wsrep_server_state::init_options()
100100
{
101101
if (!m_instance) return 1;
102-
m_options= std::unique_ptr<wsrep::provider_options>(
103-
new wsrep::provider_options(m_instance->provider()));
104-
int ret= m_options->initial_options();
102+
m_options=
103+
std::unique_ptr<wsrep::provider_options>(new wsrep::provider_options());
104+
int ret= m_options->initial_options(m_instance->provider());
105105
if (ret)
106106
{
107107
WSREP_ERROR("Failed to initialize provider options");

wsrep-lib

0 commit comments

Comments
 (0)