From: Li-Bing.Song Date: December 10 2009 12:10pm Subject: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3215) Bug#28421 List-Archive: http://lists.mysql.com/commits/93489 X-Bug: 28421 Message-Id: <200912101210.nBACAfW2026418@anders-server> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0308678974968333805==" --===============0308678974968333805== 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:li-bing.song@stripped 3215 Li-Bing.Song@stripped 2009-12-10 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. 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 been dumped completely. As only the position is used, it will can 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. Manually changing index file is a illegal action, 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/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/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 2009-12-10 12:10:33 +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 2009-12-10 12:10:33 +0000 @@ -0,0 +1,69 @@ +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 $datadir= `SELECT @@DATADIR`; +remove_file $datadir/master-bin.index; +write_file $datadir/master-bin.index; +./master-bin.000002 +EOF +# 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 2009-12-10 12:10:33 +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; --===============0308678974968333805== 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: d4dba869d7cda5a971807df25351484e631d08bf # timestamp: 2009-12-10 20:10:41 +0800 # base_revision_id: li-bing.song@stripped\ # whfkkgrwim0j3p8r # # Begin bundle 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 eEJUbJfP8XckU4UJC5EubAA= --===============0308678974968333805==--