List:Commits« Previous MessageNext Message »
From:Tor Didriksen Date:October 18 2010 11:32am
Subject:bzr push into mysql-5.1-bugteam branch (tor.didriksen:3530 to 3531) Bug#52172
View as plain text  
 3531 Tor Didriksen	2010-10-18
      Bug#52172 test binlog.binlog_index needs --skip-core-file to avoid leaving core files
      
      For crash testing: kill the server without generating core file.
      
      include/my_dbug.h
        Use kill(getpid(), SIGKILL) which cannot be caught by signal handlers.
        All DBUG_XXX macros should be no-ops in optimized mode, do that for DBUG_ABORT as well.
      sql/handler.cc
        Kill server without generating core.
      sql/log.cc
        Kill server without generating core.

    modified:
      dbug/dbug.c
      include/my_dbug.h
      sql/handler.cc
      sql/log.cc
 3530 Li-Bing.Song@stripped	2010-10-16
      Bug#56118 STOP SLAVE does not wait till trx with CREATE TMP TABLE ends,
                replication aborts
      
      When recieving a 'SLAVE STOP' command, slave SQL thread will roll back the
      transaction and stop immidiately if there is only transactional table updated,
      even through 'CREATE|DROP TEMPOARY TABLE' statement are in it. But These
      statements can never be rolled back. Because the temporary tables to the user
      session mapping remain until 'RESET SLAVE', Therefore it will abort SQL thread
      with an error that the table already exists or doesn't exist, when it restarts
      and executes the whole transaction again.
      
      After this patch, SQL thread always waits till the transaction ends and then stops,
      if 'CREATE|DROP TEMPOARY TABLE' statement are in it.
     @ mysql-test/extra/rpl_tests/rpl_stop_slave.test
        Auxiliary file which is used to test this bug.
     @ mysql-test/suite/rpl/t/rpl_stop_slave.test
        Test case for this bug.
     @ sql/slave.cc
        Checking if OPTION_KEEP_LOG is set. If it is set, SQL thread should wait
        until the transaction ends.
     @ sql/sql_parse.cc
        Add a debug point for testing this bug.

    added:
      mysql-test/extra/rpl_tests/rpl_stop_slave.test
      mysql-test/suite/rpl/r/rpl_stop_slave.result
      mysql-test/suite/rpl/t/rpl_stop_slave.test
    modified:
      sql/slave.cc
      sql/sql_parse.cc
=== modified file 'dbug/dbug.c'
--- a/dbug/dbug.c	2010-09-22 19:33:18 +0000
+++ b/dbug/dbug.c	2010-10-18 11:24:34 +0000
@@ -2267,6 +2267,14 @@ static void dbug_flush(CODE_STATE *cs)
 } /* dbug_flush */
 
 
+void _db_flush_()
+{
+  CODE_STATE *cs;
+  get_code_state_or_return;
+  (void) fflush(cs->stack->out_file);
+}
+
+
 void _db_lock_file_()
 {
   CODE_STATE *cs=0;

=== modified file 'include/my_dbug.h'
--- a/include/my_dbug.h	2009-09-23 13:21:29 +0000
+++ b/include/my_dbug.h	2010-10-18 11:24:34 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 MySQL AB
+/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -13,8 +13,18 @@
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
-#ifndef _dbug_h
-#define _dbug_h
+#ifndef MY_DBUG_INCLUDED
+#define MY_DBUG_INCLUDED
+
+#ifndef __WIN__
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+#endif  /* not __WIN__ */
 
 #if defined(__cplusplus) && !defined(DBUG_OFF)
 class Dbug_violation_helper
@@ -69,6 +79,7 @@ extern	void _db_end_(void);
 extern	void _db_lock_file_(void);
 extern	void _db_unlock_file_(void);
 extern FILE *_db_fp_(void);
+extern  void _db_flush_();
 
 #ifdef __cplusplus
 
@@ -124,6 +135,34 @@ extern FILE *_db_fp_(void);
 #define DBUG_EXPLAIN(buf,len) _db_explain_(0, (buf),(len))
 #define DBUG_EXPLAIN_INITIAL(buf,len) _db_explain_init_((buf),(len))
 #define IF_DBUG(A) A
+#ifndef __WIN__
+#define DBUG_ABORT()                    (_db_flush_(), abort())
+#else
+/*
+  Avoid popup with abort/retry/ignore buttons. When BUG#31745 is fixed we can
+  call abort() instead of _exit(3) (now it would cause a "test signal" popup).
+*/
+#include <crtdbg.h>
+#define DBUG_ABORT() (_db_flush_(),\
+                     (void)_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE),\
+                     (void)_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR),\
+                     _exit(3))
+#endif
+
+/*
+  Make the program fail, without creating a core file.
+  abort() will send SIGABRT which (most likely) generates core.
+  Use SIGKILL instead, which cannot be caught.
+  We also pause the current thread, until the signal is actually delivered.
+  An alternative would be to use _exit(EXIT_FAILURE),
+  but then valgrind would report lots of memory leaks.
+ */
+#ifdef __WIN__
+#define DBUG_SUICIDE() DBUG_ABORT()
+#else
+#define DBUG_SUICIDE() (_db_flush_(), kill(getpid(), SIGKILL), pause())
+#endif
+
 #else						/* No debugger */
 
 #define DBUG_ENTER(a1)
