summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniele Sciascia <daniele.sciascia@galeracluster.com>2021-09-30 10:36:26 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2021-10-12 07:25:13 +0300
commitb44e12fef176bfc0884fb2c5f4ba7f42bf054f44 (patch)
tree877e0eb198b5bedb69b98143d276c01e7566520f
parent53c8d559a596993cf3c7b020b19e2c345952fb71 (diff)
downloadmariadb-git-b44e12fef176bfc0884fb2c5f4ba7f42bf054f44.tar.gz
MDEV-26707 SR transaction rolls back locally, but not in clusterbb-10.4-MDEV-26707-galera
Update wsrep-lib, and add MTR test case for MDEV-26707 Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
-rw-r--r--mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result86
-rw-r--r--mysql-test/suite/galera_3nodes_sr/suite.pm1
-rw-r--r--mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test162
m---------wsrep-lib0
4 files changed, 249 insertions, 0 deletions
diff --git a/mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result b/mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result
new file mode 100644
index 00000000000..8de724c1576
--- /dev/null
+++ b/mysql-test/suite/galera_3nodes_sr/r/MDEV-26707.result
@@ -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;
diff --git a/mysql-test/suite/galera_3nodes_sr/suite.pm b/mysql-test/suite/galera_3nodes_sr/suite.pm
index ee651fe8984..becc764733a 100644
--- a/mysql-test/suite/galera_3nodes_sr/suite.pm
+++ b/mysql-test/suite/galera_3nodes_sr/suite.pm
@@ -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.),
diff --git a/mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test b/mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test
new file mode 100644
index 00000000000..ed7adc8313a
--- /dev/null
+++ b/mysql-test/suite/galera_3nodes_sr/t/MDEV-26707.test
@@ -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;
diff --git a/wsrep-lib b/wsrep-lib
-Subproject efb4aab090cb9c1b57b9e7f9988ae1c41f48344
+Subproject 22921e7082ddfb45222f21a585aa8b877e62aa8