mirror of
https://github.com/MariaDB/server.git
synced 2025-02-10 07:34:11 +01:00
731a5aba0b
For TOI events specifically we have a situation where in case of the same error different nodes may generate different messages. This may be for two reasons: - different locale setting between the current client session and server default (we can reasonably require server locales to be identical on all nodes, but user can change message locale for the session) - non-deterministic course of STATEMENT execution e.g. for ALTER TABLE On the other hand we may reasonably expect TOI event failures since they are executed after replication, so we must ensure that voting is consistent. For that purpose error codes should be sufficiently unique and deterministic for TOI event failures as DDLs normally deal with a single object, so we can merely use MySQL error codes to vote on. Notice that this problem does not happen with regular transactional writesets, since the originator node will always vote success and replica nodes are assumed to have the same global locale setting. As such different error messages indicate different errors even if the error code is the same (e.g. ER_DUP_KEY can happen on different rows tables). Use only MySQL error code (without the error message) for error voting in case of TOI event failure. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
70 lines
2.8 KiB
Text
70 lines
2.8 KiB
Text
#
|
|
# This test tests that TOI failure on 2 nodes (master and slave) for the
|
|
# same reason, wins over success on a third slave.
|
|
# In particular this tests that master and slave TOI cast the same vote for
|
|
# the same error
|
|
#
|
|
--source include/galera_cluster.inc
|
|
--source include/have_innodb.inc
|
|
|
|
--let $galera_connection_name = node_3
|
|
--let $galera_server_number = 3
|
|
--source include/galera_connect.inc
|
|
|
|
# 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
|
|
|
|
# create inconsistency on node 3
|
|
--connection node_3
|
|
SET SESSION wsrep_on=OFF;
|
|
DROP SCHEMA test;
|
|
|
|
# This should fail on nodes 1 and 2 and succeed on node 3
|
|
--connection node_1
|
|
# Make error message on source node different by changing locale
|
|
# It should still agree with node 2
|
|
SET SESSION lc_messages='fr_FR';
|
|
--error ER_DB_CREATE_EXISTS
|
|
CREATE SCHEMA test;
|
|
|
|
--connection node_1
|
|
SET SESSION wsrep_sync_wait=0;
|
|
# wait for node 3 to drop from the cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
|
--source include/wait_condition.inc
|
|
|
|
--connection node_2
|
|
SET SESSION wsrep_sync_wait=0;
|
|
# wait for node 3 to drop from the cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
|
--source include/wait_condition.inc
|
|
|
|
--connection node_3
|
|
SET SESSION wsrep_sync_wait=0;
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Disconnected' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
|
--source include/wait_condition.inc
|
|
|
|
# need to reinitialize connection due to a "Bad handshake" bug
|
|
--disconnect node_3
|
|
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
|
|
|
|
# reconnect node 3, since it failed
|
|
--source include/kill_galera.inc
|
|
--source include/wait_until_disconnected.inc
|
|
--source include/start_mysqld.inc
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
|
--source include/wait_condition.inc
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
|
|
--source include/wait_condition.inc
|
|
|
|
CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on (.*) is inconsistent with group\\. Leaving cluster\\.");
|
|
|
|
# Restore original auto_increment_offset values.
|
|
--source ../galera/include/auto_increment_offset_restore.inc
|