177 lines
6.1 KiB
Plaintext
177 lines
6.1 KiB
Plaintext
###############################################################################
|
|
# This test verifies that if the missing transactions on a joining members are
|
|
# above threshold the server will use clone as its recovery strategy
|
|
#
|
|
# 0. The test requires two servers: M1 and M2.
|
|
# 1. Install the clone plugin on server 1
|
|
# 2. Bootstrap server1 and add some data
|
|
# 3. Restart server 2 with a monitoring process (mysqld_safe) if needed
|
|
# 4. Setup the server so group replication starts on boot
|
|
# Install the clone plugin
|
|
# 5. Verify clone must not override joiner data.
|
|
# 6. On a empty server2 start group replication
|
|
# Wait for it to restart and come back
|
|
# Check clone was completed
|
|
# 7. Clone is not allowed on user sessions on group members.
|
|
# 8. Cleanup
|
|
#
|
|
|
|
--source include/have_mysqld_monitoring_process.inc
|
|
--source include/have_clone_plugin.inc
|
|
--source include/force_restart.inc
|
|
--source include/have_group_replication_plugin.inc
|
|
--let $rpl_skip_group_replication_start= 1
|
|
--source include/group_replication.inc
|
|
|
|
# Validate plugins
|
|
--let plugins = CLONE_PLUGIN,GROUP_REPLICATION
|
|
--source include/check_plugin_dir.inc
|
|
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 1. Install clone plugin on server1.
|
|
|
|
--let $rpl_connection_name= server1
|
|
--source include/rpl_connection.inc
|
|
--let $server1_port= `SELECT @@GLOBAL.PORT`
|
|
|
|
--replace_result $CLONE_PLUGIN CLONE_PLUGIN
|
|
--eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN'
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 2. Bootstrap server1 and add some data
|
|
|
|
--source include/start_and_bootstrap_group_replication.inc
|
|
|
|
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t1 VALUES (2);
|
|
|
|
--echo
|
|
--echo #######################################################################
|
|
--echo # 3. Restart server 2 with a monitoring process (mysqld_safe) if needed
|
|
|
|
--let $rpl_connection_name= server2
|
|
--source include/rpl_connection.inc
|
|
|
|
--let $_group_replication_local_address= `SELECT @@GLOBAL.group_replication_local_address`
|
|
--let $_group_replication_group_seeds= `SELECT @@GLOBAL.group_replication_group_seeds`
|
|
|
|
--let $plugin_list= $GROUP_REPLICATION
|
|
--source include/spawn_monitoring_process.inc
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 4. Setup the server so group replication starts on boot
|
|
--echo # Install the Clone plugin
|
|
|
|
--disable_query_log
|
|
--eval SET PERSIST group_replication_group_name= "$group_replication_group_name"
|
|
--eval SET PERSIST group_replication_local_address= "$_group_replication_local_address"
|
|
--eval SET PERSIST group_replication_group_seeds= "$_group_replication_group_seeds"
|
|
|
|
SET PERSIST group_replication_start_on_boot= ON;
|
|
--enable_query_log
|
|
|
|
--replace_result $CLONE_PLUGIN CLONE_PLUGIN
|
|
--eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN'
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 5. Verify clone must not override joiner data.
|
|
--echo # Joiner must fail to join the group.
|
|
|
|
--let $_group_replication_threshold_save= `SELECT @@GLOBAL.group_replication_clone_threshold`
|
|
SET GLOBAL group_replication_clone_threshold= 1;
|
|
|
|
--let $errand_transaction_uuid= aaabaaab-bbbb-aaaa-bbbb-aaabaaabaaab
|
|
|
|
--eval SET GTID_NEXT= "$errand_transaction_uuid:1"
|
|
CREATE TABLE t2 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
|
SET GTID_NEXT= "AUTOMATIC";
|
|
|
|
--let $assert_text= The member shall contain a local transaction
|
|
--let $assert_cond= "[SELECT @@GLOBAL.GTID_EXECUTED]" = "$errand_transaction_uuid:1";
|
|
--source include/assert.inc
|
|
|
|
--error ER_GROUP_REPLICATION_CONFIGURATION
|
|
START GROUP_REPLICATION;
|
|
|
|
#For precaution, wait for server 2 to leave before joining again.
|
|
--let $rpl_connection_name= server1
|
|
--source include/rpl_connection.inc
|
|
|
|
--let $group_replication_number_of_members= 1
|
|
--source include/gr_wait_for_number_of_members.inc
|
|
|
|
--let $rpl_connection_name= server2
|
|
--source include/rpl_connection.inc
|
|
|
|
DROP TABLE t2;
|
|
RESET MASTER;
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 6. On a empty server2 start group replication
|
|
--echo # Wait for it to restart and come back
|
|
--echo # Check clone was completed
|
|
|
|
SET GLOBAL group_replication_clone_threshold= 1;
|
|
|
|
START GROUP_REPLICATION;
|
|
|
|
--source include/wait_until_disconnected.inc
|
|
|
|
--let $rpl_server_number= 2
|
|
--source include/rpl_reconnect.inc
|
|
|
|
--let $group_replication_member_state=ONLINE
|
|
--source include/gr_wait_for_member_state.inc
|
|
|
|
--let $assert_text= Clone must be completed
|
|
--let $assert_cond= [SELECT state="Completed" FROM performance_schema.clone_status] = 1;
|
|
--source include/assert.inc
|
|
|
|
# See if the data has been properly cloned in server2
|
|
--let $diff_tables=server1:test.t1 ,server2:test.t1
|
|
--source include/diff_tables.inc
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 7. Clone is not allowed on user sessions on group members.
|
|
|
|
--replace_result $server1_port SERVER1_PORT
|
|
--eval SET GLOBAL clone_valid_donor_list='localhost:$server1_port'
|
|
--replace_result $server1_port SERVER1_PORT
|
|
--error ER_CLONE_DISALLOWED
|
|
--eval CLONE INSTANCE FROM 'root'@localhost:$server1_port IDENTIFIED BY '';
|
|
|
|
--echo
|
|
--echo ############################################################
|
|
--echo # 8. Cleanup
|
|
|
|
--eval SET GLOBAL group_replication_clone_threshold= $_group_replication_threshold_save
|
|
|
|
RESET PERSIST IF EXISTS group_replication_group_name;
|
|
RESET PERSIST IF EXISTS group_replication_local_address;
|
|
RESET PERSIST IF EXISTS group_replication_group_seeds;
|
|
RESET PERSIST IF EXISTS group_replication_start_on_boot;
|
|
|
|
DROP TABLE t1;
|
|
|
|
--source include/rpl_sync.inc
|
|
|
|
set session sql_log_bin=0;
|
|
call mtr.add_suppression(".*This member has more executed transactions *.*");
|
|
call mtr.add_suppression(".*The member contains transactions not present *.*");
|
|
call mtr.add_suppression("Due to the number of missing transactions being higher than the configured threshold of*");
|
|
call mtr.add_suppression("Clone removing all user data for provisioning: Started");
|
|
call mtr.add_suppression("Clone removing all user data for provisioning: Finished");
|
|
set session sql_log_bin=1;
|
|
|
|
--source include/clean_monitoring_process.inc
|
|
|
|
--source include/group_replication_end.inc
|