polardbxengine/mysql-test/suite/group_replication/t/gr_clone_integration_basics...

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