@@ -152,8 +191,12 @@ extern FILE *_db_fp_(void);
 #define DBUG_EXPLAIN(buf,len)
 #define DBUG_EXPLAIN_INITIAL(buf,len)
 #define IF_DBUG(A)
+#define DBUG_ABORT()                    do { } while(0)
+#define DBUG_SUICIDE()                  do { } while(0)
+
 #endif
 #ifdef	__cplusplus
 }
 #endif
-#endif
+
+#endif /* MY_DBUG_INCLUDED */

=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2010-04-14 09:53:59 +0000
+++ b/sql/handler.cc	2010-10-18 11:24:34 +0000
@@ -1127,7 +1127,7 @@ int ha_commit_trans(THD *thd, bool all)
     uint rw_ha_count;
     bool rw_trans;
 
-    DBUG_EXECUTE_IF("crash_commit_before", abort(););
+    DBUG_EXECUTE_IF("crash_commit_before", DBUG_SUICIDE(););
 
     /* Close all cursors that can not survive COMMIT */
     if (is_real_trans)                          /* not a statement commit */
@@ -1179,7 +1179,7 @@ int ha_commit_trans(THD *thd, bool all)
         }
         status_var_increment(thd->status_var.ha_prepare_count);
       }
-      DBUG_EXECUTE_IF("crash_commit_after_prepare", abort(););
+      DBUG_EXECUTE_IF("crash_commit_after_prepare", DBUG_SUICIDE(););
       if (error || (is_real_trans && xid &&
                     (error= !(cookie= tc_log->log_xid(thd, xid)))))
       {
@@ -1187,13 +1187,13 @@ int ha_commit_trans(THD *thd, bool all)
         error= 1;
         goto end;
       }
-      DBUG_EXECUTE_IF("crash_commit_after_log", abort(););
+      DBUG_EXECUTE_IF("crash_commit_after_log", DBUG_SUICIDE(););
     }
     error=ha_commit_one_phase(thd, all) ? (cookie ? 2 : 1) : 0;
-    DBUG_EXECUTE_IF("crash_commit_before_unlog", abort(););
+    DBUG_EXECUTE_IF("crash_commit_before_unlog", DBUG_SUICIDE(););
     if (cookie)
       tc_log->unlog(cookie, xid);
-    DBUG_EXECUTE_IF("crash_commit_after", abort(););
+    DBUG_EXECUTE_IF("crash_commit_after", DBUG_SUICIDE(););
 end:
     if (rw_trans)
       start_waiting_global_read_lock(thd);

=== modified file 'sql/log.cc'
--- a/sql/log.cc	2010-09-22 12:53:06 +0000
+++ b/sql/log.cc	2010-10-18 11:24:34 +0000
@@ -2600,7 +2600,7 @@ bool MYSQL_BIN_LOG::open(const char *log
     sql_print_error("MSYQL_BIN_LOG::open failed to sync the index file.");
     DBUG_RETURN(1);
   }
