Skip to content

Commit dd159ae

Browse files
committed
MDEV-30418 : Setting wsrep_slave_threads causes thread hang
Problem was that wsrep was disconnected and new slave threads tried to connect to cluster but failed as we were disconnected state. Allow changing wsrep_slave_threads only when wsrep is enabled and we are connected to a cluster. In other cases report error and issue a warning.
1 parent 21395bb commit dd159ae

File tree

6 files changed

+101
-6
lines changed

6 files changed

+101
-6
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
connection node_2;
2+
connection node_1;
3+
connection node_1;
4+
connection node_2;
5+
connection node_2;
6+
select @@wsrep_slave_threads;
7+
@@wsrep_slave_threads
8+
1
9+
SET @cluster_address_orig = @@wsrep_cluster_address;
10+
SET GLOBAL wsrep_cluster_address=AUTO;
11+
SET GLOBAL wsrep_slave_threads=12;
12+
ERROR 42000: Variable 'wsrep_slave_threads' can't be set to the value of '12'
13+
SHOW WARNINGS;
14+
Level Code Message
15+
Warning 1231 Cannot set 'wsrep_slave_threads' because wsrep is disconnected
16+
Error 1231 Variable 'wsrep_slave_threads' can't be set to the value of '12'
17+
SET GLOBAL wsrep_cluster_address=ON;
18+
SET GLOBAL wsrep_slave_threads=0;
19+
ERROR 42000: Variable 'wsrep_slave_threads' can't be set to the value of '0'
20+
SHOW WARNINGS;
21+
Level Code Message
22+
Warning 1292 Truncated incorrect wsrep_slave_threads value: '0'
23+
Warning 1231 Cannot set 'wsrep_slave_threads' because wsrep is disconnected
24+
Error 1231 Variable 'wsrep_slave_threads' can't be set to the value of '0'
25+
SET GLOBAL wsrep_cluster_address='a';
26+
SET GLOBAL wsrep_slave_threads=2;
27+
ERROR 42000: Variable 'wsrep_slave_threads' can't be set to the value of '2'
28+
SHOW WARNINGS;
29+
Level Code Message
30+
Warning 1231 Cannot set 'wsrep_slave_threads' because wsrep is disconnected
31+
Error 1231 Variable 'wsrep_slave_threads' can't be set to the value of '2'
32+
select @@wsrep_slave_threads;
33+
@@wsrep_slave_threads
34+
1
35+
show status like 'wsrep_cluster_size';
36+
Variable_name Value
37+
wsrep_cluster_size 2
38+
show status like 'wsrep_cluster_status';
39+
Variable_name Value
40+
wsrep_cluster_status Primary
41+
call mtr.add_suppression("WSREP:.*");
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--source include/galera_cluster.inc
2+
3+
# Save original auto_increment_offset values.
4+
--let $node_1=node_1
5+
--let $node_2=node_2
6+
--source ../galera/include/auto_increment_offset_save.inc
7+
8+
--connection node_2
9+
select @@wsrep_slave_threads;
10+
SET @cluster_address_orig = @@wsrep_cluster_address;
11+
SET GLOBAL wsrep_cluster_address=AUTO;
12+
--error ER_WRONG_VALUE_FOR_VAR
13+
SET GLOBAL wsrep_slave_threads=12;
14+
SHOW WARNINGS;
15+
SET GLOBAL wsrep_cluster_address=ON;
16+
--error ER_WRONG_VALUE_FOR_VAR
17+
SET GLOBAL wsrep_slave_threads=0;
18+
SHOW WARNINGS;
19+
SET GLOBAL wsrep_cluster_address='a';
20+
--error ER_WRONG_VALUE_FOR_VAR
21+
SET GLOBAL wsrep_slave_threads=2;
22+
SHOW WARNINGS;
23+
--disable_query_log
24+
SET GLOBAL wsrep_cluster_address = @cluster_address_orig;
25+
--enable_query_log
26+
select @@wsrep_slave_threads;
27+
show status like 'wsrep_cluster_size';
28+
show status like 'wsrep_cluster_status';
29+
call mtr.add_suppression("WSREP:.*");
30+
31+
# Restore original auto_increment_offset values.
32+
--source ../galera/include/auto_increment_offset_restore.inc

