1# ==== Purpose ====
2#
3# Test verifies that when an admin command execution is interrupted by KILL
4# command it should stop its execution. The admin command in binary log should
5# contain only the list of tables which have successfully executed admin
6# command prior to kill.
7#
8# ==== Implementation ====
9#
10# Steps:
11#    0 - Create two table t1,t2.
12#    1 - Execute OPTIMIZE TABLE t1,t2 command.
13#    2 - Using debug sync mechanism kill OPTIMIZE TABLE command at a stage
14#        where it has not optimized any table.
15#    3 - Check that OPTIMIZE TABLE command is not written to binary log.
16#    4 - Using debug sync mechanism hold the execution of OPTIMIZE TABLE after
17#        t1 table optimization. Now kill the OPTIMIZE TABLE command.
18#    5 - Observe the binlog output, the OPTIMIZE TABLE command should display `t1,t2`.
19#    6 - Please note that, we binlog the entire query even if at least one
20#        table is modified as admin commands are safe to replicate and they will
21#        not make the slave to diverge.
22#
23# ==== References ====
24#
25# MDEV-22530: Aborting OPTIMIZE TABLE still logs in binary log and replicates to the Slave server.
26#
27--source include/have_log_bin.inc
28--source include/have_debug.inc
29--source include/have_debug_sync.inc
30--source include/have_innodb.inc
31
32--echo #
33--echo # Kill OPTIMIZE command prior to table modification
34--echo #
35RESET MASTER;
36
37CREATE TABLE t1 (f INT) ENGINE=INNODB;
38CREATE TABLE t2 (f INT) ENGINE=INNODB;
39
40--connect(con1,127.0.0.1,root,,test,$MASTER_MYPORT,)
41--connection con1
42SET debug_sync='admin_command_kill_before_modify SIGNAL ready_to_be_killed WAIT_FOR master_cont';
43--send OPTIMIZE TABLE t1,t2
44
45--connection default
46SET debug_sync='now WAIT_FOR ready_to_be_killed';
47--let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE '%OPTIMIZE TABLE %'`
48
49# Now kill.
50--replace_result $thd_id THD_ID
51eval KILL $thd_id;
52
53SET debug_sync = 'reset';
54--disconnect con1
55
56--source include/show_binlog_events.inc
57DROP TABLE t1,t2;
58
59RESET MASTER;
60
61--echo #
62--echo # Kill OPTIMIZE command after table modification
63--echo #
64
65CREATE TABLE t1 (f INT) ENGINE=INNODB;
66CREATE TABLE t2 (f INT) ENGINE=INNODB;
67
68--connect(con1,127.0.0.1,root,,test,$MASTER_MYPORT,)
69--connection con1
70SET debug_sync='admin_command_kill_after_modify SIGNAL ready_to_be_killed WAIT_FOR master_cont';
71--send OPTIMIZE TABLE t1,t2
72
73--connection default
74SET debug_sync='now WAIT_FOR ready_to_be_killed';
75--let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE '%OPTIMIZE TABLE %'`
76
77# Now kill.
78--replace_result $thd_id THD_ID
79eval KILL $thd_id;
80
81SET debug_sync = 'reset';
82--disconnect con1
83
84--let $wait_binlog_event= OPTIMIZE
85--source include/wait_for_binlog_event.inc
86
87DROP TABLE t1,t2;
88let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
89FLUSH LOGS;
90
91--let $MYSQLD_DATADIR= `select @@datadir`
92--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$binlog_file > $MYSQLTEST_VARDIR/tmp/mysqlbinlog.out
93
94--let SEARCH_PATTERN= OPTIMIZE TABLE t1,t2
95--let SEARCH_FILE= $MYSQLTEST_VARDIR/tmp/mysqlbinlog.out
96--source include/search_pattern_in_file.inc
97
98--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.out
99