mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 09:14:17 +01:00
10.4-MDEV-31470 wsrep_sst_method variable validity checking
This commit checks the validity of value change of wsrep_sst_method variable. The validity check is same as happens in donor node when incoming SST request is parsed. The commit has also a mtr test: wsrep.wsrep_variables_sst_method which verifies that wsrep_sst_method can be succesfully changed to acceptable values and that the SET command results in error if invalid value was entered. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
This commit is contained in:
parent
aae78d7609
commit
c7feacb0de
4 changed files with 160 additions and 31 deletions
61
mysql-test/suite/wsrep/r/wsrep_variables_sst_method.result
Normal file
61
mysql-test/suite/wsrep/r/wsrep_variables_sst_method.result
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
SELECT @@wsrep_on;
|
||||||
|
@@wsrep_on
|
||||||
|
1
|
||||||
|
SET @wsrep_sst_method_saved = @@global.wsrep_sst_method;
|
||||||
|
/* test currently supported methods */
|
||||||
|
SET GLOBAL wsrep_sst_method=DEFAULT;
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
rsync
|
||||||
|
SET GLOBAL wsrep_sst_method='rsync';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
rsync
|
||||||
|
SET GLOBAL wsrep_sst_method='mysqldump';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
mysqldump
|
||||||
|
SET GLOBAL wsrep_sst_method='mariabackup';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
mariabackup
|
||||||
|
SET GLOBAL wsrep_sst_method='backup';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup
|
||||||
|
SET GLOBAL wsrep_sst_method='backup1.sh';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup1.sh
|
||||||
|
SET GLOBAL wsrep_sst_method='my method';
|
||||||
|
ERROR 42000: Variable 'wsrep_sst_method' can't be set to the value of 'my method'
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup1.sh
|
||||||
|
SHOW WARNINGS;
|
||||||
|
Level Code Message
|
||||||
|
Error 1231 Variable 'wsrep_sst_method' can't be set to the value of 'my method'
|
||||||
|
SET GLOBAL wsrep_sst_method='/method';
|
||||||
|
ERROR 42000: Variable 'wsrep_sst_method' can't be set to the value of '/method'
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup1.sh
|
||||||
|
SHOW WARNINGS;
|
||||||
|
Level Code Message
|
||||||
|
Error 1231 Variable 'wsrep_sst_method' can't be set to the value of '/method'
|
||||||
|
SET GLOBAL wsrep_sst_method='method!';
|
||||||
|
ERROR 42000: Variable 'wsrep_sst_method' can't be set to the value of 'method!'
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup1.sh
|
||||||
|
SHOW WARNINGS;
|
||||||
|
Level Code Message
|
||||||
|
Error 1231 Variable 'wsrep_sst_method' can't be set to the value of 'method!'
|
||||||
|
SET GLOBAL wsrep_sst_method='method;';
|
||||||
|
ERROR 42000: Variable 'wsrep_sst_method' can't be set to the value of 'method;'
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
@@global.wsrep_sst_method
|
||||||
|
backup1.sh
|
||||||
|
SHOW WARNINGS;
|
||||||
|
Level Code Message
|
||||||
|
Error 1231 Variable 'wsrep_sst_method' can't be set to the value of 'method;'
|
7
mysql-test/suite/wsrep/t/wsrep_variables_sst_method.cnf
Normal file
7
mysql-test/suite/wsrep/t/wsrep_variables_sst_method.cnf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
!include ../my.cnf
|
||||||
|
|
||||||
|
[mysqld.1]
|
||||||
|
wsrep-on=ON
|
||||||
|
wsrep-cluster-address=gcomm://
|
||||||
|
wsrep-provider=@ENV.WSREP_PROVIDER
|
||||||
|
binlog-format=ROW
|
50
mysql-test/suite/wsrep/t/wsrep_variables_sst_method.test
Normal file
50
mysql-test/suite/wsrep/t/wsrep_variables_sst_method.test
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
--source include/have_wsrep.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
SELECT @@wsrep_on;
|
||||||
|
|
||||||
|
SET @wsrep_sst_method_saved = @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
/* test currently supported methods */
|
||||||
|
SET GLOBAL wsrep_sst_method=DEFAULT;
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
SET GLOBAL wsrep_sst_method='rsync';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
SET GLOBAL wsrep_sst_method='mysqldump';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
SET GLOBAL wsrep_sst_method='mariabackup';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
SET GLOBAL wsrep_sst_method='backup';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
SET GLOBAL wsrep_sst_method='backup1.sh';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
|
||||||
|
--error ER_WRONG_VALUE_FOR_VAR
|
||||||
|
SET GLOBAL wsrep_sst_method='my method';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
|
||||||
|
--error ER_WRONG_VALUE_FOR_VAR
|
||||||
|
SET GLOBAL wsrep_sst_method='/method';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
|
||||||
|
--error ER_WRONG_VALUE_FOR_VAR
|
||||||
|
SET GLOBAL wsrep_sst_method='method!';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
|
||||||
|
--error ER_WRONG_VALUE_FOR_VAR
|
||||||
|
SET GLOBAL wsrep_sst_method='method;';
|
||||||
|
SELECT @@global.wsrep_sst_method;
|
||||||
|
SHOW WARNINGS;
|
||||||
|
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
SET @@global.wsrep_sst_method = @wsrep_sst_method_saved;
|
||||||
|
--enable_query_log
|
|
@ -172,6 +172,36 @@ static void* wsrep_sst_joiner_monitor_thread(void *arg __attribute__((unused)))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return true if character can be a part of a filename */
|
||||||
|
static bool filename_char(int const c)
|
||||||
|
{
|
||||||
|
return isalnum(c) || (c == '-') || (c == '_') || (c == '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return true if character can be a part of an address string */
|
||||||
|
static bool address_char(int const c)
|
||||||
|
{
|
||||||
|
return filename_char(c) ||
|
||||||
|
(c == ':') || (c == '[') || (c == ']') || (c == '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool check_request_str(const char* const str,
|
||||||
|
bool (*check) (int c),
|
||||||
|
bool log_warn = true)
|
||||||
|
{
|
||||||
|
for (size_t i(0); str[i] != '\0'; ++i)
|
||||||
|
{
|
||||||
|
if (!check(str[i]))
|
||||||
|
{
|
||||||
|
if (log_warn) WSREP_WARN("Illegal character in state transfer request: %i (%c).",
|
||||||
|
str[i], str[i]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool wsrep_sst_method_check (sys_var *self, THD* thd, set_var* var)
|
bool wsrep_sst_method_check (sys_var *self, THD* thd, set_var* var)
|
||||||
{
|
{
|
||||||
if ((! var->save_result.string_value.str) ||
|
if ((! var->save_result.string_value.str) ||
|
||||||
|
@ -183,6 +213,16 @@ bool wsrep_sst_method_check (sys_var *self, THD* thd, set_var* var)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check also that method name is alphanumeric string */
|
||||||
|
if (check_request_str(var->save_result.string_value.str,
|
||||||
|
filename_char, false))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name.str,
|
||||||
|
var->save_result.string_value.str ?
|
||||||
|
var->save_result.string_value.str : "NULL");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1920,35 +1960,6 @@ static int sst_donate_other (const char* method,
|
||||||
return arg.err;
|
return arg.err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return true if character can be a part of a filename */
|
|
||||||
static bool filename_char(int const c)
|
|
||||||
{
|
|
||||||
return isalnum(c) || (c == '-') || (c == '_') || (c == '.');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return true if character can be a part of an address string */
|
|
||||||
static bool address_char(int const c)
|
|
||||||
{
|
|
||||||
return filename_char(c) ||
|
|
||||||
(c == ':') || (c == '[') || (c == ']') || (c == '/');
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool check_request_str(const char* const str,
|
|
||||||
bool (*check) (int c))
|
|
||||||
{
|
|
||||||
for (size_t i(0); str[i] != '\0'; ++i)
|
|
||||||
{
|
|
||||||
if (!check(str[i]))
|
|
||||||
{
|
|
||||||
WSREP_WARN("Illegal character in state transfer request: %i (%c).",
|
|
||||||
str[i], str[i]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wsrep_sst_donate(const std::string& msg,
|
int wsrep_sst_donate(const std::string& msg,
|
||||||
const wsrep::gtid& current_gtid,
|
const wsrep::gtid& current_gtid,
|
||||||
const bool bypass)
|
const bool bypass)
|
||||||
|
@ -1956,7 +1967,7 @@ int wsrep_sst_donate(const std::string& msg,
|
||||||
const char* method= msg.data();
|
const char* method= msg.data();
|
||||||
size_t method_len= strlen (method);
|
size_t method_len= strlen (method);
|
||||||
|
|
||||||
if (check_request_str(method, filename_char))
|
if (check_request_str(method, filename_char, true))
|
||||||
{
|
{
|
||||||
WSREP_ERROR("Bad SST method name. SST canceled.");
|
WSREP_ERROR("Bad SST method name. SST canceled.");
|
||||||
return WSREP_CB_FAILURE;
|
return WSREP_CB_FAILURE;
|
||||||
|
@ -1978,7 +1989,7 @@ int wsrep_sst_donate(const std::string& msg,
|
||||||
addr= data;
|
addr= data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_request_str(addr, address_char))
|
if (check_request_str(addr, address_char, true))
|
||||||
{
|
{
|
||||||
WSREP_ERROR("Bad SST address string. SST canceled.");
|
WSREP_ERROR("Bad SST address string. SST canceled.");
|
||||||
return WSREP_CB_FAILURE;
|
return WSREP_CB_FAILURE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue