Skip to content

Commit 84b1350

Browse files
committed
MDEV-28314 : The Galera cluster primary node goes into hang mode when innodb_encryption_threads is enabled
When we enable writes after Galera SST srv_n_fil_crypt_threads needs to be set temporally to 0 (as was done when writes were disabled) to make sure that encryption threads will be really started based on old value of encryption threads. Fix provided by Marko Mäkelä.
1 parent b3c3291 commit 84b1350

File tree

4 files changed

+230
-1
lines changed

4 files changed

+230
-1
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
connection node_1;
2+
connection node_2;
3+
Performing State Transfer on a server that has been shut down cleanly and restarted
4+
connection node_1;
5+
CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB;
6+
SET AUTOCOMMIT=OFF;
7+
START TRANSACTION;
8+
INSERT INTO t1 VALUES ('node1_committed_before');
9+
INSERT INTO t1 VALUES ('node1_committed_before');
10+
INSERT INTO t1 VALUES ('node1_committed_before');
11+
INSERT INTO t1 VALUES ('node1_committed_before');
12+
INSERT INTO t1 VALUES ('node1_committed_before');
13+
COMMIT;
14+
connection node_2;
15+
SET AUTOCOMMIT=OFF;
16+
START TRANSACTION;
17+
INSERT INTO t1 VALUES ('node2_committed_before');
18+
INSERT INTO t1 VALUES ('node2_committed_before');
19+
INSERT INTO t1 VALUES ('node2_committed_before');
20+
INSERT INTO t1 VALUES ('node2_committed_before');
21+
INSERT INTO t1 VALUES ('node2_committed_before');
22+
COMMIT;
23+
Shutting down server ...
24+
connection node_1;
25+
SET AUTOCOMMIT=OFF;
26+
START TRANSACTION;
27+
INSERT INTO t1 VALUES ('node1_committed_during');
28+
INSERT INTO t1 VALUES ('node1_committed_during');
29+
INSERT INTO t1 VALUES ('node1_committed_during');
30+
INSERT INTO t1 VALUES ('node1_committed_during');
31+
INSERT INTO t1 VALUES ('node1_committed_during');
32+
COMMIT;
33+
START TRANSACTION;
34+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
35+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
36+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
37+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
38+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
39+
connect node_1a_galera_st_shutdown_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1;
40+
SET AUTOCOMMIT=OFF;
41+
START TRANSACTION;
42+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
43+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
44+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
45+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
46+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
47+
connection node_2;
48+
Starting server ...
49+
SET AUTOCOMMIT=OFF;
50+
START TRANSACTION;
51+
INSERT INTO t1 VALUES ('node2_committed_after');
52+
INSERT INTO t1 VALUES ('node2_committed_after');
53+
INSERT INTO t1 VALUES ('node2_committed_after');
54+
INSERT INTO t1 VALUES ('node2_committed_after');
55+
INSERT INTO t1 VALUES ('node2_committed_after');
56+
COMMIT;
57+
connection node_1;
58+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
59+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
60+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
61+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
62+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
63+
COMMIT;
64+
SET AUTOCOMMIT=OFF;
65+
START TRANSACTION;
66+
INSERT INTO t1 VALUES ('node1_committed_after');
67+
INSERT INTO t1 VALUES ('node1_committed_after');
68+
INSERT INTO t1 VALUES ('node1_committed_after');
69+
INSERT INTO t1 VALUES ('node1_committed_after');
70+
INSERT INTO t1 VALUES ('node1_committed_after');
71+
COMMIT;
72+
connection node_1a_galera_st_shutdown_slave;
73+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
74+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
75+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
76+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
77+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
78+
ROLLBACK;
79+
SELECT COUNT(*) = 35 FROM t1;
80+
COUNT(*) = 35
81+
1
82+
SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1;
83+
COUNT(*) = 0
84+
1
85+
COMMIT;
86+
SET AUTOCOMMIT=ON;
87+
connection node_1;
88+
SELECT COUNT(*) = 35 FROM t1;
89+
COUNT(*) = 35
90+
1
91+
SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1;
92+
COUNT(*) = 0
93+
1
94+
DROP TABLE t1;
95+
COMMIT;
96+
SET AUTOCOMMIT=ON;
97+
Performing State Transfer on a server that starts from a clean var directory
98+
This is accomplished by shutting down node #2 and removing its var directory before restarting it
99+
connection node_1;
100+
CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB;
101+
SET AUTOCOMMIT=OFF;
102+
START TRANSACTION;
103+
INSERT INTO t1 VALUES ('node1_committed_before');
104+
INSERT INTO t1 VALUES ('node1_committed_before');
105+
INSERT INTO t1 VALUES ('node1_committed_before');
106+
INSERT INTO t1 VALUES ('node1_committed_before');
107+
INSERT INTO t1 VALUES ('node1_committed_before');
108+
COMMIT;
109+
connection node_2;
110+
SET AUTOCOMMIT=OFF;
111+
START TRANSACTION;
112+
INSERT INTO t1 VALUES ('node2_committed_before');
113+
INSERT INTO t1 VALUES ('node2_committed_before');
114+
INSERT INTO t1 VALUES ('node2_committed_before');
115+
INSERT INTO t1 VALUES ('node2_committed_before');
116+
INSERT INTO t1 VALUES ('node2_committed_before');
117+
COMMIT;
118+
Shutting down server ...
119+
connection node_1;
120+
Cleaning var directory ...
121+
SET AUTOCOMMIT=OFF;
122+
START TRANSACTION;
123+
INSERT INTO t1 VALUES ('node1_committed_during');
124+
INSERT INTO t1 VALUES ('node1_committed_during');
125+
INSERT INTO t1 VALUES ('node1_committed_during');
126+
INSERT INTO t1 VALUES ('node1_committed_during');
127+
INSERT INTO t1 VALUES ('node1_committed_during');
128+
COMMIT;
129+
START TRANSACTION;
130+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
131+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
132+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
133+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
134+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
135+
connect node_1a_galera_st_clean_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1;
136+
SET AUTOCOMMIT=OFF;
137+
START TRANSACTION;
138+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
139+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
140+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
141+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
142+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
143+
connection node_2;
144+
Starting server ...
145+
SET AUTOCOMMIT=OFF;
146+
START TRANSACTION;
147+
INSERT INTO t1 VALUES ('node2_committed_after');
148+
INSERT INTO t1 VALUES ('node2_committed_after');
149+
INSERT INTO t1 VALUES ('node2_committed_after');
150+
INSERT INTO t1 VALUES ('node2_committed_after');
151+
INSERT INTO t1 VALUES ('node2_committed_after');
152+
COMMIT;
153+
connection node_1;
154+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
155+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
156+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
157+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
158+
INSERT INTO t1 VALUES ('node1_to_be_committed_after');
159+
COMMIT;
160+
SET AUTOCOMMIT=OFF;
161+
START TRANSACTION;
162+
INSERT INTO t1 VALUES ('node1_committed_after');
163+
INSERT INTO t1 VALUES ('node1_committed_after');
164+
INSERT INTO t1 VALUES ('node1_committed_after');
165+
INSERT INTO t1 VALUES ('node1_committed_after');
166+
INSERT INTO t1 VALUES ('node1_committed_after');
167+
COMMIT;
168+
connection node_1a_galera_st_clean_slave;
169+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
170+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
171+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
172+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
173+
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
174+
ROLLBACK;
175+
SELECT COUNT(*) = 35 FROM t1;
176+
COUNT(*) = 35
177+
1
178+
SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1;
179+
COUNT(*) = 0
180+
1
181+
COMMIT;
182+
SET AUTOCOMMIT=ON;
183+
connection node_1;
184+
SELECT COUNT(*) = 35 FROM t1;
185+
COUNT(*) = 35
186+
1
187+
SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1;
188+
COUNT(*) = 0
189+
1
190+
DROP TABLE t1;
191+
COMMIT;
192+
SET AUTOCOMMIT=ON;
193+
disconnect node_2;
194+
disconnect node_1;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
!include ../galera_2nodes.cnf
2+
3+
[mysqld]
4+
plugin-load-add=@ENV.FILE_KEY_MANAGEMENT_SO
5+
loose-file-key-management
6+
loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt
7+
loose-file-key-management-encryption-algorithm=aes_cbc
8+
wsrep-debug=1
9+
innodb_encryption_threads = 4
10+
innodb_file_per_table=1
11+
wsrep_sst_method=rsync
12+
13+
[mysqld.1]
14+
wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true'
15+
16+
[mysqld.2]
17+
wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true'
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--source include/big_test.inc
2+
--source include/galera_cluster.inc
3+
--source ../encryption/include/have_file_key_management_plugin.inc
4+
5+
# Save original auto_increment_offset values.
6+
--let $node_1=node_1
7+
--let $node_2=node_2
8+
--source include/auto_increment_offset_save.inc
9+
10+
--source suite/galera/include/galera_st_shutdown_slave.inc
11+
--source suite/galera/include/galera_st_clean_slave.inc
12+
13+
# Restore original auto_increment_offset values.
14+
--source include/auto_increment_offset_restore.inc
15+
16+
--source include/galera_end.inc

storage/innobase/handler/ha_innodb.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,9 @@ static void sst_enable_innodb_writes()
19331933
purge_sys.resume();
19341934
my_atomic_store32_explicit(&wsrep_sst_disable_writes, false,
19351935
MY_MEMORY_ORDER_RELAXED);
1936-
fil_crypt_set_thread_cnt(srv_n_fil_crypt_threads);
1936+
const uint old_count= srv_n_fil_crypt_threads;
1937+
srv_n_fil_crypt_threads= 0;
1938+
fil_crypt_set_thread_cnt(old_count);
19371939
}
19381940

19391941
static void innodb_disable_internal_writes(bool disable)

0 commit comments

Comments
 (0)