#
# Testing chain/circular replication scenario of MDEV-9670
# The effect of the bug was that we got a commit with a GTID with server_id
#

--source include/have_binlog_format_row.inc
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc

--let $rpl_topology= 1->2->1
--source include/rpl_init.inc

--let $rpl_connection_name= M4
--let $rpl_server_number= 1
--source include/rpl_connect.inc

--let $rpl_connection_name= M2
--let $rpl_server_number= 2
--source include/rpl_connect.inc

# The parameter reflects binlog-row-event-max-size @cnf.
--let $row_size=1024

SET @old_debug= @@global.debug;

--connection M2
STOP SLAVE;
SET GLOBAL debug_dbug= "+d,dbug.rows_events_to_delay_relay_logging";
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc

--connection M2
# This query also creates a Gtid event group whose Gtid will remain in
# ignored status for too long causing a following group split.

CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(30000)) ENGINE=innodb;
--sync_slave_with_master M4

# This INSERT will be logged as two Write_log events which the buggy
# slave applier would split.

--connection M4
eval INSERT INTO `t1` VALUES (null, repeat('a', $row_size)), (null, repeat('b', $row_size));

# START M2 IO thread and wait for its signal to follow with the SQL
# thread start.  At this moment the SQL thread shall be having 2 and
# "half" groups to execute.  The "hafl" one would be committed by the
# buggy applier after which the IO is released to queue the rest of
# the 3rd group which the SQL thread commits separately to complete
# the split.

--connection M2

# wait for IO signal to start the SQL thread. IO will be hanging upon that.
SET debug_sync='now WAIT_FOR start_sql_thread';

# Now the slave server has relay log whose last group is incomplete.
# An unfixed slave server would go to "insert" a "fake"
# Gtid_list_log_event event which actually would commit the incomplete
# group. However before to actual commit do_apply_event() hits some assert.
# In the fixed server the fake Gtid_list_log_event is *not* inserted
# in the middle of a group.
START SLAVE SQL_THREAD;

# Sleep for a little time to give SQL thread a chance to commit while
# the IO thread is hanging (see
# DBUG_EXECUTE_IF("dbug.rows_events_to_delay_relay_logging"...) in
# queue_event).  Alternatively to reproduce the case when buggy slave
# wait for the 1st group commit

#--let $count= 1
#--let $table= t1
#--source include/wait_until_rows_count.inc

--sleep 2

# Demonstrate either no split group in the correct slave or the 1nd
# group in the buggy one
--source include/show_binlog_events.inc

# Release the IO thread
SET debug_sync='now SIGNAL go_on_relay_logging';

# Sync servers
--sync_slave_with_master M4
--connection M4
--sync_slave_with_master M2
--connection M2

# Demonstrate replication goes correctly not to create any split, or
# the 2nd group in the buggy slave
--source include/show_binlog_events.inc

#
# Cleanup
#
--connection M4
drop table t1;

--connection M2
SET GLOBAL debug_dbug= @old_debug;
SET debug_sync='RESET';
--source include/rpl_end.inc
