Skip to content

Commit 814787f

Browse files
committed
MDEV-34117 : Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*)
Problem was that user could drop streaming replication table when streaming replication was used. Fixed by not allowing user to drop streaming replication table when galera is enabled. When it is not enabled super can drop it (as any table in mysql database). Added checks for wsrep_trx_fragment_unit and wsrep_trx_fragment_size variables so that streaming replication can't be enabled when streaming replication table does not exists. Fixed also bug when user is trying to disable streaming replication by wsrep_trx_fragment_size=0 when it was not enabled.
1 parent 654e844 commit 814787f

File tree

10 files changed

+370
-88
lines changed

10 files changed

+370
-88
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
connection node_2;
2+
connection node_1;
3+
connection node_1;
4+
CREATE TABLE t1 (c INT);
5+
INSERT INTO t1 VALUES (0),(0);
6+
CREATE TABLE t2 (c INT);
7+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
8+
SET SESSION wsrep_trx_fragment_size=2;
9+
DROP TABLE mysql.wsrep_streaming_log;
10+
ERROR 42000: DROP command denied to user 'root'@'localhost' for table `mysql`.`wsrep_streaming_log`
11+
CREATE TRIGGER tgr AFTER INSERT ON t2 FOR EACH ROW UPDATE t1 SET c=c+1;
12+
INSERT INTO t2 VALUES (1),(2);
13+
SELECT * FROM t1;
14+
c
15+
2
16+
2
17+
SELECT * FROM t2;
18+
c
19+
1
20+
2
21+
SET wsrep_trx_fragment_unit=DEFAULT;
22+
SET GLOBAL wsrep_trx_fragment_size=DEFAULT;
23+
DROP TRIGGER tgr;
24+
DROP TABLE t1, t2;
25+
connection node_2;
26+
SET GLOBAL wsrep_on=OFF;
27+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
28+
ERROR 42000: Variable 'wsrep_trx_fragment_unit' can't be set to the value of 'STATEMENTS'
29+
SELECT @@wsrep_trx_fragment_unit;
30+
@@wsrep_trx_fragment_unit
31+
bytes
32+
SELECT @@wsrep_trx_fragment_size;
33+
@@wsrep_trx_fragment_size
34+
0
35+
SET SESSION wsrep_trx_fragment_size = 2;
36+
ERROR 42000: Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
37+
SHOW WARNINGS;
38+
Level Code Message
39+
Warning 1231 Cannot set 'wsrep_trx_fragment_size' to a value other than 0 because wsrep is switched off.
40+
Error 1231 Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
41+
SELECT @@wsrep_trx_fragment_unit;
42+
@@wsrep_trx_fragment_unit
43+
bytes
44+
SELECT @@wsrep_trx_fragment_size;
45+
@@wsrep_trx_fragment_size
46+
0
47+
DROP TABLE mysql.wsrep_streaming_log;
48+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
49+
ERROR 42000: Variable 'wsrep_trx_fragment_unit' can't be set to the value of 'STATEMENTS'
50+
SET SESSION wsrep_trx_fragment_size = 2;
51+
ERROR 42000: Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
52+
SHOW WARNINGS;
53+
Level Code Message
54+
Warning 1231 Cannot set 'wsrep_trx_fragment_size' to a value other than 0 because wsrep is switched off.
55+
Error 1231 Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
56+
SELECT @@wsrep_trx_fragment_unit;
57+
@@wsrep_trx_fragment_unit
58+
bytes
59+
SELECT @@wsrep_trx_fragment_size;
60+
@@wsrep_trx_fragment_size
61+
0
62+
SET SESSION wsrep_trx_fragment_size = 0;
63+
SELECT @@wsrep_trx_fragment_unit;
64+
@@wsrep_trx_fragment_unit
65+
bytes
66+
SELECT @@wsrep_trx_fragment_size;
67+
@@wsrep_trx_fragment_size
68+
0
69+
SET GLOBAL wsrep_on=ON;
70+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
71+
ERROR 42000: Variable 'wsrep_trx_fragment_unit' can't be set to the value of 'STATEMENTS'
72+
SET SESSION wsrep_trx_fragment_size = 2;
73+
ERROR 42000: Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
74+
SHOW WARNINGS;
75+
Level Code Message
76+
Warning 1231 Cannot set 'wsrep_trx_fragment_size' to a value other than 0 because streaming table mysql.wsrep_streaming_log does not exists.
77+
Error 1231 Variable 'wsrep_trx_fragment_size' can't be set to the value of '2'
78+
SELECT @@wsrep_trx_fragment_unit;
79+
@@wsrep_trx_fragment_unit
80+
bytes
81+
SELECT @@wsrep_trx_fragment_size;
82+
@@wsrep_trx_fragment_size
83+
0
84+
SET GLOBAL wsrep_on=OFF;
85+
CREATE TABLE IF NOT EXISTS mysql.wsrep_streaming_log
86+
(
87+
node_uuid CHAR(36),
88+
trx_id BIGINT,
89+
seqno BIGINT,
90+
flags INT NOT NULL,
91+
frag LONGBLOB NOT NULL,
92+
PRIMARY KEY (node_uuid, trx_id, seqno)
93+
) ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1;
94+
SET GLOBAL wsrep_on=ON;
95+
connection node_1;
96+
CREATE TABLE t1 (c INT);
97+
INSERT INTO t1 VALUES (0),(0);
98+
CREATE TABLE t2 (c INT);
99+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
100+
SET SESSION wsrep_trx_fragment_size=2;
101+
CREATE TRIGGER tgr AFTER INSERT ON t2 FOR EACH ROW UPDATE t1 SET c=c+1;
102+
INSERT INTO t2 VALUES (1),(2);
103+
SELECT * FROM t1;
104+
c
105+
2
106+
2
107+
SELECT * FROM t2;
108+
c
109+
1
110+
2
111+
connection node_2;
112+
INSERT INTO t2 VALUES (1),(2);
113+
SELECT * FROM t1;
114+
c
115+
4
116+
4
117+
SELECT * FROM t2;
118+
c
119+
1
120+
2
121+
1
122+
2
123+
connection node_1;
124+
SET wsrep_trx_fragment_unit=DEFAULT;
125+
SET GLOBAL wsrep_trx_fragment_size=DEFAULT;
126+
DROP TRIGGER tgr;
127+
DROP TABLE t1, t2;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
--source include/galera_cluster.inc
2+
3+
--connection node_1
4+
CREATE TABLE t1 (c INT);
5+
INSERT INTO t1 VALUES (0),(0);
6+
CREATE TABLE t2 (c INT);
7+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
8+
SET SESSION wsrep_trx_fragment_size=2;
9+
--error ER_TABLEACCESS_DENIED_ERROR
10+
DROP TABLE mysql.wsrep_streaming_log;
11+
CREATE TRIGGER tgr AFTER INSERT ON t2 FOR EACH ROW UPDATE t1 SET c=c+1;
12+
INSERT INTO t2 VALUES (1),(2);
13+
SELECT * FROM t1;
14+
SELECT * FROM t2;
15+
16+
SET wsrep_trx_fragment_unit=DEFAULT;
17+
SET GLOBAL wsrep_trx_fragment_size=DEFAULT;
18+
DROP TRIGGER tgr;
19+
DROP TABLE t1, t2;
20+
21+
--connection node_2
22+
SET GLOBAL wsrep_on=OFF;
23+
--error ER_WRONG_VALUE_FOR_VAR
24+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
25+
SELECT @@wsrep_trx_fragment_unit;
26+
SELECT @@wsrep_trx_fragment_size;
27+
--error ER_WRONG_VALUE_FOR_VAR
28+
SET SESSION wsrep_trx_fragment_size = 2;
29+
SHOW WARNINGS;
30+
SELECT @@wsrep_trx_fragment_unit;
31+
SELECT @@wsrep_trx_fragment_size;
32+
DROP TABLE mysql.wsrep_streaming_log;
33+
--error ER_WRONG_VALUE_FOR_VAR
34+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
35+
--error ER_WRONG_VALUE_FOR_VAR
36+
SET SESSION wsrep_trx_fragment_size = 2;
37+
SHOW WARNINGS;
38+
SELECT @@wsrep_trx_fragment_unit;
39+
SELECT @@wsrep_trx_fragment_size;
40+
SET SESSION wsrep_trx_fragment_size = 0;
41+
SELECT @@wsrep_trx_fragment_unit;
42+
SELECT @@wsrep_trx_fragment_size;
43+
SET GLOBAL wsrep_on=ON;
44+
--error ER_WRONG_VALUE_FOR_VAR
45+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
46+
--error ER_WRONG_VALUE_FOR_VAR
47+
SET SESSION wsrep_trx_fragment_size = 2;
48+
SHOW WARNINGS;
49+
SELECT @@wsrep_trx_fragment_unit;
50+
SELECT @@wsrep_trx_fragment_size;
51+
SET GLOBAL wsrep_on=OFF;
52+
CREATE TABLE IF NOT EXISTS mysql.wsrep_streaming_log
53+
(
54+
node_uuid CHAR(36),
55+
trx_id BIGINT,
56+
seqno BIGINT,
57+
flags INT NOT NULL,
58+
frag LONGBLOB NOT NULL,
59+
PRIMARY KEY (node_uuid, trx_id, seqno)
60+
) ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1;
61+
SET GLOBAL wsrep_on=ON;
62+
63+
--connection node_1
64+
CREATE TABLE t1 (c INT);
65+
INSERT INTO t1 VALUES (0),(0);
66+
CREATE TABLE t2 (c INT);
67+
SET SESSION wsrep_trx_fragment_unit='STATEMENTS';
68+
SET SESSION wsrep_trx_fragment_size=2;
69+
CREATE TRIGGER tgr AFTER INSERT ON t2 FOR EACH ROW UPDATE t1 SET c=c+1;
70+
INSERT INTO t2 VALUES (1),(2);
71+
SELECT * FROM t1;
72+
SELECT * FROM t2;
73+
74+
--connection node_2
75+
INSERT INTO t2 VALUES (1),(2);
76+
SELECT * FROM t1;
77+
SELECT * FROM t2;
78+
79+
--connection node_1
80+
SET wsrep_trx_fragment_unit=DEFAULT;
81+
SET GLOBAL wsrep_trx_fragment_size=DEFAULT;
82+
DROP TRIGGER tgr;
83+
DROP TABLE t1, t2;

