############################################################################### # 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