MDEV-26707 SR transaction rolls back locally, but not in cluster
Update wsrep-lib, and add MTR test case for MDEV-26707 Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
This commit is contained in:
parent
53c8d559a5
commit
b44e12fef1
86
mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result
Normal file
86
mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result
Normal file
@ -0,0 +1,86 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
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;
|
||||
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;
|
||||
EXPECT_1
|
||||
1
|
||||
connection node_2;
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_1
|
||||
1
|
||||
connection node_3;
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_1
|
||||
1
|
||||
connection node_3a;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_1a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_2a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_2;
|
||||
SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue';
|
||||
COMMIT;
|
||||
connection node_2a;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR before_cert';
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
SET DEBUG_SYNC = 'now SIGNAL continue';
|
||||
connection node_2;
|
||||
ERROR HY000: Got error 6 "No such device or address" during COMMIT
|
||||
connection node_2a;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
connection node_1a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_3a;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_1
|
||||
1
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_1a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_1
|
||||
1
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_2a;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_1a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_3a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
SET SESSION wsrep_sync_wait = DEFAULT;
|
||||
connection node_1a;
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_0
|
||||
0
|
||||
connection node_2a;
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_0
|
||||
0
|
||||
connection node_3a;
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
EXPECT_0
|
||||
0
|
||||
connection node_1;
|
||||
DROP TABLE t1;
|
@ -37,6 +37,7 @@ push @::global_suppressions,
|
||||
qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(SYNCED\). Message ignored.|,
|
||||
qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(JOINED\). Message ignored.|,
|
||||
qr(WSREP: Action message in non-primary configuration from member [0-9]*),
|
||||
qr(WSREP: Last Applied Action message in non-primary configuration from member [0-9]*),
|
||||
qr|WSREP: .*core_handle_uuid_msg.*|,
|
||||
qr(WSREP: --wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=0. WSREP_SYNC_WAIT_BEFORE_READ is on),
|
||||
qr(WSREP: JOIN message from member .* in non-primary configuration. Ignored.),
|
||||
|
162
mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test
Normal file
162
mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test
Normal file
@ -0,0 +1,162 @@
|
||||
#
|
||||
# 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
|
||||
|
||||
|
||||
--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
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
--connection node_2a
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
--connection node_3a
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||
|
||||
|
||||
--connection node_1
|
||||
DROP TABLE t1;
|
@ -1 +1 @@
|
||||
Subproject commit efb4aab090cb9c1b57b9e7f9988ae1c41f48344f
|
||||
Subproject commit 22921e7082ddfb45222f21a585aa8b877e62aa8b
|
Loading…
x
Reference in New Issue
Block a user