###############################################################################
# This test validates that while a member is recovering through clone,
# certification info garbage collection continues to happen.
#
#  0. The test requires three servers: M1, M2 and M3.
#  1. Install the clone plugin and bootstrap group
#     replication on server1.
#  2. Start group replication on server3.
#  3. Restart server 2 with a monitoring process (mysqld_safe) if needed
#  4. Install the clone plugin on server 2
#     Setup the server so group replication starts on boot
#  5. Start group replication on server 2
#     Set a debug point so it blocks during clone.
#  6. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
#     TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers.
#  7. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
#     TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers
#     after a garbage collection round.
#  8. Resume clone.
#     Check process finished and server2 is online
#  9. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
#     TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers
#     once all members are ONLNE.
# 10. Cleanup
#

--source include/big_test.inc
--source include/have_debug_sync.inc
--source include/have_clone_plugin.inc
--let $group_replication_group_name= aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
--source include/have_group_replication_plugin.inc
--let $rpl_server_count= 3
--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 the clone plugin and bootstrap group
--echo #    replication on server1.
--let $rpl_connection_name= server1
--source include/rpl_connection.inc

--replace_result $CLONE_PLUGIN CLONE_PLUGIN
--eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN'

--source include/start_and_bootstrap_group_replication.inc

CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 VALUES (0);


--echo
--echo ############################################################
--echo # 2. Start group replication on server3.
--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--source include/start_group_replication.inc


--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_address2= `SELECT @@GLOBAL.group_replication_local_address`
--let $_group_replication_group_seeds2= `SELECT @@GLOBAL.group_replication_group_seeds`

--let $plugin_list= $GROUP_REPLICATION
--source include/spawn_monitoring_process.inc


--echo ############################################################
--echo # 4. Install the clone plugin on server 2
--echo #    Setup the server so group replication starts on boot

--disable_query_log
--eval SET PERSIST group_replication_group_name= "$group_replication_group_name"
--eval SET PERSIST group_replication_local_address= "$_group_replication_local_address2"
--eval SET PERSIST group_replication_group_seeds= "$_group_replication_group_seeds2"

--let $_group_replication_start_on_boot_save = `SELECT @@GLOBAL.group_replication_start_on_boot;`
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. Start group replication on server 2
--echo #    Set a debug point so it blocks during clone.
--let $_group_replication_threshold_save= `SELECT @@GLOBAL.group_replication_clone_threshold`
SET GLOBAL group_replication_clone_threshold= 1;

SET GLOBAL clone_autotune_concurrency = OFF;
SET GLOBAL clone_max_concurrency = 1;
SET @@GLOBAL.DEBUG='+d,gr_clone_wait';

START GROUP_REPLICATION;

SET DEBUG_SYNC = 'now WAIT_FOR gr_clone_paused';


--echo
--echo ############################################################
--echo # 6. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
--echo #    TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers.
# Stop applier on server3 so that it cannot apply the transactions, thence
# its GTID_EXECUTED will not increase, thence on slow machines it will not
# feed a garbage collection round that would make the test not deterministic.
--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--source include/gr_stop_applier_sql_thread.inc

--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--disable_query_log
--let $inserts= 10
while($inserts)
{
  --eval INSERT INTO t1 VALUES ($inserts)
  --dec $inserts
}
--enable_query_log

--let $assert_text= 'Count_transactions_rows_validating must be equal to 10 on server1'
--let $assert_cond= "10" = "[SELECT Count_transactions_rows_validating FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $assert_text= 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-4 on server1'
--let $assert_cond= "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-4" = "[SELECT Transactions_committed_all_members FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $assert_text= 'Count_transactions_rows_validating must be equal to 0 on server2'
--let $assert_cond= "0" = "[SELECT Count_transactions_rows_validating FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $assert_text= 'Transactions_committed_all_members must be equal to "" on server2'
--let $assert_cond= "" = "[SELECT Transactions_committed_all_members FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--let $assert_text= 'Count_transactions_rows_validating must be equal to 10 on server3'
--let $assert_cond= "10" = "[SELECT Count_transactions_rows_validating FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $assert_text= 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-4 on server3'
--let $assert_cond= "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-4" = "[SELECT Transactions_committed_all_members FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

# Resume applier on server3.
--source include/gr_start_applier_sql_thread.inc


