17 changed files with 962 additions and 73 deletions
-
21mysql-test/include/io_thd_fault_injection.inc
-
6mysql-test/include/restart_mysqld.inc
-
36mysql-test/suite/binlog/r/binlog_index.result
-
26mysql-test/suite/binlog/t/binlog_index.test
-
274mysql-test/suite/rpl/r/rpl_binlog_errors.result
-
1mysql-test/suite/rpl/t/rpl_binlog_errors-master.opt
-
413mysql-test/suite/rpl/t/rpl_binlog_errors.test
-
6sql/handler.cc
-
156sql/log.cc
-
16sql/log.h
-
2sql/mysql_priv.h
-
2sql/mysqld.cc
-
6sql/rpl_injector.cc
-
11sql/slave.cc
-
2sql/slave.h
-
7sql/sql_load.cc
-
50sql/sql_parse.cc
@ -0,0 +1,21 @@ |
|||
# |
|||
# Takes the flag as an argument: |
|||
# -- let $io_thd_injection_fault_flag=+d,fault_injection_new_file_rotate_event |
|||
# -- source include/io_thd_fault_injection.inc |
|||
# |
|||
|
|||
SET @old_debug=@@global.debug; |
|||
-- disable_warnings |
|||
-- source include/stop_slave.inc |
|||
-- enable_warnings |
|||
-- eval SET GLOBAL debug="+d,$io_thd_injection_fault_flag" |
|||
|
|||
START SLAVE io_thread; |
|||
-- source include/wait_for_slave_io_to_stop.inc |
|||
-- source include/wait_for_slave_io_error.inc |
|||
|
|||
-- eval SET GLOBAL debug="-d,$io_thd_injection_fault_flag" |
|||
SET GLOBAL debug=@old_debug; |
|||
|
|||
# restart because slave is in bad shape |
|||
-- source include/restart_mysqld.inc |
|||
@ -0,0 +1,274 @@ |
|||
stop slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
reset master; |
|||
reset slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
start slave; |
|||
####################################################################### |
|||
####################### PART 1: MASTER TESTS ########################## |
|||
####################################################################### |
|||
include/stop_slave.inc |
|||
call mtr.add_suppression("Can't generate a unique log-filename"); |
|||
call mtr.add_suppression("Writing one row to the row-based binary log failed.*"); |
|||
call mtr.add_suppression("Error writing file .*"); |
|||
SET @old_debug= @@global.debug; |
|||
SELECT repeat('x',8192) INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data'; |
|||
SELECT repeat('x',10) INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug_46166-2.data'; |
|||
RESET MASTER; |
|||
###################### TEST #1 |
|||
FLUSH LOGS; |
|||
# assert: must show two binlogs |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin.000001 # |
|||
master-bin.000002 # |
|||
###################### TEST #2 |
|||
RESET MASTER; |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
FLUSH LOGS; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# assert: must show one binlog |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin.000001 # |
|||
SET GLOBAL debug=""; |
|||
RESET MASTER; |
|||
###################### TEST #3 |
|||
CREATE TABLE t1 (a int); |
|||
CREATE TABLE t2 (a TEXT) Engine=InnoDB; |
|||
CREATE TABLE t4 (a TEXT); |
|||
INSERT INTO t1 VALUES (1); |
|||
RESET MASTER; |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2; |
|||
# assert: must show two binlog |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin.000001 # |
|||
master-bin.000002 # |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
###################### TEST #4 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# assert: must show one entry |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
1 |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
###################### TEST #5 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166-2.data' INTO TABLE t2; |
|||
# assert: must show one entry |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
1 |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
###################### TEST #6 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SET AUTOCOMMIT=0; |
|||
INSERT INTO t2 VALUES ('muse'); |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2; |
|||
INSERT INTO t2 VALUES ('muse'); |
|||
COMMIT; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# assert: must show three entries |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
3 |
|||
SET AUTOCOMMIT= 1; |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
###################### TEST #7 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
0 |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t4; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# assert: must show 1 entry |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
1 |
|||
### check that the incident event is written to the current log |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
FLUSH LOGS; |
|||
SHOW BINLOG EVENTS IN 'BINLOG_FILE' FROM <binlog_start> LIMIT 1; |
|||
Log_name Pos Event_type Server_id End_log_pos Info |
|||
BINLOG_FILE # Incident # # #1 (LOST_EVENTS) |
|||
DELETE FROM t4; |
|||
RESET MASTER; |
|||
###################### TEST #8 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
# must show 0 entries |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
0 |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
0 |
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t4; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'); |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# INFO: Count(*) Before Offending DELETEs |
|||
# assert: must show 1 entry |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
1 |
|||
# assert: must show 4 entries |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
4 |
|||
DELETE FROM t4; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
DELETE FROM t2; |
|||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999) |
|||
|
|||
# INFO: Count(*) After Offending DELETEs |
|||
# assert: must show zero entries |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
0 |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
0 |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
###################### TEST #9 |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SET SQL_LOG_BIN=0; |
|||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'), ('ddd'); |
|||
INSERT INTO t4 VALUES ('eee'), ('fff'), ('ggg'), ('hhh'); |
|||
# assert: must show four entries |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
4 |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
4 |
|||
DELETE FROM t2; |
|||
DELETE FROM t4; |
|||
# assert: must show zero entries |
|||
SELECT count(*) FROM t2; |
|||
count(*) |
|||
0 |
|||
SELECT count(*) FROM t4; |
|||
count(*) |
|||
0 |
|||
SET SQL_LOG_BIN=1; |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
###################### TEST #10 |
|||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file."); |
|||
call mtr.add_suppression("Could not open .*"); |
|||
RESET MASTER; |
|||
SHOW WARNINGS; |
|||
Level Code Message |
|||
SET GLOBAL debug="+d,fault_injection_registering_index"; |
|||
FLUSH LOGS; |
|||
ERROR HY000: Can't open file: './master-bin.000002' (errno: 1) |
|||
SET GLOBAL debug="-d,fault_injection_registering_index"; |
|||
SHOW BINARY LOGS; |
|||
ERROR HY000: You are not using binary logging |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
###################### TEST #11 |
|||
SET GLOBAL debug="+d,fault_injection_openning_index"; |
|||
FLUSH LOGS; |
|||
ERROR HY000: Can't open file: './master-bin.index' (errno: 1) |
|||
SET GLOBAL debug="-d,fault_injection_openning_index"; |
|||
RESET MASTER; |
|||
ERROR HY000: Binlog closed, cannot RESET MASTER |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
###################### TEST #12 |
|||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event"; |
|||
FLUSH LOGS; |
|||
ERROR HY000: Can't open file: 'master-bin' (errno: 0) |
|||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event"; |
|||
RESET MASTER; |
|||
ERROR HY000: Binlog closed, cannot RESET MASTER |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
SET GLOBAL debug= @old_debug; |
|||
DROP TABLE t1, t2, t4; |
|||
RESET MASTER; |
|||
include/start_slave.inc |
|||
####################################################################### |
|||
####################### PART 2: SLAVE TESTS ########################### |
|||
####################################################################### |
|||
stop slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
reset master; |
|||
reset slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
start slave; |
|||
call mtr.add_suppression("Slave I/O: Relay log write failure: could not queue event from master.*"); |
|||
call mtr.add_suppression("Error writing file .*"); |
|||
call mtr.add_suppression("Could not open .*"); |
|||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file."); |
|||
call mtr.add_suppression("Can't generate a unique log-filename .*"); |
|||
###################### TEST #13 |
|||
SET @old_debug=@@global.debug; |
|||
include/stop_slave.inc |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
START SLAVE io_thread; |
|||
Last_IO_Error = Relay log write failure: could not queue event from master |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
SET GLOBAL debug=@old_debug; |
|||
###################### TEST #14 |
|||
SET @old_debug=@@global.debug; |
|||
include/stop_slave.inc |
|||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event"; |
|||
START SLAVE io_thread; |
|||
Last_IO_Error = Relay log write failure: could not queue event from master |
|||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event"; |
|||
SET GLOBAL debug=@old_debug; |
|||
###################### TEST #15 |
|||
SET @old_debug=@@global.debug; |
|||
include/stop_slave.inc |
|||
SET GLOBAL debug="+d,fault_injection_registering_index"; |
|||
START SLAVE io_thread; |
|||
Last_IO_Error = Relay log write failure: could not queue event from master |
|||
SET GLOBAL debug="-d,fault_injection_registering_index"; |
|||
SET GLOBAL debug=@old_debug; |
|||
###################### TEST #16 |
|||
SET @old_debug=@@global.debug; |
|||
include/stop_slave.inc |
|||
SET GLOBAL debug="+d,fault_injection_openning_index"; |
|||
START SLAVE io_thread; |
|||
Last_IO_Error = Relay log write failure: could not queue event from master |
|||
SET GLOBAL debug="-d,fault_injection_openning_index"; |
|||
SET GLOBAL debug=@old_debug; |
|||
include/stop_slave.inc |
|||
SET GLOBAL debug=@old_debug; |
|||
RESET SLAVE; |
|||
RESET MASTER; |
|||
include/start_slave.inc |
|||
@ -0,0 +1 @@ |
|||
--max_binlog_size=4096 |
|||
@ -0,0 +1,413 @@ |
|||
# BUG#46166: MYSQL_BIN_LOG::new_file_impl is not propagating error |
|||
# when generating new name. |
|||
# |
|||
# WHY |
|||
# === |
|||
# |
|||
# We want to check whether error is reported or not when |
|||
# new_file_impl fails (this may happen when rotation is not |
|||
# possible because there is some problem finding an |
|||
# unique filename). |
|||
# |
|||
# HOW |
|||
# === |
|||
# |
|||
# Test cases are documented inline. |
|||
|
|||
-- source include/master-slave.inc |
|||
-- source include/have_innodb.inc |
|||
-- source include/have_debug.inc |
|||
|
|||
-- echo ####################################################################### |
|||
-- echo ####################### PART 1: MASTER TESTS ########################## |
|||
-- echo ####################################################################### |
|||
|
|||
|
|||
### ACTION: stopping slave as it is not needed for the first part of |
|||
### the test |
|||
|
|||
-- connection slave |
|||
-- source include/stop_slave.inc |
|||
-- connection master |
|||
|
|||
call mtr.add_suppression("Can't generate a unique log-filename"); |
|||
call mtr.add_suppression("Writing one row to the row-based binary log failed.*"); |
|||
call mtr.add_suppression("Error writing file .*"); |
|||
|
|||
SET @old_debug= @@global.debug; |
|||
|
|||
### ACTION: create a large file (> 4096 bytes) that will be later used |
|||
### in LOAD DATA INFILE to check binlog errors in its vacinity |
|||
-- let $load_file= $MYSQLTEST_VARDIR/tmp/bug_46166.data |
|||
-- let $MYSQLD_DATADIR= `select @@datadir` |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- eval SELECT repeat('x',8192) INTO OUTFILE '$load_file' |
|||
|
|||
### ACTION: create a small file (< 4096 bytes) that will be later used |
|||
### in LOAD DATA INFILE to check for absence of binlog errors |
|||
### when file loading this file does not force flushing and |
|||
### rotating the binary log |
|||
-- let $load_file2= $MYSQLTEST_VARDIR/tmp/bug_46166-2.data |
|||
-- let $MYSQLD_DATADIR= `select @@datadir` |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- eval SELECT repeat('x',10) INTO OUTFILE '$load_file2' |
|||
|
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #1 |
|||
|
|||
### ASSERTION: no problem flushing logs (should show two binlogs) |
|||
FLUSH LOGS; |
|||
-- echo # assert: must show two binlogs |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
-- echo ###################### TEST #2 |
|||
|
|||
### ASSERTION: check that FLUSH LOGS actually fails and reports |
|||
### failure back to the user if find_uniq_filename fails |
|||
### (should show just one binlog) |
|||
|
|||
RESET MASTER; |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
FLUSH LOGS; |
|||
-- echo # assert: must show one binlog |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
### ACTION: clean up and move to next test |
|||
SET GLOBAL debug=""; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #3 |
|||
|
|||
### ACTION: create some tables (t1, t2, t4) and insert some values in |
|||
### table t1 |
|||
CREATE TABLE t1 (a int); |
|||
CREATE TABLE t2 (a TEXT) Engine=InnoDB; |
|||
CREATE TABLE t4 (a TEXT); |
|||
INSERT INTO t1 VALUES (1); |
|||
RESET MASTER; |
|||
|
|||
### ASSERTION: we force rotation of the binary log because it exceeds |
|||
### the max_binlog_size option (should show two binary |
|||
### logs) |
|||
|
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2 |
|||
|
|||
# shows two binary logs |
|||
-- echo # assert: must show two binlog |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
# clean up the table and the binlog to be used in next part of test |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #4 |
|||
|
|||
### ASSERTION: load the big file into a transactional table and check |
|||
### that it reports error. The table will contain the |
|||
### changes performed despite the fact that it reported an |
|||
### error. |
|||
|
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2 |
|||
|
|||
# show table |
|||
-- echo # assert: must show one entry |
|||
SELECT count(*) FROM t2; |
|||
|
|||
# clean up the table and the binlog to be used in next part of test |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #5 |
|||
|
|||
### ASSERTION: load the small file into a transactional table and |
|||
### check that it succeeds |
|||
|
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- eval LOAD DATA INFILE '$load_file2' INTO TABLE t2 |
|||
|
|||
# show table |
|||
-- echo # assert: must show one entry |
|||
SELECT count(*) FROM t2; |
|||
|
|||
# clean up the table and the binlog to be used in next part of test |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #6 |
|||
|
|||
### ASSERTION: check that even if one is using a transactional table |
|||
### and explicit transactions (no autocommit) if rotation |
|||
### fails we get the error. Transaction is not rolledback |
|||
### because rotation happens after the commit. |
|||
|
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SET AUTOCOMMIT=0; |
|||
INSERT INTO t2 VALUES ('muse'); |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2 |
|||
INSERT INTO t2 VALUES ('muse'); |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
COMMIT; |
|||
|
|||
### ACTION: Show the contents of the table after the test |
|||
-- echo # assert: must show three entries |
|||
SELECT count(*) FROM t2; |
|||
|
|||
### ACTION: clean up and move to the next test |
|||
SET AUTOCOMMIT= 1; |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
DELETE FROM t2; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #7 |
|||
|
|||
### ASSERTION: check that on a non-transactional table, if rotation |
|||
### fails then an error is reported and an incident event |
|||
### is written to the current binary log. |
|||
|
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SELECT count(*) FROM t4; |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t4 |
|||
|
|||
-- echo # assert: must show 1 entry |
|||
SELECT count(*) FROM t4; |
|||
|
|||
-- echo ### check that the incident event is written to the current log |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
-- let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1) |
|||
-- let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1) |
|||
|
|||
# 53 is the size of the incident event, so we start from 22 bytes before the |
|||
# current position |
|||
-- let $binlog_start = `SELECT $binlog_start - 53` |
|||
FLUSH LOGS; |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR $binlog_start <binlog_start> $binlog_file BINLOG_FILE |
|||
-- replace_column 2 # 4 # 5 # |
|||
-- eval SHOW BINLOG EVENTS IN '$binlog_file' FROM $binlog_start LIMIT 1 |
|||
|
|||
# clean up and move to next test |
|||
DELETE FROM t4; |
|||
RESET MASTER; |
|||
|
|||
-- echo ###################### TEST #8 |
|||
|
|||
### ASSERTION: check that statements end up in error but they succeed |
|||
### on changing the data. |
|||
|
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
-- echo # must show 0 entries |
|||
SELECT count(*) FROM t4; |
|||
SELECT count(*) FROM t2; |
|||
|
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t4 |
|||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2 |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'); |
|||
|
|||
-- echo # INFO: Count(*) Before Offending DELETEs |
|||
-- echo # assert: must show 1 entry |
|||
SELECT count(*) FROM t4; |
|||
-- echo # assert: must show 4 entries |
|||
SELECT count(*) FROM t2; |
|||
|
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
DELETE FROM t4; |
|||
-- error ER_NO_UNIQUE_LOGFILE |
|||
DELETE FROM t2; |
|||
|
|||
-- echo # INFO: Count(*) After Offending DELETEs |
|||
-- echo # assert: must show zero entries |
|||
SELECT count(*) FROM t4; |
|||
SELECT count(*) FROM t2; |
|||
|
|||
# remove fault injection |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
|
|||
-- echo ###################### TEST #9 |
|||
|
|||
### ASSERTION: check that if we disable binlogging, then statements |
|||
### succeed. |
|||
SET GLOBAL debug="+d,error_unique_log_filename"; |
|||
SET SQL_LOG_BIN=0; |
|||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'), ('ddd'); |
|||
INSERT INTO t4 VALUES ('eee'), ('fff'), ('ggg'), ('hhh'); |
|||
-- echo # assert: must show four entries |
|||
SELECT count(*) FROM t2; |
|||
SELECT count(*) FROM t4; |
|||
DELETE FROM t2; |
|||
DELETE FROM t4; |
|||
-- echo # assert: must show zero entries |
|||
SELECT count(*) FROM t2; |
|||
SELECT count(*) FROM t4; |
|||
SET SQL_LOG_BIN=1; |
|||
SET GLOBAL debug="-d,error_unique_log_filename"; |
|||
|
|||
-- echo ###################### TEST #10 |
|||
|
|||
### ASSERTION: check that error is reported if there is a failure |
|||
### while registering the index file and the binary log |
|||
### file or failure to write the rotate event. |
|||
|
|||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file."); |
|||
call mtr.add_suppression("Could not open .*"); |
|||
|
|||
RESET MASTER; |
|||
SHOW WARNINGS; |
|||
|
|||
# +d,fault_injection_registering_index => injects fault on MYSQL_BIN_LOG::open |
|||
SET GLOBAL debug="+d,fault_injection_registering_index"; |
|||
-- error ER_CANT_OPEN_FILE |
|||
FLUSH LOGS; |
|||
SET GLOBAL debug="-d,fault_injection_registering_index"; |
|||
|
|||
-- error ER_NO_BINARY_LOGGING |
|||
SHOW BINARY LOGS; |
|||
|
|||
# issue some statements and check that they don't fail |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
|
|||
-- echo ###################### TEST #11 |
|||
|
|||
### ASSERTION: check that error is reported if there is a failure |
|||
### while opening the index file and the binary log file or |
|||
### failure to write the rotate event. |
|||
|
|||
# restart the server so that we have binlog again |
|||
--source include/restart_mysqld.inc |
|||
|
|||
# +d,fault_injection_openning_index => injects fault on MYSQL_BIN_LOG::open_index_file |
|||
SET GLOBAL debug="+d,fault_injection_openning_index"; |
|||
-- error ER_CANT_OPEN_FILE |
|||
FLUSH LOGS; |
|||
SET GLOBAL debug="-d,fault_injection_openning_index"; |
|||
|
|||
-- error ER_FLUSH_MASTER_BINLOG_CLOSED |
|||
RESET MASTER; |
|||
|
|||
# issue some statements and check that they don't fail |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
|
|||
# restart the server so that we have binlog again |
|||
-- source include/restart_mysqld.inc |
|||
|
|||
-- echo ###################### TEST #12 |
|||
|
|||
### ASSERTION: check that error is reported if there is a failure |
|||
### while writing the rotate event when creating a new log |
|||
### file. |
|||
|
|||
# +d,fault_injection_new_file_rotate_event => injects fault on MYSQL_BIN_LOG::MYSQL_BIN_LOG::new_file_impl |
|||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event"; |
|||
-- error ER_ERROR_ON_WRITE |
|||
FLUSH LOGS; |
|||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event"; |
|||
|
|||
-- error ER_FLUSH_MASTER_BINLOG_CLOSED |
|||
RESET MASTER; |
|||
|
|||
# issue some statements and check that they don't fail |
|||
CREATE TABLE t5 (a INT); |
|||
INSERT INTO t4 VALUES ('bbbbb'); |
|||
INSERT INTO t2 VALUES ('aaaaa'); |
|||
DELETE FROM t4; |
|||
DELETE FROM t2; |
|||
DROP TABLE t5; |
|||
|
|||
# restart the server so that we have binlog again |
|||
-- source include/restart_mysqld.inc |
|||
|
|||
## clean up |
|||
SET GLOBAL debug= @old_debug; |
|||
DROP TABLE t1, t2, t4; |
|||
RESET MASTER; |
|||
|
|||
# restart slave again |
|||
-- connection slave |
|||
-- source include/start_slave.inc |
|||
-- connection master |
|||
|
|||
-- echo ####################################################################### |
|||
-- echo ####################### PART 2: SLAVE TESTS ########################### |
|||
-- echo ####################################################################### |
|||
|
|||
### setup |
|||
-- connection master |
|||
# master-slave-reset starts the slave automatically |
|||
-- source include/master-slave-reset.inc |
|||
-- connection slave |
|||
|
|||
# slave suppressions |
|||
|
|||
call mtr.add_suppression("Slave I/O: Relay log write failure: could not queue event from master.*"); |
|||
call mtr.add_suppression("Error writing file .*"); |
|||
call mtr.add_suppression("Could not open .*"); |
|||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file."); |
|||
call mtr.add_suppression("Can't generate a unique log-filename .*"); |
|||
-- echo ###################### TEST #13 |
|||
|
|||
#### ASSERTION: check against unique log filename error |
|||
-- let $io_thd_injection_fault_flag= error_unique_log_filename |
|||
-- let $slave_io_errno= 1595 |
|||
-- let $show_slave_io_error= 1 |
|||
-- source include/io_thd_fault_injection.inc |
|||
|
|||
-- echo ###################### TEST #14 |
|||
|
|||
#### ASSERTION: check against rotate failing |
|||
-- let $io_thd_injection_fault_flag= fault_injection_new_file_rotate_event |
|||
-- let $slave_io_errno= 1595 |
|||
-- let $show_slave_io_error= 1 |
|||
-- source include/io_thd_fault_injection.inc |
|||
|
|||
-- echo ###################### TEST #15 |
|||
|
|||
#### ASSERTION: check against relay log open failure |
|||
-- let $io_thd_injection_fault_flag= fault_injection_registering_index |
|||
-- let $slave_io_errno= 1595 |
|||
-- let $show_slave_io_error= 1 |
|||
-- source include/io_thd_fault_injection.inc |
|||
|
|||
-- echo ###################### TEST #16 |
|||
|
|||
#### ASSERTION: check against relay log index open failure |
|||
-- let $io_thd_injection_fault_flag= fault_injection_openning_index |
|||
-- let $slave_io_errno= 1595 |
|||
-- let $show_slave_io_error= 1 |
|||
-- source include/io_thd_fault_injection.inc |
|||
|
|||
### clean up |
|||
-- disable_warnings |
|||
-- source include/stop_slave.inc |
|||
-- enable_warnings |
|||
SET GLOBAL debug=@old_debug; |
|||
RESET SLAVE; |
|||
RESET MASTER; |
|||
-- source include/start_slave.inc |
|||
-- connection master |
|||
-- source include/master-slave-end.inc |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue