summaryrefslogtreecommitdiff
path: root/mysql-test/suite/rpl/t/rpl_stop_slave.test
blob: 291524126ecf1e6bbd3cc95d438009fc2864b2d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
source include/have_innodb.inc;
source include/have_debug.inc;
source include/have_debug_sync.inc;
source include/have_binlog_format_mixed_or_statement.inc;
source include/master-slave.inc;

--echo
--echo # BUG#56118 STOP SLAVE does not wait till trx with CREATE TMP TABLE ends
--echo #
--echo # If a temporary table is created or dropped, the transaction should be
--echo # regarded similarly that a non-transactional table is modified. So 
--echo # STOP SLAVE should wait until the transaction has finished.

CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
CREATE TABLE t2(c1 INT) ENGINE=InnoDB;

sync_slave_with_master;
SET DEBUG_SYNC= 'RESET';
source include/stop_slave.inc;

--echo
--echo # Suspend the INSERT statement in current transaction on SQL thread.
--echo # It guarantees that SQL thread is applying the transaction when
--echo # STOP SLAVE command launchs.
set @old_debug=@@global.debug;
set global debug_dbug= '+d,after_mysql_insert';
source include/start_slave.inc;

--echo
--echo # CREATE TEMPORARY TABLE with InnoDB engine
--echo # -----------------------------------------
let $tmp_table_stm= CREATE TEMPORARY TABLE tt1(c1 INT) ENGINE = InnoDB;
source include/rpl_stop_slave.test;

--echo
--echo # CREATE TEMPORARY TABLE ... SELECT with InnoDB engine
--echo # ----------------------------------------------------
let $tmp_table_stm= CREATE TEMPORARY TABLE tt1(c1 INT) ENGINE = InnoDB
                    SELECT c1 FROM t2;
source include/rpl_stop_slave.test;

# Don't need to verify 'CREATE TEMPORARY TABLE' with MyIASM engine, as it
# never is binlogged into a transaction since 5.5.

--echo
--echo # Test end
--disable_query_log
set global debug_dbug= @old_debug;
--enable_query_log
source include/restart_slave_sql.inc;

connection slave;
call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
connection master;

DROP TABLE t1, t2;

--echo
--echo # Bug#58546 test rpl_packet timeout failure sporadically on PB
--echo # ----------------------------------------------------------------------
--echo # STOP SLAVE stopped IO thread first and then stopped SQL thread. It was
--echo # possible that IO thread stopped after replicating part of a transaction
--echo # which SQL thread was executing. SQL thread would be hung if the
--echo # transaction could not be rolled back safely.
--echo # It caused some sporadic failures on PB2.
--echo #
--echo # This test verifies that when 'STOP SLAVE' is issued by a user, IO
--echo # thread will continue to fetch the rest events of the transaction which
--echo # is being executed by SQL thread and is not able to be rolled back safely.

CREATE TABLE t1 (c1 INT KEY, c2 INT) ENGINE=InnoDB;
CREATE TABLE t2 (c1 INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES(1, 1);

sync_slave_with_master;
--source include/stop_slave.inc

connection master;
# make sure that there are no zombie threads
--source include/stop_dump_threads.inc

set @old_debug=@@global.debug;
set global debug_dbug= '+d,dump_thread_wait_before_send_xid';

connection slave;
--source include/start_slave.inc

BEGIN;
UPDATE t1 SET c2 = 2 WHERE c1 = 1;

connection master;
BEGIN;
INSERT INTO t1 VALUES(2, 2);
INSERT INTO t2 VALUES(1);
UPDATE t1 SET c2 = 3 WHERE c1 = 1;
COMMIT;

# wait for the dump thread reach the sync point
--let $wait_condition= select count(*)=1 from information_schema.processlist where state LIKE '%debug sync point%' and command='Binlog Dump'
--source include/wait_condition.inc

connection slave1;
let $show_statement= SHOW PROCESSLIST;
let $field= Info;
let $condition= = 'UPDATE t1 SET c2 = 3 WHERE c1 = 1';
source include/wait_show_condition.inc;

send STOP SLAVE;

connection slave;
ROLLBACK;

connection master;

SET DEBUG_SYNC= 'now SIGNAL signal.continue';
SET DEBUG_SYNC= 'now WAIT_FOR signal.continued';

connection slave;
source include/wait_for_slave_to_stop.inc;

connection slave1;
reap;

# Slave has stopped, thence lets make sure that
# we kill the zombie dump threads. Also, make
# sure that we disable the DBUG_EXECUTE_IF
# that would set the dump thread to wait
connection master;
--disable_query_log
set global debug_dbug= @old_debug;
--enable_query_log
# make sure that there are no zombie threads
--source include/stop_dump_threads.inc

connection slave1;
# now the dump thread on the master will start
# from a clean slate, i.e. without the
# DBUG_EXECUTE_IF set
source include/start_slave.inc;

connection master;
DROP TABLE t1, t2;
--source include/rpl_end.inc
SET DEBUG_SYNC= 'RESET';