From 081a3726dd5e44f97abd0018cdb076f82adc9b61 Mon Sep 17 00:00:00 2001 From: Luis Soares Date: Wed, 20 Jan 2010 18:39:29 +0000 Subject: [PATCH 1/2] BUG#50473: rpl_sync fails on windows debug enabled binaries The test case was failing because it contained instructions to close/reopen files, when they were in use. This raises problems in windows. Example of such instruction: ---exec echo "failure" > $MYSQLD_SLAVE_DATADIR/$file The test also contains commands that are not platform agnostic. Example: --exec cat $MYSQLD_SLAVE_DATADIR/master.backup > \ $MYSQLD_SLAVE_DATADIR/master.info We fix this by just truncating the necessary file and write "failure" into it (ie, without closing the file). The platform specific instruction is removed from the test case as it seems redundant. --- mysql-test/suite/rpl/t/rpl_sync.test | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/rpl/t/rpl_sync.test b/mysql-test/suite/rpl/t/rpl_sync.test index 80b6a144187..48c8dc02efb 100644 --- a/mysql-test/suite/rpl/t/rpl_sync.test +++ b/mysql-test/suite/rpl/t/rpl_sync.test @@ -64,8 +64,15 @@ stop slave IO_THREAD; source include/wait_for_slave_io_to_stop.inc; let $file= query_get_value("SHOW SLAVE STATUS", Relay_Log_File, 1); ---replace_result $MYSQLD_SLAVE_DATADIR MYSQLD_SLAVE_DATADIR ---exec echo "failure" > $MYSQLD_SLAVE_DATADIR/$file + +--let FILE_TO_CORRUPT= $MYSQLD_SLAVE_DATADIR/$file +perl; +$file= $ENV{'FILE_TO_CORRUPT'}; +open(FILE, ">$file") || die "Unable to open $file."; +truncate(FILE,0); +print FILE "failure"; +close ($file); +EOF --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect SET SESSION debug="d,crash_before_rotate_relaylog"; @@ -102,9 +109,6 @@ insert into t1(a) values(8); insert into t1(a) values(9); connection slave; ---replace_result $MYSQLD_SLAVE_DATADIR MYSQLD_SLAVE_DATADIR ---exec cat $MYSQLD_SLAVE_DATADIR/master.backup > $MYSQLD_SLAVE_DATADIR/master.info - let MYSQLD_SLAVE_DATADIR=`select @@datadir`; --perl From 817ae11cc21e078a172686ee460782b5d7f882ab Mon Sep 17 00:00:00 2001 From: Luis Soares Date: Thu, 21 Jan 2010 00:41:32 +0000 Subject: [PATCH 2/2] BUG#50474: rpl_slave_load_remove_tmpfile failed on windows debug enabled binary The test case injects an error in the server by deleting the temporary file that it uses during the load data statement execution. The error consisted of closing, deleting and setting the file descriptor to -1 right before calling mysql_file_write. Although, this error injection seems to work OK in Unix like environments, in Windows, this would cause the server to hit an assertion in 'my_get_open_flags': DBUG_ASSERT(fd >= MY_FILE_MIN && fd < (int)my_file_limit) We fix this by changing the error injection to just call the macro my_delete_allow_opened, instead of the close + delete + set fd=-1. The macro deletes the file and is platform independent. Additionally, this required some changes to how the assertion is handled in the test case to make it cope with this change. --- .../r/rpl_slave_load_remove_tmpfile.result | 44 +------------------ .../rpl/t/rpl_slave_load_remove_tmpfile.test | 18 +++++--- sql/log_event.cc | 4 +- 3 files changed, 16 insertions(+), 50 deletions(-) diff --git a/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result b/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result index 880fc9e8569..85fbcb69760 100644 --- a/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result +++ b/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result @@ -10,47 +10,7 @@ insert into t1(b) values (1); insert into t1(b) values (2); load data infile '../../std_data/rpl_loaddata.dat' into table t1; commit; -show slave status; -Slave_IO_State # -Master_Host 127.0.0.1 -Master_User root -Master_Port MASTER_MYPORT -Connect_Retry 1 -Master_Log_File master-bin.000001 -Read_Master_Log_Pos # -Relay_Log_File # -Relay_Log_Pos # -Relay_Master_Log_File master-bin.000001 -Slave_IO_Running Yes -Slave_SQL_Running No -Replicate_Do_DB -Replicate_Ignore_DB -Replicate_Do_Table -Replicate_Ignore_Table -Replicate_Wild_Do_Table -Replicate_Wild_Ignore_Table -Last_Errno 9 -Last_Error Error in Begin_load_query event: write to '../../tmp/SQL_LOAD.data' failed -Skip_Counter 0 -Exec_Master_Log_Pos # -Relay_Log_Space # -Until_Condition None -Until_Log_File -Until_Log_Pos 0 -Master_SSL_Allowed No -Master_SSL_CA_File -Master_SSL_CA_Path -Master_SSL_Cert -Master_SSL_Cipher -Master_SSL_Key -Seconds_Behind_Master # -Master_SSL_Verify_Server_Cert No -Last_IO_Errno # -Last_IO_Error # -Last_SQL_Errno 9 -Last_SQL_Error Error in Begin_load_query event: write to '../../tmp/SQL_LOAD.data' failed -Replicate_Ignore_Server_Ids -Master_Server_Id 1 drop table t1; drop table t1; -call mtr.add_suppression("Slave: Error writing file 'UNKNOWN' .Errcode: 9. Error_code: 3"); +call mtr.add_suppression("Slave: Can't get stat of .*"); +call mtr.add_suppression("Slave: File.* not found.*"); diff --git a/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test b/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test index 437e1ebb92d..b85ed18ab51 100644 --- a/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test +++ b/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test @@ -33,10 +33,17 @@ commit; connection slave; source include/wait_for_slave_sql_to_stop.inc; ---replace_result $MASTER_MYPORT MASTER_MYPORT ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 # ---replace_regex /SQL_LOAD-[0-9]-[0-9]-[0-9]*/SQL_LOAD/ -query_vertical show slave status; +--let $error= query_get_value(SHOW SLAVE STATUS, Last_Errno, 1) +# windows and linux different error numbers here: +# Windows: +# - Last_Errno 29 (File not found) +# Unix like OS: +# - Last_Errno 13 (Can't stat file) +--let $assertion= `SELECT $error=29 OR $error=13` +if (!$assertion) +{ + --echo UNEXPECTED ERROR NUMBER: $error +} ########################################################################## # Clean up @@ -49,4 +56,5 @@ connection slave; drop table t1; -call mtr.add_suppression("Slave: Error writing file 'UNKNOWN' .Errcode: 9. Error_code: 3"); +call mtr.add_suppression("Slave: Can't get stat of .*"); +call mtr.add_suppression("Slave: File.* not found.*"); diff --git a/sql/log_event.cc b/sql/log_event.cc index 985d2110c9b..758d0aad06f 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -6355,9 +6355,7 @@ int Append_block_log_event::do_apply_event(Relay_log_info const *rli) DBUG_EXECUTE_IF("remove_slave_load_file_before_write", { - mysql_file_close(fd, MYF(0)); - fd= -1; - mysql_file_delete(0, fname, MYF(0)); + my_delete_allow_opened(fname, MYF(0)); }); if (mysql_file_write(fd, (uchar*) block, block_len, MYF(MY_WME+MY_NABP)))