mysql-test/suite/wsrep/r/wsrep_variables_wsrep_off.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
SELECT @@wsrep_on;
22
@@wsrep_on
33
0
4-
SET @wsrep_slave_threads_global_saved = @@global.wsrep_slave_threads;
54
SET @wsrep_debug_saved = @@global.wsrep_debug;
65
SET SESSION wsrep_trx_fragment_size=DEFAULT;
76
ERROR HY000: Incorrect arguments to SET
@@ -24,9 +23,10 @@ SELECT @@global.wsrep_debug;
2423
@@global.wsrep_debug
2524
NONE
2625
SET GLOBAL wsrep_slave_threads=5;
26+
ERROR HY000: WSREP (galera) not started
2727
SELECT @@global.wsrep_slave_threads;
2828
@@global.wsrep_slave_threads
29-
5
29+
1
3030
SET GLOBAL wsrep_desync=1;
3131
ERROR HY000: WSREP (galera) not started
3232
SELECT @@global.wsrep_desync;

mysql-test/suite/wsrep/t/wsrep_variables_wsrep_off.test

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
SELECT @@wsrep_on;
55

6-
SET @wsrep_slave_threads_global_saved = @@global.wsrep_slave_threads;
76
SET @wsrep_debug_saved = @@global.wsrep_debug;
87

98
--error ER_WRONG_ARGUMENTS
@@ -15,6 +14,7 @@ SHOW WARNINGS;
1514
SELECT @@global.wsrep_start_position;
1615
SET GLOBAL wsrep_debug=1;
1716
SELECT @@global.wsrep_debug;
17+
--error ER_WRONG_ARGUMENTS
1818
SET GLOBAL wsrep_slave_threads=5;
1919
SELECT @@global.wsrep_slave_threads;
2020
--error ER_WRONG_ARGUMENTS
@@ -25,6 +25,5 @@ SET SESSION wsrep_trx_fragment_unit='rows';
2525
SELECT @@session.wsrep_trx_fragment_unit;
2626

2727
--disable_query_log
28-
SET @@global.wsrep_slave_threads = @wsrep_slave_threads_global_saved;
2928
SET @@global.wsrep_debug = @wsrep_debug_saved;
3029
--enable_query_log

sql/sys_vars.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6080,7 +6080,7 @@ static Sys_var_ulong Sys_wsrep_slave_threads(
60806080
GLOBAL_VAR(wsrep_slave_threads), CMD_LINE(REQUIRED_ARG),
60816081
VALID_RANGE(1, 512), DEFAULT(1), BLOCK_SIZE(1),
60826082
NO_MUTEX_GUARD, NOT_IN_BINLOG,
6083-
ON_CHECK(0),
6083+
ON_CHECK(wsrep_slave_threads_check),
60846084
ON_UPDATE(wsrep_slave_threads_update));
60856085

60866086
static Sys_var_charptr Sys_wsrep_dbug_option(

sql/wsrep_var.cc

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2008-2023 Codership Oy <http://www.codership.com>
1+
/* Copyright 2008-2025 Codership Oy <http://www.codership.com>
22
33
This program is free software; you can redistribute it and/or modify
44
it under the terms of the GNU General Public License as published by
@@ -1178,3 +1178,26 @@ bool wsrep_forced_binlog_format_check(sys_var *self, THD* thd, set_var* var)
11781178

11791179
return false;
11801180
}
1181+
1182+
bool wsrep_slave_threads_check (sys_var *self, THD* thd, set_var* var)
1183+
{
1184+
ulonglong new_slave_threads= var->save_result.ulonglong_value;
1185+
1186+
if (!WSREP_ON)
1187+
{
1188+
my_message(ER_WRONG_ARGUMENTS, "WSREP (galera) not started", MYF(0));
1189+
return true;
1190+
}
1191+
1192+
if (new_slave_threads &&
1193+
Wsrep_server_state::instance().state() == wsrep::server_state::s_disconnected)
1194+
{
1195+
push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
1196+
ER_WRONG_VALUE_FOR_VAR,
1197+
"Cannot set 'wsrep_slave_threads' because "
1198+
"wsrep is disconnected");
1199+
return true;
1200+
}
1201+
1202+
return false;
1203+
}

0 commit comments

Comments
 (0)