List:Commits« Previous MessageNext Message »
From:Li-Bing.Song Date:October 19 2009 8:23am
Subject:bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162) Bug#21437
View as plain text  
#At file:///home/anders/work/bzrwork/bug45516/mysql-5.1-bugteam/ based on revid:v.narayanan@stripped

 3162 Li-Bing.Song@stripped	2009-10-19
      Bug#21437 server_errno=29 error message flood mysqld error log
      
      Sometimes, Slaves requests a binlog file which does not exists on master.
      On this occasion, master will send an error to slave. The error number is 29
      Which means file does not find. This error message will lead a flood.
      
      Instead of error 29, error 
      COM_BINLOG_DUMP has a group of its own errors, The errors which have happend will be
      sent to slave immediately.
      Before the COM_BINLOG_DUMP error is reported by this function, an error
      sometimes has been set into thd->main_da by a low level function such as
      my_register_filename, which is called during COM_BINLOG_DUMP is
      executing. Thus, instead of the COM_BINLOG_DUMP error, the low level
      error is sent to slave.
      The low level error should never be sent to slave, it only be reported
      to master.

    added:
      mysql-test/suite/rpl/r/rpl_master_fatal_error.result
      mysql-test/suite/rpl/t/rpl_master_fatal_error.test
    modified:
      sql/sql_repl.cc
=== added file 'mysql-test/suite/rpl/r/rpl_master_fatal_error.result'
--- a/mysql-test/suite/rpl/r/rpl_master_fatal_error.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/r/rpl_master_fatal_error.result	2009-10-19 08:23:22 +0000
@@ -0,0 +1,20 @@
+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("Got fatal error 1236 from master when reading data from binary log:");
+CREATE TABLE t1(c1 int);
+DROP TABLE t1;
+FLUSH LOGS;
+CREATE TABLE t1(c1 int);
+DROP TABLE t1;
+STOP SLAVE;
+CHANGE MASTER TO master_host='127.0.0.1', master_log_file='master-bin.000001';
+START SLAVE;
+Last_IO_Error
+echo Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'
+STOP SLAVE SQL_THREAD;
+CHANGE MASTER TO master_host='127.0.0.1', master_log_file='master-bin.000002';
+START SLAVE;

=== added file 'mysql-test/suite/rpl/t/rpl_master_fatal_error.test'
--- a/mysql-test/suite/rpl/t/rpl_master_fatal_error.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_master_fatal_error.test	2009-10-19 08:23:22 +0000
@@ -0,0 +1,47 @@
+###############################################################################
+# Bug #21437 server_errno=29 error message flood mysqld error log
+# 
+# server_errno 29 is EE_FILENOTFOUND. It should never be reported to slave.
+# Instead of EE_FILENOTFOUND, ER_MASTER_FATAL_ERROR_READING_BINLOG and the
+# specific reason "Could not open log file" are sent to slave.
+################################################################################
+
+source include/master-slave.inc;
+#Add supression for the expected error in slave error log
+call mtr.add_suppression("Got fatal error 1236 from master when reading data from binary log:");
+
+CREATE TABLE t1(c1 int);
+DROP TABLE t1;
+
+FLUSH LOGS;
+
+CREATE TABLE t1(c1 int);
+DROP TABLE t1;
+sync_slave_with_master;
+
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+
+#This operation will result in error EE_FILENOTFOUND which happens when slave IO thread is connecting to master.
+move_file $MYSQL_TEST_DIR/var/mysqld.1/data/master-bin.000001 $MYSQL_TEST_DIR/var/mysqld.1/data/master-bin.bak;
+
+connection slave;
+CHANGE MASTER TO master_host='127.0.0.1', master_log_file='master-bin.000001';
+START SLAVE;
+source include/wait_for_slave_io_to_stop.inc;
+
+# Instead of EE_FILENOTFOUND, ER_MASTER_FATAL_ERROR_READING_BINLOG and the
+# specific information are sent to slave.
+let $last_io_error= query_get_value(SHOW SLAVE STATUS, Last_IO_Error, 1);
+echo Last_IO_Error
+echo $last_io_error;
+
+move_file $MYSQL_TEST_DIR/var/mysqld.1/data/master-bin.bak $MYSQL_TEST_DIR/var/mysqld.1/data/master-bin.000001;
+
+STOP SLAVE SQL_THREAD;
+source include/wait_for_slave_sql_to_stop.inc;
+CHANGE MASTER TO master_host='127.0.0.1', master_log_file='master-bin.000002';
+START SLAVE;
+source include/wait_for_slave_to_start.inc;
+
+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-10-19 08:23:22 +0000
@@ -777,6 +777,20 @@ err:
   if (file >= 0)
     (void) my_close(file, MYF(MY_WME));
 
+  /*
+    Bug #21437 server_errno=29 error message flood mysqld error log
+
+    COM_BINLOG_DUMP has a group of its own errors, The errors which have happend will be
+    sent to slave immediately.
+    Before the COM_BINLOG_DUMP error is reported by this function, an error
+    sometimes has been set into thd->main_da by a low level function such as
+    my_register_filename, which is called during COM_BINLOG_DUMP is
+    executing. Thus, instead of the COM_BINLOG_DUMP error, the low level
+    error is sent to slave.
+    The low level error should never be sent to slave, it only be reported
+    to master.
+   */
+  thd->main_da.reset_diagnostics_area();
   my_message(my_errno, errmsg, MYF(0));
   DBUG_VOID_RETURN;
 }


Attachment: [text/bzr-bundle] bzr/li-bing.song@sun.com-20091019082322-4zguf5zfy2nqf242.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162) Bug#21437Li-Bing.Song19 Oct
  • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162)Bug#21437Daogang Qu30 Oct
    • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162)Bug#21437Daogang Qu30 Oct
      • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162)Bug#21437Libing Song10 Nov
  • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162)Bug#21437Alfranio Correia6 Nov
    • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3162)Bug#21437Libing Song10 Nov