Skip to content

Commit db947b7

Browse files
committed
Merge branch '10.0-galera' into 10.1
2 parents f95d26b + 2482306 commit db947b7

19 files changed

+570
-139
lines changed

include/wsrep.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
if (WSREP_ON && WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) \
2828
goto error;
2929

30+
#define WSREP_TO_ISOLATION_BEGIN_ALTER(db_, table_, table_list_, alter_info_) \
31+
if (WSREP_ON && WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, \
32+
table_list_, alter_info_)) \
33+
goto error;
34+
3035
#define WSREP_TO_ISOLATION_END \
3136
if (WSREP_ON && (WSREP(thd) || (thd && thd->wsrep_exec_mode==TOTAL_ORDER))) \
3237
wsrep_to_isolation_end(thd);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
SET GLOBAL wsrep_provider_options = 'pc.weight=3';
2+
SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options';
3+
Variable_name Value
4+
wsrep_provider_options pc.weight = 3
5+
SET GLOBAL wsrep_provider_options = 'pc.weight=1';
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
2+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER) ENGINE=INNODB;
3+
INSERT INTO p VALUES (1, 0);
4+
INSERT INTO p VALUES (2, 0);
5+
INSERT INTO c VALUES (1, 1);
6+
INSERT INTO c VALUES (2, 2);
7+
SET AUTOCOMMIT=ON;
8+
START TRANSACTION;
9+
UPDATE p SET f1 = f1 + 100;
10+
SET SESSION wsrep_sync_wait = 0;
11+
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync';
12+
ALTER TABLE c ADD FOREIGN KEY (p_id) REFERENCES p(f1);
13+
SET SESSION wsrep_on = 0;
14+
SET SESSION wsrep_on = 1;
15+
SET GLOBAL wsrep_provider_options = 'dbug=';
16+
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync';
17+
COMMIT;
18+
SET SESSION wsrep_on = 0;
19+
SET SESSION wsrep_on = 1;
20+
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync';
21+
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync';
22+
SET GLOBAL wsrep_provider_options = 'dbug=';
23+
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
24+
SELECT * FROM p;
25+
f1 f2
26+
1 0
27+
2 0
28+
SELECT * FROM c;
29+
f1 p_id
30+
1 1
31+
2 2
32+
DROP TABLE c;
33+
DROP TABLE p;
34+
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
35+
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
36+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB;
37+
INSERT INTO p1 VALUES (1, 0), (2, 0);
38+
INSERT INTO p2 VALUES (1, 0), (2, 0);
39+
INSERT INTO c VALUES (1, 1, 1);
40+
INSERT INTO c VALUES (2, 2, 2);
41+
SET AUTOCOMMIT=ON;
42+
START TRANSACTION;
43+
UPDATE p1 SET f1 = f1 + 100;
44+
SET SESSION wsrep_sync_wait = 0;
45+
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync';
46+
ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1);
47+
SET SESSION wsrep_on = 0;
48+
SET SESSION wsrep_on = 1;
49+
SET GLOBAL wsrep_provider_options = 'dbug=';
50+
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync';
51+
COMMIT;
52+
SET SESSION wsrep_on = 0;
53+
SET SESSION wsrep_on = 1;
54+
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync';
55+
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync';
56+
SET GLOBAL wsrep_provider_options = 'dbug=';
57+
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
58+
SELECT * FROM p1;
59+
f1 f2
60+
1 0
61+
2 0
62+
SELECT * FROM p2;
63+
f1 f2
64+
1 0
65+
2 0
66+
SELECT * FROM c;
67+
f1 p_id1 p_id2
68+
1 1 1
69+
2 2 2
70+
DROP TABLE c;
71+
DROP TABLE p1;
72+
DROP TABLE p2;
73+
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
74+
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
75+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB;
76+
INSERT INTO p1 VALUES (1, 0), (2, 0);
77+
INSERT INTO p2 VALUES (1, 0), (2, 0);
78+
INSERT INTO c VALUES (1, 1, 1);
79+
INSERT INTO c VALUES (2, 2, 2);
80+
SET AUTOCOMMIT=ON;
81+
START TRANSACTION;
82+
UPDATE p2 SET f1 = f1 + 100;
83+
SET SESSION wsrep_sync_wait = 0;
84+
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync';
85+
ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1);
86+
SET SESSION wsrep_on = 0;
87+
SET SESSION wsrep_on = 1;
88+
SET GLOBAL wsrep_provider_options = 'dbug=';
89+
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync';
90+
COMMIT;
91+
SET SESSION wsrep_on = 0;
92+
SET SESSION wsrep_on = 1;
93+
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync';
94+
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync';
95+
SET GLOBAL wsrep_provider_options = 'dbug=';
96+
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
97+
SELECT * FROM p1;
98+
f1 f2
99+
1 0
100+
2 0
101+
SELECT * FROM p2;
102+
f1 f2
103+
1 0
104+
2 0
105+
SELECT * FROM c;
106+
f1 p_id1 p_id2
107+
1 1 1
108+
2 2 2
109+
DROP TABLE c;
110+
DROP TABLE p1;
111+
DROP TABLE p2;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# galera#505 - Change of pc.weight wsrep param will be correctly stored in wsrep_provider_options variable
2+
3+
--source include/galera_cluster.inc
4+
5+
--disable_query_log
6+
select CAST(REGEXP_REPLACE(variable_value,'^(\\d+)\\.(\\d+)\\.(\\d+)(r\\d+)','\\3') AS UNSIGNED) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_provider_version' INTO @GALERA_VERSION;
7+
8+
# Make sure that the test is operating on the right version of galera library.
9+
--let $galera_version=24
10+
eval SET @REQUIRED_GALERA_VERSION='$galera_version';
11+
12+
SELECT @GALERA_VERSION, @REQUIRED_GALERA_VERSION;
13+
14+
if (!`SELECT (@GALERA_VERSION < @REQUIRED_GALERA_VERSION)`)
15+
{
16+
skip Test requires Galera library version 25.3.$galera_version;
17+
}
18+
--enable_query_log
19+
20+
--connection node_1
21+
22+
# Convert "... pc.weight = N; ..." to "N; ..."
23+
--let $s1 = `SELECT SUBSTR(@@wsrep_provider_options, LOCATE('pc.weight =', @@wsrep_provider_options) + LENGTH('pc.weight = '))`
24+
# Convert "N; ..." to "N"
25+
--let $pc_weight_value = `SELECT SUBSTR('$s1', 1, LOCATE(';', '$s1') - 1)`
26+
27+
SET GLOBAL wsrep_provider_options = 'pc.weight=3';
28+
29+
-- replace_regex /.*(pc\.weight = [0-9]+);.*/\1/
30+
SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options';
31+
32+
--eval SET GLOBAL wsrep_provider_options = 'pc.weight=$pc_weight_value'
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
--source include/galera_cluster.inc
2+
--source include/have_innodb.inc
3+
--source include/have_debug_sync.inc
4+
--source suite/galera/include/galera_have_debug_sync.inc
5+
6+
# Open connection node_1a here, MW-369.inc will use it later
7+
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
8+
9+
#
10+
# Test the scenario where a foreign key is added to an existing child table, and
11+
# concurrently UPDATE the parent table so that it violates the constraint.
12+
#
13+
# We expect that ALTER TABLE ADD FOREIGN KEY adds a table level key on both
14+
# parent and child table. And therefore we also expect the UPDATE to fail
15+
# certification.
16+
#
17+
--connection node_1
18+
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
19+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER) ENGINE=INNODB;
20+
21+
INSERT INTO p VALUES (1, 0);
22+
INSERT INTO p VALUES (2, 0);
23+
24+
INSERT INTO c VALUES (1, 1);
25+
INSERT INTO c VALUES (2, 2);
26+
27+
--let $mw_369_parent_query = UPDATE p SET f1 = f1 + 100
28+
--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id) REFERENCES p(f1)
29+
30+
--source MW-369.inc
31+
32+
# Expect certification failure
33+
--connection node_1
34+
--error ER_LOCK_DEADLOCK
35+
--reap
36+
37+
--connection node_2
38+
SELECT * FROM p;
39+
SELECT * FROM c;
40+
41+
DROP TABLE c;
42+
DROP TABLE p;
43+
44+
45+
#
46+
# Same as above, except that two foreign keys pointing to different parent
47+
# tables are added, p1 and p2. Concurrently UPDATE p1.
48+
#
49+
# Expect certification error on UPDATE.
50+
#
51+
--connection node_1
52+
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
53+
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
54+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB;
55+
56+
INSERT INTO p1 VALUES (1, 0), (2, 0);
57+
INSERT INTO p2 VALUES (1, 0), (2, 0);
58+
59+
INSERT INTO c VALUES (1, 1, 1);
60+
INSERT INTO c VALUES (2, 2, 2);
61+
62+
--let $mw_369_parent_query = UPDATE p1 SET f1 = f1 + 100
63+
--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1)
64+
65+
--source MW-369.inc
66+
67+
# Expect certification failure
68+
--connection node_1
69+
--error ER_LOCK_DEADLOCK
70+
--reap
71+
72+
--connection node_2
73+
SELECT * FROM p1;
74+
SELECT * FROM p2;
75+
SELECT * FROM c;
76+
77+
DROP TABLE c;
78+
DROP TABLE p1;
79+
DROP TABLE p2;
80+
81+
82+
#
83+
# Same as above, except that UPDATE is on p2.
84+
#
85+
--connection node_1
86+
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
87+
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB;
88+
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB;
89+
90+
INSERT INTO p1 VALUES (1, 0), (2, 0);
91+
INSERT INTO p2 VALUES (1, 0), (2, 0);
92+
93+
INSERT INTO c VALUES (1, 1, 1);
94+
INSERT INTO c VALUES (2, 2, 2);
95+
96+
--let $mw_369_parent_query = UPDATE p2 SET f1 = f1 + 100
97+
--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1)
98+
99+
--source MW-369.inc
100+
101+
# Expect certification failure
102+
--connection node_1
103+
--error ER_LOCK_DEADLOCK
104+
--reap
105+
106+
--connection node_2
107+
SELECT * FROM p1;
108+
SELECT * FROM p2;
109+
SELECT * FROM c;
110+
111+
DROP TABLE c;
112+
DROP TABLE p1;
113+
DROP TABLE p2;