--echo
--echo ############################################################
--echo # 7. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
--echo #    TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers
--echo #    after a garbage collection round.
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--echo 'Count_transactions_rows_validating must be equal to 1 on server1'
--let $wait_timeout= 150
--let $wait_condition= SELECT Count_transactions_rows_validating=1 FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--echo 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-15 on server1'
--let $wait_timeout= 150
--let $wait_condition= SELECT Transactions_committed_all_members="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-15" FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--let $assert_text= 'Count_transactions_rows_validating must be equal to 0 on server2'
--let $assert_cond= "0" = "[SELECT Count_transactions_rows_validating FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $assert_text= 'Transactions_committed_all_members must be equal to "" on server2'
--let $assert_cond= "" = "[SELECT Transactions_committed_all_members FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)]"
--source include/assert.inc

--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--echo 'Count_transactions_rows_validating must be equal to 1 on server3'
--let $wait_timeout= 150
--let $wait_condition= SELECT Count_transactions_rows_validating=1 FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--echo 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-15 on server3'
--let $wait_timeout= 150
--let $wait_condition= SELECT Transactions_committed_all_members="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-15" FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc


--echo
--echo ############################################################
--echo # 8. Resume clone.
--echo #    Check process finished and server2 is online
--let $rpl_connection_name= server2
--source include/rpl_connection.inc

SET DEBUG_SYNC = 'now SIGNAL gr_clone_continue';
SET @@GLOBAL.DEBUG = '-d,gr_clone_wait';

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


--echo
--echo ############################################################
--echo # 9. Assert COUNT_TRANSACTIONS_ROWS_VALIDATING and
--echo #    TRANSACTIONS_COMMITTED_ALL_MEMBERS values on all servers
--echo #    once all members are ONLNE.
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
--echo 'Count_transactions_rows_validating must be equal to 0 on server1'
--let $wait_timeout= 150
--let $wait_condition= SELECT Count_transactions_rows_validating=0 FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--echo 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16 on server1'
--let $wait_timeout= 150
--let $wait_condition= SELECT Transactions_committed_all_members="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16" FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
--echo 'Count_transactions_rows_validating must be equal to 0 on server2'
--let $wait_timeout= 150
--let $wait_condition= SELECT Count_transactions_rows_validating=0 FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--echo 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16 on server2'
--let $wait_timeout= 150
--let $wait_condition= SELECT Transactions_committed_all_members="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16" FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--echo 'Count_transactions_rows_validating must be equal to 0 on server3'
--let $wait_timeout= 150
--let $wait_condition= SELECT Count_transactions_rows_validating=0 FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc

--echo 'Transactions_committed_all_members must be equal to aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16 on server3'
--let $wait_timeout= 150
--let $wait_condition= SELECT Transactions_committed_all_members="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-16" FROM performance_schema.replication_group_member_stats WHERE member_id IN (SELECT @@server_uuid)
--source include/wait_condition.inc


--echo
--echo ############################################################
--echo # 10. Cleanup
--let $rpl_connection_name= server1
--source include/rpl_connection.inc
DROP TABLE t1;
--source include/rpl_sync.inc

--source include/stop_group_replication.inc
UNINSTALL PLUGIN clone;

--let $rpl_connection_name= server3
--source include/rpl_connection.inc
--source include/stop_group_replication.inc

--let $rpl_connection_name= server2
--source include/rpl_connection.inc
SET DEBUG_SYNC = 'RESET';

--source include/stop_group_replication.inc
UNINSTALL PLUGIN clone;

--replace_result $_group_replication_threshold_save GROUP_REPLICATION_CLONE_THRESHOLD
--eval SET GLOBAL group_replication_clone_threshold= $_group_replication_threshold_save

RESET PERSIST group_replication_group_name;
RESET PERSIST group_replication_local_address;
RESET PERSIST group_replication_group_seeds;
RESET PERSIST group_replication_start_on_boot;

--replace_result $_group_replication_start_on_boot_save GROUP_REPLICATION_START_ON_BOOT
--eval SET GLOBAL group_replication_start_on_boot= $_group_replication_start_on_boot_save

SET SESSION sql_log_bin=0;
call mtr.add_suppression("This member will start distributed recovery using clone. It is due to the number of missing transactions being higher than the configured threshold of 1.");
call mtr.add_suppression("Clone removing all user data for provisioning: Started");
call mtr.add_suppression("Clone removing all user data for provisioning: Finished");
# server3 does not have clone plugin installed to allow the test to stop group_replication_applier channel.
call mtr.add_suppression("Internal query: CLONE INSTANCE FROM 'root'@'127.0.0.1':.* Error number: 3862");
call mtr.add_suppression("There was an issue when cloning from another server: Error number: 3862 Error message: Clone Donor Error: 1524 : Plugin 'clone' is not loaded.");
SET SESSION sql_log_bin=1;

--source include/clean_monitoring_process.inc

--source include/group_replication_end.inc
