File: rpl_crash_safe_master.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (210 lines) | stat: -rw-r--r-- 7,320 bytes parent folder | download
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#
# WL#5493 & WL#5440
# Test case1 verifies if the transaction statements will not be
# binlogged and replication will work fine, but the data will
# be rolled back on master after the master restarts when setting
# DEBUG POINT before binlog to make the master crash.
# 
# Test case2 verifies if the transaction statements will be
# binlogged and replication will work fine, and the data will
# be recovered after the master restarts when setting DEBUG
# POINT after binlog, and before the date is committed to make
# the master crash.
#
# Test case3 verifies if the halfly binlogged transaction 
# statements will be trimmed from the crashed binlog file
# and the data will not be recovered successfully after
# the master restarts when setting DEBUG POINT in the
# middle of binlog to make the master crash
#
# Test case4 verifies if the halfly binlogged non-transaction
# statement will be trimmed from the crashed binlog file
# and the data will not be recovered successfully after
# the master restarts when setting DEBUG POINT in the
# middle of binlog to make the master crash.
#

-- source include/not_group_replication_plugin.inc
-- source include/not_rpl_gtid_only.inc
# Don't test this under valgrind, memory leaks will occur
-- source include/not_valgrind.inc
-- source include/have_debug.inc
-- source include/have_binlog_format_row.inc
-- source include/not_crashrep.inc
-- source include/not_have_privilege_checks_user.inc
-- source include/master-slave.inc

# Reset master
connection slave;
--source include/stop_slave.inc 

connection master;
RESET MASTER;

connection slave;
--source include/start_slave.inc

connection master;
call mtr.add_suppression("Attempting backtrace");
call mtr.add_suppression("allocated tablespace *., old maximum was 0");
call mtr.add_suppression("Error in Log_event::read_log_event()");
call mtr.add_suppression("Buffered warning: Performance schema disabled");

-- let $old_debug = `select @@global.debug`
-- let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1)
-- let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
CREATE TABLE t1(a LONGBLOB) ENGINE=INNODB;

-- echo # Test case1: Set DEBUG POINT before binlog to make
-- echo #             the master crash for transaction

-- echo # Lets stop the slave IO thread first, so that it does not timeout on
-- echo # reconnection while the master is down (it happened before on some
-- echo # slow hosts).
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave_io.inc
--connection master

BEGIN;
let $rows= 3;
WHILE($rows)
{
  INSERT INTO t1 (a) VALUES (REPEAT('a',2));
  dec $rows;
}
# Write file to make mysql-test-run.pl expect crash and restart
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--disable_query_log
eval SET SESSION debug=CONCAT(IF(LENGTH('$old_debug') > 0, "$old_debug:", ""), "d,debug,info,enter,return,crash_commit_after_prepare");
--enable_query_log
# Run the crashing query
-- error 2013
COMMIT;

-- source include/wait_until_disconnected.inc
-- enable_reconnect
-- echo # Restart the master server
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
-- source include/wait_until_connected_again.inc 
-- disable_reconnect

-- echo # Test the transaction statements will not be binlogged
-- source include/show_binlog_events.inc

--let $assert_cond= `SELECT COUNT(*) = 0 FROM t1`
--let $assert_text= On master, test the data will be rolled back after restart.
--source include/assert.inc

--connection slave
--echo # lets restart the slave io thread and check that
--echo # the slave gets synchronized again
--source include/start_slave_io.inc
--connection master

--source include/sync_slave_sql_with_master.inc
-- echo # On slave, test replication will work fine, and the data 
-- echo #           is not replicated
--let $diff_tables= master:test.t1, slave:test.t1
--source include/diff_tables.inc

connection master;
-- let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1)
-- let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
-- echo # Test case2: Set DEBUG POINT after binlog, and before the date
-- echo #             is committed to make crash for transaction

-- echo # Lets stop the slave IO thread first, so that it does not timeout on
-- echo # reconnection while the master is down (it happened before on some
-- echo # slow hosts).
--source include/sync_slave_sql_with_master.inc
--source include/stop_slave_io.inc
--connection master

BEGIN;
let $rows= 3;
WHILE($rows)
{
  INSERT INTO t1 (a) VALUES (REPEAT('a',2));
  dec $rows;
}
# Write file to make mysql-test-run.pl expect crash and restart
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--disable_query_log
eval SET SESSION debug=CONCAT(IF(LENGTH('$old_debug') > 0, "$old_debug:", ""), "d,debug,info,enter,return,crash_commit_after_log");
--enable_query_log
# Run the crashing query
-- error 2013
COMMIT;

-- source include/wait_until_disconnected.inc
-- enable_reconnect
-- echo # Restart the master server
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
-- source include/wait_until_connected_again.inc
-- disable_reconnect

-- echo # Test the transaction statements will be binlogged
-- source include/show_binlog_events.inc

--let $assert_cond= `SELECT COUNT(*) = 3 FROM t1`
--let $assert_text= On master, test the data will be recovered after the master restart.
--source include/assert.inc

--connection slave
--echo # lets restart the slave io thread and check that
--echo # the slave gets synchronized again
--source include/start_slave_io.inc
--connection master

--source include/sync_slave_sql_with_master.inc
-- echo # On slave, test replication will work fine, and the data is replicated
--let $diff_tables= master:test.t1, slave:test.t1
--source include/diff_tables.inc

connection master;
DROP TABLE t1;
--source include/sync_slave_sql_with_master.inc
-- source include/stop_slave.inc

connection master;
-- let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1)
-- let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
# Test transaction with large data inserted
CREATE TABLE t1(a LONGBLOB) ENGINE=INNODB;

-- echo # Test case3: Set DEBUG POINT in the middle of binlog to
-- echo #             make the master crash for transaction.
BEGIN;
let $rows= 24;
WHILE($rows)
{
  INSERT INTO t1 (a) VALUES (REPEAT('a',6144));
  dec $rows;
}
# Write file to make mysql-test-run.pl expect crash and restart
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--disable_query_log
eval SET SESSION debug=CONCAT(IF(LENGTH('$old_debug') > 0, "$old_debug:", ""), "d,debug,info,enter,return,half_binlogged_transaction");
--enable_query_log
# Run the crashing query
-- error 2013
COMMIT;

-- source include/wait_until_disconnected.inc
-- enable_reconnect
-- echo # Restart the master server
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
-- source include/wait_until_connected_again.inc
-- disable_reconnect

-- echo # Test the halfly binlogged transaction will be trimmed
-- echo # from the crashed binlog file
-- source include/show_binlog_events.inc

-- echo # Test the data will not be recovered successfully
-- echo # after the master restart.
SELECT COUNT(*) FROM t1;

DROP TABLE t1;
connection slave;
CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION= 0;