mysql-test/suite/galera_sr/r/galera_sr_unit_statements.result

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,60 @@ connection node_1;
33
connection node_1;
44
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
55
SET SESSION wsrep_trx_fragment_size = 3;
6+
SHOW WARNINGS;
7+
Level Code Message
68
SET SESSION wsrep_trx_fragment_unit = 'statements';
9+
SHOW WARNINGS;
10+
Level Code Message
711
connection node_1;
812
SET AUTOCOMMIT=OFF;
913
START TRANSACTION;
1014
INSERT INTO t1 VALUES (1);
15+
# Expect nothing is replicated yet, so far we have 2 statements
1116
connection node_2;
1217
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
13-
SELECT COUNT(*) FROM t1;
14-
COUNT(*)
18+
SELECT COUNT(*) AS EXPECT_0 FROM t1;
19+
EXPECT_0
1520
0
16-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
17-
COUNT(*)
21+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
22+
EXPECT_0
1823
0
1924
connection node_1;
2025
INSERT INTO t1 VALUES (2);
26+
# Expect 2 rows in t1 and 1 fragment in SR table
2127
connection node_2;
22-
SELECT COUNT(*) FROM t1;
23-
COUNT(*)
28+
SELECT COUNT(*) AS EXPECT_2 FROM t1;
29+
EXPECT_2
2430
2
25-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
26-
COUNT(*)
31+
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
32+
EXPECT_1
2733
1
2834
connection node_1;
2935
INSERT INTO t1 VALUES (3);
3036
INSERT INTO t1 VALUES (4);
3137
INSERT INTO t1 VALUES (5);
38+
# Expect 5 rows in t1 and 2 fragments in SR table
3239
connection node_2;
33-
SELECT COUNT(*) FROM t1;
34-
COUNT(*)
40+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
41+
EXPECT_5
3542
5
36-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
37-
COUNT(*)
43+
SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_streaming_log;
44+
EXPECT_2
3845
2
3946
connection node_1;
4047
COMMIT;
41-
SELECT COUNT(*) FROM t1;
42-
COUNT(*)
48+
# Expect 5 rows in t1 and empty SR table
49+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
50+
EXPECT_5
4351
5
44-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
45-
COUNT(*)
52+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
53+
EXPECT_0
4654
0
4755
connection node_2;
48-
SELECT COUNT(*) FROM t1;
49-
COUNT(*)
56+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
57+
EXPECT_5
5058
5
51-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
52-
COUNT(*)
59+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
60+
EXPECT_0
5361
0
5462
DROP TABLE t1;