-  DBUG_EXECUTE_IF("crash_create_non_critical_before_update_index", abort(););
+  DBUG_EXECUTE_IF("crash_create_non_critical_before_update_index", DBUG_SUICIDE(););
 #endif
 
   write_error= 0;
@@ -2697,7 +2697,7 @@ bool MYSQL_BIN_LOG::open(const char *log
     if (write_file_name_to_index_file)
     {
 #ifdef HAVE_REPLICATION
-      DBUG_EXECUTE_IF("crash_create_critical_before_update_index", abort(););
+      DBUG_EXECUTE_IF("crash_create_critical_before_update_index", DBUG_SUICIDE(););
 #endif
 
       DBUG_ASSERT(my_b_inited(&index_file) != 0);
@@ -2716,7 +2716,7 @@ bool MYSQL_BIN_LOG::open(const char *log
         goto err;
 
 #ifdef HAVE_REPLICATION
-      DBUG_EXECUTE_IF("crash_create_after_update_index", abort(););
+      DBUG_EXECUTE_IF("crash_create_after_update_index", DBUG_SUICIDE(););
 #endif
     }
   }
@@ -3168,7 +3168,7 @@ int MYSQL_BIN_LOG::purge_first_log(Relay
   /* Store where we are in the new file for the execution thread */
   flush_relay_log_info(rli);
 
-  DBUG_EXECUTE_IF("crash_before_purge_logs", abort(););
+  DBUG_EXECUTE_IF("crash_before_purge_logs", DBUG_SUICIDE(););
 
   pthread_mutex_lock(&rli->log_space_lock);
   rli->relay_log.purge_logs(to_purge_if_included, included,
@@ -3296,7 +3296,7 @@ int MYSQL_BIN_LOG::purge_logs(const char
       break;
   }
 
-  DBUG_EXECUTE_IF("crash_purge_before_update_index", abort(););
+  DBUG_EXECUTE_IF("crash_purge_before_update_index", DBUG_SUICIDE(););
 
   if ((error= sync_purge_index_file()))
   {
@@ -3311,7 +3311,7 @@ int MYSQL_BIN_LOG::purge_logs(const char
     goto err;
   }
 
-  DBUG_EXECUTE_IF("crash_purge_critical_after_update_index", abort(););
+  DBUG_EXECUTE_IF("crash_purge_critical_after_update_index", DBUG_SUICIDE(););
 
 err:
   /* Read each entry from purge_index_file and delete the file. */
@@ -3321,7 +3321,7 @@ err:
                     " that would be purged.");
   close_purge_index_file();
 
-  DBUG_EXECUTE_IF("crash_purge_non_critical_after_update_index", abort(););
+  DBUG_EXECUTE_IF("crash_purge_non_critical_after_update_index", DBUG_SUICIDE(););
 
   if (need_mutex)
     pthread_mutex_unlock(&LOCK_index);
@@ -4832,7 +4832,7 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_C
                           DBUG_PRINT("info", ("error writing binlog cache: %d",
                                                write_error));
                         DBUG_PRINT("info", ("crashing before writing xid"));
-                        abort();
+                        DBUG_SUICIDE();
                       });
 
       if ((write_error= write_cache(cache, false, false)))
@@ -4846,7 +4846,7 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_C
 
       if (flush_and_sync())
         goto err;
-      DBUG_EXECUTE_IF("half_binlogged_transaction", abort(););
+      DBUG_EXECUTE_IF("half_binlogged_transaction", DBUG_SUICIDE(););
       if (cache->error)				// Error on read
       {
         sql_print_error(ER(ER_ERROR_ON_READ), cache->file_name, errno);


Attachment: [text/bzr-bundle] bzr/tor.didriksen@oracle.com-20101018112434-hl14gw6k15teb20r.bundle
Thread
bzr push into mysql-5.1-bugteam branch (tor.didriksen:3530 to 3531) Bug#52172Tor Didriksen18 Oct