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
|