mysql-test/suite/galera_sr/t/galera_sr_unit_statements.test

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,48 @@
99
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
1010

1111
SET SESSION wsrep_trx_fragment_size = 3;
12+
SHOW WARNINGS;
1213
SET SESSION wsrep_trx_fragment_unit = 'statements';
14+
SHOW WARNINGS;
1315

1416
--connection node_1
1517
SET AUTOCOMMIT=OFF;
1618
START TRANSACTION;
1719
INSERT INTO t1 VALUES (1);
1820

19-
# Expect noting is replicated yet, so far we have 2 statements
21+
--echo # Expect nothing is replicated yet, so far we have 2 statements
2022
--connection node_2
2123
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
22-
SELECT COUNT(*) FROM t1;
23-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
24+
SELECT COUNT(*) AS EXPECT_0 FROM t1;
25+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
2426

2527
--connection node_1
2628
INSERT INTO t1 VALUES (2);
2729

28-
# Expect 2 rows in t1 and 1 fragment in SR table
30+
--echo # Expect 2 rows in t1 and 1 fragment in SR table
2931
--connection node_2
30-
SELECT COUNT(*) FROM t1;
31-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
32+
SELECT COUNT(*) AS EXPECT_2 FROM t1;
33+
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
3234

3335
--connection node_1
3436
INSERT INTO t1 VALUES (3);
3537
INSERT INTO t1 VALUES (4);
3638
INSERT INTO t1 VALUES (5);
3739