mysql-test/suite/galera_3nodes/r/galera_pc_weight.result

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1+
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
2+
VARIABLE_VALUE = 3
13
SET GLOBAL wsrep_provider_options = 'pc.weight=3';
2-
Suspending node ...
4+
SELECT VARIABLE_VALUE = 5 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
5+
VARIABLE_VALUE = 5
6+
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
37
SET SESSION wsrep_sync_wait=0;
48
SET SESSION wsrep_on=OFF;
59
SET SESSION wsrep_on=ON;
610
SHOW STATUS LIKE 'wsrep_cluster_size';
711
Variable_name Value
812
wsrep_cluster_size 2
13+
SHOW STATUS LIKE 'wsrep_cluster_weight';
14+
Variable_name Value
915
SHOW STATUS LIKE 'wsrep_cluster_status';
1016
Variable_name Value
1117
wsrep_cluster_status non-Primary
@@ -22,9 +28,13 @@ SHOW STATUS LIKE 'wsrep_local_state_comment';
2228
Variable_name Value
2329
wsrep_local_state_comment Initialized
2430
SET SESSION wsrep_sync_wait=0;
31+
SET SESSION wsrep_on=OFF;
32+
SET SESSION wsrep_on=ON;
2533
SHOW STATUS LIKE 'wsrep_cluster_size';
2634
Variable_name Value
2735
wsrep_cluster_size 2
36+
SHOW STATUS LIKE 'wsrep_cluster_weight';
37+
Variable_name Value
2838
SHOW STATUS LIKE 'wsrep_cluster_status';
2939
Variable_name Value
3040
wsrep_cluster_status non-Primary
@@ -40,7 +50,8 @@ wsrep_local_state 0
4050
SHOW STATUS LIKE 'wsrep_local_state_comment';
4151
Variable_name Value
4252
wsrep_local_state_comment Initialized
43-
Resuming node ...
53+
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
54+
VARIABLE_VALUE = 3
4455
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
4556
VARIABLE_VALUE = 'Primary'
4657
1
@@ -57,11 +68,14 @@ SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VAR
5768
VARIABLE_VALUE = 'Synced'
5869
1
5970
SET GLOBAL wsrep_provider_options = 'pc.weight=1';
60-
SET SESSION wsrep_sync_wait=0;
61-
SET SESSION wsrep_sync_wait=0;
71+
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
72+
VARIABLE_VALUE = 1
73+
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
6274
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
6375
VARIABLE_VALUE = 3
6476
1
77+
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
78+
VARIABLE_VALUE = 3
6579
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
6680
VARIABLE_VALUE = 'Primary'
6781
1
@@ -80,6 +94,8 @@ VARIABLE_VALUE = 'Synced'
8094
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
8195
VARIABLE_VALUE = 3
8296
1
97+
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
98+
VARIABLE_VALUE = 3
8399
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
84100
VARIABLE_VALUE = 'Primary'
85101
1
@@ -98,6 +114,8 @@ VARIABLE_VALUE = 'Synced'
98114
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
99115
VARIABLE_VALUE = 3
100116
1
117+
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
118+
VARIABLE_VALUE = 3
101119
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
102120
VARIABLE_VALUE = 'Primary'
103121
1
@@ -116,6 +134,9 @@ VARIABLE_VALUE = 'Synced'
116134
SET GLOBAL wsrep_provider_options = 'pc.weight=1';
117135
CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1');
118136
CALL mtr.add_suppression('overriding reported weight for');
137+
CALL mtr.add_suppression('SYNC message from member');
138+
CALL mtr.add_suppression('user message in state LEAVING');
139+
CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)');
119140
CALL mtr.add_suppression('WSREP: user message in state LEAVING');
120-
CALL mtr.add_suppression('sending install message failed: Transport endpoint is not connected');
141+
CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)');
121142
CALL mtr.add_suppression('overriding reported weight for');

0 commit comments

Comments
 (0)