From: Li-Bing.Song Date: January 8 2010 5:42am Subject: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3308) Bug#28421 List-Archive: http://lists.mysql.com/commits/96344 X-Bug: 28421 Message-Id: <201001080543.o085hkiP032650@anders-server> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6408866837899168662==" --===============6408866837899168662== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anders/work/bzrwork/worktree2/mysql-5.1-bugteam/ based on revid:luis.soares@stripped 3308 Li-Bing.Song@stripped 2010-01-08 BUG #28421 Infinite loop on slave relay logs Manually deleteing one or more entries from 'master-bin.index', will cause master infinitely loop to send one binlog file. When starting a dump session, master opens index file and search the binlog file which is being requested by the slave. The position of the binlog file in the index file is recorded. it will be used to find the next binlog file when current binlog file has dumped completely. As only the position is used, it may not get the correct file if some entries has been removed manually from the index file. the master will reopen the current binlog file which has been dump completely and redump it if it can not get the next binlog file's name from index file. It obviously is a logical error. Even though it is allowed to manually change index file, but it is not recommended. so after this patch, master sends a fatal error to slave and close the dump session if a new binlog file has been generated and master can not get it from the index file. added: mysql-test/include/truncate_file.inc mysql-test/suite/rpl/r/rpl_manual_change_index_file.result mysql-test/suite/rpl/t/rpl_manual_change_index_file.test modified: sql/sql_repl.cc === added file 'mysql-test/include/truncate_file.inc' --- a/mysql-test/include/truncate_file.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/truncate_file.inc 2010-01-08 05:42:23 +0000 @@ -0,0 +1,16 @@ +# truncate a giving file, all contents of the file are be cleared + +if (`SELECT 'x$file' = 'x'`) +{ + --echo Please assign a file name to $file!! + exit; +} + +let TRUNCATE_FILE= $file; + +perl; +use Env; +Env::import('TRUNCATE_FILE'); +open FILE, '>', $TRUNCATE_FILE || die "Can not open file $file"; +close FILE; +EOF === added file 'mysql-test/suite/rpl/r/rpl_manual_change_index_file.result' --- a/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result 2010-01-08 05:42:23 +0000 @@ -0,0 +1,25 @@ +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; +FLUSH LOGS; +CREATE TABLE t1(c1 INT); +FLUSH LOGS; +call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log'); +Last_IO_Error +Got fatal error 1236 from master when reading data from binary log: 'could not find next log' +CREATE TABLE t2(c1 INT); +FLUSH LOGS; +CREATE TABLE t3(c1 INT); +FLUSH LOGS; +CREATE TABLE t4(c1 INT); +START SLAVE IO_THREAD; +SHOW TABLES; +Tables_in_test +t1 +t2 +t3 +t4 +DROP TABLE t1, t2, t3, t4; === added file 'mysql-test/suite/rpl/t/rpl_manual_change_index_file.test' --- a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test 2010-01-08 05:42:23 +0000 @@ -0,0 +1,85 @@ +source include/master-slave.inc; + +# +# BUG#28421 Infinite loop on slave relay logs +# +# That, manually deleteing one or more entries from 'master-bin.index', will +# cause master infinitely loop to send one binlog file. +# +# Manually changing index file is a illegal action, so when this happen, we +# send a fatal error to slave and close the dump session. + +FLUSH LOGS; +# Now, 2 entries in index file. +# ./master-bin.000001 +# ./master-bin.000002 + +CREATE TABLE t1(c1 INT); +# Now, the current dump file(master-bin.000002) is the second line of index +# file +sync_slave_with_master; +# Now, all events has been replicate to slave. As current dump file +# (master-bin.000002) is the last binlog file, so master is waiting for new +# events. + +connection master; +# Delete './master-bin.000001' from index file. +let $MYSQLD_DATADIR= `SELECT @@DATADIR`; +#remove_file $MYSQLD_DATADIR/master-bin.index; +let $file= $MYSQLD_DATADIR/master-bin.index; +source include/truncate_file.inc; + +if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) +{ +append_file $MYSQLD_DATADIR/master-bin.index; +./master-bin.000002 +EOF +sleep 0.00000001; +} + +if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`) +{ +append_file $MYSQLD_DATADIR/master-bin.index; +.\master-bin.000002 +EOF +sleep 0.00000001; +} + +# Now, only 1 entry in index file. +# ./master-bin.000002 + +# Generate master-bin.000003, but it is in the second line. +FLUSH LOGS; +# Now, 2 entries in index file. +# ./master-bin.000002 +# ./master-bin.000003 + +# Now, master know that new binlog file(master-bin.000003) has been generated. +# It expects that the new binlog file is in third line of index file, but +# there is no third line in index file. It is so strange that master sends an +# error to slave. +call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log'); +connection slave; +source include/wait_for_slave_io_to_stop.inc; +let $last_error= query_get_value(SHOW SLAVE STATUS, Last_IO_Error, 1); +echo Last_IO_Error; +echo $last_error; + +connection master; +CREATE TABLE t2(c1 INT); +FLUSH LOGS; +CREATE TABLE t3(c1 INT); +FLUSH LOGS; +CREATE TABLE t4(c1 INT); + +connection slave; +START SLAVE IO_THREAD; +source include/wait_for_slave_io_to_start.inc; + +connection master; +sync_slave_with_master; +SHOW TABLES; + +connection master; +DROP TABLE t1, t2, t3, t4; +source include/master-slave-end.inc; === modified file 'sql/sql_repl.cc' --- a/sql/sql_repl.cc 2009-09-18 08:20:29 +0000 +++ b/sql/sql_repl.cc 2010-01-08 05:42:23 +0000 @@ -711,11 +711,14 @@ impossible position"; thd_proc_info(thd, "Finished reading one binlog; switching to next binlog"); switch (mysql_bin_log.find_next_log(&linfo, 1)) { - case LOG_INFO_EOF: - loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK); - break; case 0: break; + case LOG_INFO_EOF: + if (mysql_bin_log.is_active(log_file_name)) + { + loop_breaker = (flags & BINLOG_DUMP_NON_BLOCK); + break; + } default: errmsg = "could not find next log"; my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG; --===============6408866837899168662== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/li-bing.song@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: li-bing.song@stripped # target_branch: file:///home/anders/work/bzrwork/worktree2/mysql-5.1-\ # bugteam/ # testament_sha1: 5d340fb6dece18386333f455f28a31371f792b78 # timestamp: 2010-01-08 13:42:46 +0800 # base_revision_id: luis.soares@stripped\ # brluy5ifty82u796 # # Begin bundle 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 cyn/F3JFOFCQTPHkeQ== --===============6408866837899168662==--