38-
# Expect 5 rows in t1 and 2 fragments in SR table
40+
--echo # Expect 5 rows in t1 and 2 fragments in SR table
3941
--connection node_2
40-
SELECT COUNT(*) FROM t1;
41-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
42+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
43+
SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_streaming_log;
4244

4345
--connection node_1
4446
COMMIT;
4547

46-
# Expect 5 rows in t1 and empty SR table
47-
SELECT COUNT(*) FROM t1;
48-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
48+
--echo # Expect 5 rows in t1 and empty SR table
49+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
50+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
4951

5052
--connection node_2
51-
SELECT COUNT(*) FROM t1;
52-
SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
53+
SELECT COUNT(*) AS EXPECT_5 FROM t1;
54+
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
5355

5456
DROP TABLE t1;

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ SELECT @@wsrep_on;
33
0
44
SET @wsrep_debug_saved = @@global.wsrep_debug;
55
SET SESSION wsrep_trx_fragment_size=DEFAULT;
6-
ERROR HY000: Incorrect arguments to SET
76
SELECT @@session.wsrep_trx_fragment_size;
87
@@session.wsrep_trx_fragment_size
98
0
@@ -33,7 +32,11 @@ SELECT @@global.wsrep_desync;
3332
@@global.wsrep_desync
3433
0
3534
SET SESSION wsrep_trx_fragment_unit='rows';
36-
ERROR HY000: Incorrect arguments to SET
35+
ERROR 42000: Variable 'wsrep_trx_fragment_unit' can't be set to the value of 'rows'
36+
SHOW WARNINGS;
37+
Level Code Message
38+
Warning 1231 Cannot set 'wsrep_trx_fragment_unit' because wsrep is switched off
39+
Error 1231 Variable 'wsrep_trx_fragment_unit' can't be set to the value of 'rows'
3740
SELECT @@session.wsrep_trx_fragment_unit;
3841
@@session.wsrep_trx_fragment_unit
39-
rows
42+
bytes

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ SELECT @@wsrep_on;
55

66
SET @wsrep_debug_saved = @@global.wsrep_debug;
77

8-
--error ER_WRONG_ARGUMENTS
98
SET SESSION wsrep_trx_fragment_size=DEFAULT;
109
SELECT @@session.wsrep_trx_fragment_size;
1110
--error ER_WRONG_VALUE_FOR_VAR
@@ -20,8 +19,9 @@ SELECT @@global.wsrep_slave_threads;
2019
--error ER_WRONG_ARGUMENTS
2120
SET GLOBAL wsrep_desync=1;
2221
SELECT @@global.wsrep_desync;
23-
--error ER_WRONG_ARGUMENTS
22+
--error ER_WRONG_VALUE_FOR_VAR
2423
SET SESSION wsrep_trx_fragment_unit='rows';
24+
SHOW WARNINGS;
2525
SELECT @@session.wsrep_trx_fragment_unit;
2626

2727
--disable_query_log

0 commit comments

Comments
 (0)