mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
379 lines
11 KiB
Text
379 lines
11 KiB
Text
--source include/galera_cluster.inc
|
|
--source include/big_test.inc
|
|
--source include/force_restart.inc
|
|
|
|
#
|
|
# Testing gtid consistency in 3 node cluster when nodes drop
|
|
# and join back to cluster.
|
|
# The tests verify that wsrep_gtid_domain_id and gtid_binlog_pos
|
|
# remains same across the cluster
|
|
# In the configuration, nodes have different wsrep_gtid_domain_id
|
|
# but all nodes are supposed to receive effective domain id
|
|
# from the bootstrap node (node_1), and use it
|
|
#
|
|
--connect node_3, 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
|
|
|
|
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
|
set wsrep_sync_wait=0;
|
|
--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
|
set wsrep_sync_wait=0;
|
|
|
|
--connection node_1
|
|
DELIMITER |;
|
|
CREATE PROCEDURE insert_row (IN node varchar(10), IN repeat_count int)
|
|
BEGIN
|
|
DECLARE current_num int;
|
|
SET current_num = 0;
|
|
WHILE current_num < repeat_count do
|
|
INSERT INTO t1(node, name) VALUES (node, UUID());
|
|
SET current_num = current_num + 1;
|
|
END WHILE;
|
|
END|
|
|
DELIMITER ;|
|
|
|
|
CREATE TABLE t1 (id bigint not null primary key auto_increment, node VARCHAR(10), name VARCHAR(64)) ENGINE=innodb;
|
|
|
|
#
|
|
# report initial gtid positions after table t1 is created
|
|
#
|
|
--echo # node_1
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_2
|
|
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # node_2
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_3
|
|
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # node_3
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
###########################################
|
|
# scenario: join node 2 by SST
|
|
##########################################
|
|
|
|
#
|
|
# start concurrent insert load and stop node2 while the load is on
|
|
#
|
|
--connection node_1
|
|
--send CALL insert_row('node1', 500);
|
|
|
|
--connection node_2
|
|
--send CALL insert_row('node2', 500);
|
|
|
|
--connection node_3
|
|
--send CALL insert_row('node3', 500);
|
|
|
|
#
|
|
# stop load to node 2 and shutdown the node, force SST
|
|
#
|
|
--connection node_2
|
|
--reap
|
|
|
|
--echo # Shutdown node_2, force SST
|
|
--connection node_2b
|
|
--source include/shutdown_mysqld.inc
|
|
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
|
|
|
|
--echo # Wait until node_2 leaves cluster
|
|
--connection node_1b
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
|
|
#
|
|
# stop the remaining load to node 1 and 3
|
|
#
|
|
--connection node_1
|
|
--reap
|
|
--connection node_3
|
|
--reap
|
|
|
|
#
|
|
# some more inserts and DDL to nodes 1 and 3
|
|
# while node 2 is absent
|
|
#
|
|
--connection node_1
|
|
CALL insert_row('node1', 100);
|
|
|
|
--connection node_3
|
|
CALL insert_row('node3', 100);
|
|
|
|
CREATE TABLE t2(i int primary key) engine=innodb;
|
|
|
|
#
|
|
# restart node 2, should join by SST
|
|
#
|
|
--connection node_2
|
|
--echo # Restart node_2
|
|
--source include/start_mysqld.inc
|
|
|
|
--connection node_1b
|
|
--echo # Wait until node_2 is back in cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # node2 has joined
|
|
|
|
#
|
|
# check gtid positions in all nodes
|
|
#
|
|
--echo # GTID in node1
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_2
|
|
--echo # GTID in node2
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_3
|
|
--echo # GTID in node3
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
|
|
###########################################
|
|
# scenario: join node 3 by IST
|
|
##########################################
|
|
|
|
--echo # Shutdown node_3
|
|
--connection node_3
|
|
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
|
|
|
|
--echo # Wait until node_3 leaves cluster
|
|
--connection node_1b
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
|
|
#
|
|
# do some inserts and DDL to node 1
|
|
# while node 3 is absent
|
|
#
|
|
--connection node_1
|
|
CALL insert_row('node1', 50);
|
|
|
|
CREATE TABLE t3(i int primary key) engine=innodb;
|
|
|
|
#
|
|
# remove isolation in node 3, should join by IST
|
|
#
|
|
--connection node_3
|
|
--echo # Rejoin node_3
|
|
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
|
|
|
|
--connection node_1b
|
|
--echo # Wait until node_3 is back in cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # node3 has joined
|
|
|
|
#
|
|
# check gtid positions in all nodes
|
|
#
|
|
--connection node_1
|
|
--echo # GTID in node1
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_2
|
|
--echo # GTID in node2
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_3
|
|
--echo # GTID in node3
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
|
|
###########################################
|
|
# scenario: restart full custer
|
|
##########################################
|
|
|
|
|
|
#
|
|
# stop all nodes, one by one
|
|
#
|
|
--echo # One by one shutdown all nodes
|
|
--connection node_3
|
|
--echo # shutdown node_3
|
|
--source include/shutdown_mysqld.inc
|
|
--remove_file $MYSQLTEST_VARDIR/mysqld.3/data/grastate.dat
|
|
|
|
--connection node_2
|
|
--echo # wait until node_3 is out of cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
--echo # shutdown node_2
|
|
--source include/shutdown_mysqld.inc
|
|
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
|
|
|
|
--connection node_1
|
|
--echo # wait until node_2 is out of cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
--echo # shutdown node_1
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
#
|
|
# bootstap cluster in order node1 - node2 - node3
|
|
# send some inserts and DDL after each node started
|
|
#
|
|
|
|
--echo # Bootstrap from node_1
|
|
--connection node_1
|
|
--let $restart_parameters = --wsrep_new_cluster
|
|
--source include/start_mysqld.inc
|
|
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
|
--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
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
|
|
--source include/wait_condition.inc
|
|
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
ANALYZE TABLE t2;
|
|
--send CALL insert_row('node1', 100);
|
|
|
|
--echo # Restart node_2
|
|
--connection node_2
|
|
--let $restart_parameters =
|
|
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
|
--source include/start_mysqld.inc
|
|
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
|
--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
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
|
|
--source include/wait_condition.inc
|
|
|
|
#
|
|
# connection node_1b may not be functional anymore, after node was
|
|
# shutdown, open node_1c for controlling node 1 state
|
|
#
|
|
--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
|
set wsrep_sync_wait=0;
|
|
--connection node_1c
|
|
--echo # wait until node_1 and node_2 are in cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
|
|
--connection node_2
|
|
ALTER TABLE t2 ADD COLUMN (k int);
|
|
--send CALL insert_row('node2', 100);
|
|
|
|
|
|
--echo # Restart node_3
|
|
--connection node_3
|
|
--let $restart_parameters =
|
|
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.3.expect
|
|
--source include/start_mysqld.inc
|
|
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
|
--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
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
--connection node_1c
|
|
--echo # wait until all nodes are back in cluster
|
|
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
|
--source include/wait_condition.inc
|
|
--echo after cluster restart
|
|
|
|
# stop load for nodes 1 and 2
|
|
--connection node_2
|
|
--reap
|
|
|
|
--connection node_1
|
|
--reap
|
|
|
|
#
|
|
# check gtid positions in all nodes
|
|
#
|
|
--connection node_1
|
|
--echo node1 GTID
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_2
|
|
--echo node2 GTID
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
--connection node_3
|
|
--echo node3 GTID
|
|
show variables like 'wsrep_gtid_domain_id';
|
|
show variables like '%gtid_binlog_pos%';
|
|
|
|
#
|
|
# check table size in all nodes
|
|
#
|
|
--connection node_1
|
|
--echo table size in node1
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
--connection node_2
|
|
--echo table size in node2
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
--connection node_3
|
|
--echo table size in node3
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
#
|
|
# cleanups
|
|
#
|
|
--connection node_2
|
|
call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node");
|
|
call mtr.add_suppression("Sending JOIN failed: ");
|
|
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST");
|
|
call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration");
|
|
--connection node_3
|
|
call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node");
|
|
call mtr.add_suppression("Sending JOIN failed: ");
|
|
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST");
|
|
call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration");
|
|
|
|
--echo # cleanup
|
|
--connection node_1
|
|
call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration");
|
|
|
|
DROP PROCEDURE insert_row;
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t3;
|
|
|
|
--connection node_3
|
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't3'
|
|
--source include/wait_condition.inc
|
|
--connection node_2
|
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't3'
|
|
--source include/wait_condition.inc
|
|
|
|
# Restore original auto_increment_offset values.
|
|
--let $galera_cluster_size=3
|
|
--source ../galera/include/auto_increment_offset_restore.inc
|
|
|
|
--disconnect node_3
|
|
--disconnect node_2b
|
|
--disconnect node_1b
|
|
--disconnect node_1c
|