List:Commits« Previous MessageNext Message »
From:Andrei Elkin Date:February 13 2008 12:09pm
Subject:bk commit into 5.0 tree (aelkin:1.2576) BUG#33931
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of aelkin.  When aelkin does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-02-13 14:09:41+02:00, aelkin@stripped +4 -0
  Bug #33931 assertion at write_ignored_events_info_to_relay_log if init_slave_thread() fails
  and
  bug#33932  assertion at handle_slave_sql if init_slave_thread() fails
  
  the asserts were caused by 
    bug33931: having thd deleted at time of executing err: code plus
              a missed initialization;
    bug33932: initialization of slave_is_running member was missed;
  
  fixed with relocating mi members initialization and removing delete thd
  It is safe to do as deletion happens later explicitly in the caller of
  init_slave_thread().
  
  Todo: at merging the test is better to be moved into suite/bugs for 5.x (when x>0).

  mysql-test/r/rpl_bug33931.result@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +38 -0
    the new result file

  mysql-test/r/rpl_bug33931.result@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +0 -0

  mysql-test/t/rpl_bug33931-slave.opt@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +1 -0
    option to spark the simulation code

  mysql-test/t/rpl_bug33931-slave.opt@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +0 -0

  mysql-test/t/rpl_bug33931.test@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +37 -0
    tests check that slave does not crash as before.
    Slave threads must be in NO running state in the end.
    

  mysql-test/t/rpl_bug33931.test@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +0 -0

  sql/slave.cc@stripped, 2008-02-13 14:09:40+02:00, aelkin@stripped +14 -4
    adding the bugs simulating code;
    relocating some assignments to satisfy the asserts;

diff -Nrup a/mysql-test/r/rpl_bug33931.result b/mysql-test/r/rpl_bug33931.result
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/r/rpl_bug33931.result	2008-02-13 14:09:40 +02:00
@@ -0,0 +1,38 @@
+reset master;
+stop slave;
+reset slave;
+start slave;
+show slave status;
+Slave_IO_State	#
+Master_Host	127.0.0.1
+Master_User	root
+Master_Port	MASTER_PORT
+Connect_Retry	1
+Master_Log_File	
+Read_Master_Log_Pos	4
+Relay_Log_File	#
+Relay_Log_Pos	#
+Relay_Master_Log_File	
+Slave_IO_Running	No
+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	0
+Last_Error	
+Skip_Counter	0
+Exec_Master_Log_Pos	0
+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	#
diff -Nrup a/mysql-test/t/rpl_bug33931-slave.opt b/mysql-test/t/rpl_bug33931-slave.opt
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/rpl_bug33931-slave.opt	2008-02-13 14:09:40 +02:00
@@ -0,0 +1 @@
+--loose-debug=d,simulate_io_slave_error_on_init,simulate_sql_slave_error_on_init
diff -Nrup a/mysql-test/t/rpl_bug33931.test b/mysql-test/t/rpl_bug33931.test
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/rpl_bug33931.test	2008-02-13 14:09:40 +02:00
@@ -0,0 +1,37 @@
+# Test for 
+# Bug #33931  	assertion at write_ignored_events_info_to_relay_log if init_slave_thread() fails
+# Bug #33932  	assertion at handle_slave_sql if init_slave_thread() fails
+
+source include/have_debug.inc;
+source include/have_log_bin.inc;
+
+connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,);
+connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,);
+
+
+connection master;
+reset master;
+
+connection slave;
+--disable_warnings
+stop slave;
+--enable_warnings
+reset slave;
+start slave;
+
+connection master;
+save_master_pos;
+connection slave;
+
+#
+# slave is going to stop because of emulated failures
+# but there won't be any crashes nor asserts hit.
+#
+source include/wait_for_slave_to_stop.inc;
+
+--replace_result $MASTER_MYPORT MASTER_PORT                                     
+--replace_column 1 # 8 # 9 # 23 # 33 #                                          
+query_vertical show slave status;
+
+# no clean-up is needed
+
diff -Nrup a/sql/slave.cc b/sql/slave.cc
--- a/sql/slave.cc	2007-12-20 17:07:52 +02:00
+++ b/sql/slave.cc	2008-02-13 14:09:40 +02:00
@@ -2895,6 +2895,9 @@ void set_slave_thread_default_charset(TH
 static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
 {
   DBUG_ENTER("init_slave_thread");
+#if !defined(DBUG_OFF)
+  int simulate_error= 0;
+#endif
   thd->system_thread = (thd_type == SLAVE_THD_SQL) ?
     SYSTEM_THREAD_SLAVE_SQL : SYSTEM_THREAD_SLAVE_IO; 
   thd->security_ctx->skip_grants();
@@ -2914,10 +2917,17 @@ static int init_slave_thread(THD* thd, S
   thd->thread_id = thread_id++;
   pthread_mutex_unlock(&LOCK_thread_count);
 
+  DBUG_EXECUTE_IF("simulate_io_slave_error_on_init",
+                  simulate_error|= (1 << SLAVE_THD_IO););
+  DBUG_EXECUTE_IF("simulate_sql_slave_error_on_init",
+                  simulate_error|= (1 << SLAVE_THD_SQL););
+#if !defined(DBUG_OFF)
+  if (init_thr_lock() || thd->store_globals() || simulate_error & (1<< thd_type))
+#else
   if (init_thr_lock() || thd->store_globals())
+#endif
   {
     thd->cleanup();
-    delete thd;
     DBUG_RETURN(-1);
   }
 
@@ -3515,6 +3525,7 @@ slave_begin:
 
   thd= new THD; // note that contructor of THD uses DBUG_ !
   THD_CHECK_SENTRY(thd);
+  mi->io_thd = thd;
 
   pthread_detach_this_thread();
   thd->thread_stack= (char*) &thd; // remember where our stack is
@@ -3525,7 +3536,6 @@ slave_begin:
     sql_print_error("Failed during slave I/O thread initialization");
     goto err;
   }
-  mi->io_thd = thd;
   pthread_mutex_lock(&LOCK_thread_count);
   threads.append(thd);
   pthread_mutex_unlock(&LOCK_thread_count);
@@ -3865,9 +3875,11 @@ slave_begin:
 
   thd = new THD; // note that contructor of THD uses DBUG_ !
   thd->thread_stack = (char*)&thd; // remember where our stack is
+  rli->sql_thd= thd;
   
   /* Inform waiting threads that slave has started */
   rli->slave_run_id++;
+  rli->slave_running = 1;
 
   pthread_detach_this_thread();
   if (init_slave_thread(thd, SLAVE_THD_SQL))
@@ -3882,7 +3894,6 @@ slave_begin:
     goto err;
   }
   thd->init_for_queries();
-  rli->sql_thd= thd;
   thd->temporary_tables = rli->save_temporary_tables; // restore temp tables
   pthread_mutex_lock(&LOCK_thread_count);
   threads.append(thd);
@@ -3895,7 +3906,6 @@ slave_begin:
     start receiving data so we realize we are not caught up and
     Seconds_Behind_Master grows. No big deal.
   */
-  rli->slave_running = 1;
   rli->abort_slave = 0;
   pthread_mutex_unlock(&rli->run_lock);
   pthread_cond_broadcast(&rli->start_cond);
Thread
bk commit into 5.0 tree (aelkin:1.2576) BUG#33931Andrei Elkin13 Feb
  • Re: bk commit into 5.0 tree (aelkin:1.2576) BUG#33931Mats Kindahl13 Feb