From: Li-Bing.Song Date: January 5 2010 10:22am Subject: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3303) Bug#28421 List-Archive: http://lists.mysql.com/commits/95941 X-Bug: 28421 Message-Id: <201001051023.o05ANL3e012876@anders-server> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0451889612132750293==" --===============0451889612132750293== 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:dao-gang.qu@stripped 3303 Li-Bing.Song@stripped 2010-01-05 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-05 10:22:11 +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-05 10:22:11 +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-05 10:22:11 +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-05 10:22:11 +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; --===============0451889612132750293== 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: c918597544d02449e1d7bfe373867c32a524e464 # timestamp: 2010-01-05 18:22:21 +0800 # base_revision_id: dao-gang.qu@stripped\ # i5dnn06ahs256qcy # # Begin bundle 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 M/27l+ejwY/i7kinChIKX7y5QA== --===============0451889612132750293==--