mirror of
https://github.com/MariaDB/server.git
synced 2025-02-05 13:22:17 +01:00
175 lines
5.9 KiB
Text
175 lines
5.9 KiB
Text
#
|
|
# 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
|