summaryrefslogtreecommitdiff
path: root/mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test
blob: a952b343d9fbdb8ee9ff07828222b383bdd47c9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#
# MDEV-26707: SR transaction rolls back locally, but not in cluster
#
# This test excercises the following scenario:
# Initially we have a three node cluster where node 2 has an active
# SR transaction that has replicated one fragment.
# Node 3 disconnects from the cluster, followed by disconnect of node 2.
# Node 2 attempts to COMMIT its transaction, but fails because node 2 is
# non-primary. This failure causes the transaction to rolled back locally
# (node 2 can't communicate with the cluster at this point, so rollback
# fragment cannot be sent successfully)
# Node 3 joins back creating non-primary view (node 1, node 3).
# Then node 2 joins back creating primary view (node 1, node 1, node 3).
# If bug is present, we have that node 2 has rolled back locally, while
# the same transaction is still active nodes 1 and 3, leaving entries
# in their wsrep_streaming_log tables.
#

--source include/galera_cluster.inc
--source include/have_debug_sync.inc

--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connect node_3a, 127.0.0.1, root, , test, $NODE_MYPORT_3

# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc

--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);

--connection node_2
SET SESSION wsrep_trx_fragment_size=1;
BEGIN;
INSERT INTO t1 VALUES (21);

--connection node_1
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;

--connection node_2
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;

--connection node_3
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;

#
# Disconnect node 3 from cluster
#
--connection node_3a
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SET SESSION wsrep_sync_wait = DEFAULT;

--connection node_1a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SET SESSION wsrep_sync_wait = DEFAULT;

--connection node_2a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SET SESSION wsrep_sync_wait = DEFAULT;

#
# Issue commit block COMMIT before certification on node 2
#
--connection node_2
SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue';
--send COMMIT

--connection node_2a
SET DEBUG_SYNC = 'now WAIT_FOR before_cert';

#
# Disconnect node 2
#
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SET SESSION wsrep_sync_wait = DEFAULT;


#
# Unblock COMMIT and expect it to fail
#
SET DEBUG_SYNC = 'now SIGNAL continue';

--connection node_2
--error ER_ERROR_DURING_COMMIT
--reap

--connection node_2a
SET DEBUG_SYNC = 'RESET';

--connection node_1a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SET SESSION wsrep_sync_wait = DEFAULT;


#
# Reconnect node 3
#
--connection node_3a
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
SET SESSION wsrep_sync_wait = DEFAULT;

--connection node_1a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
SET SESSION wsrep_sync_wait = DEFAULT;


#
# Reconnect node 2
#
--connection node_2a
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--source include/galera_wait_ready.inc
SET SESSION wsrep_sync_wait = DEFAULT;

--connection node_1a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--source include/galera_wait_ready.inc
SET SESSION wsrep_sync_wait = DEFAULT;

--connection node_3a
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--source include/galera_wait_ready.inc
SET SESSION wsrep_sync_wait = DEFAULT;


#
# Expect no entries in wsrep_streaming_log
#
--connection node_1a
--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_0 FROM  mysql.wsrep_streaming_log;
--connection node_2a
--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_0 FROM  mysql.wsrep_streaming_log;
--connection node_3a
--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_0 FROM  mysql.wsrep_streaming_log;


--connection node_1
DROP TABLE t1;

--source ../galera/include/auto_increment_offset_restore.inc