From: Tor Didriksen Date: October 18 2010 11:31am Subject: bzr push into mysql-trunk-merge branch (tor.didriksen:3271 to 3272) Bug#52172 List-Archive: http://lists.mysql.com/commits/120952 X-Bug: 52172 Message-Id: <20101018113200.3DA5629D7@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8134284038087641703==" --===============8134284038087641703== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3272 Tor Didriksen 2010-10-18 [merge] 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/binlog.cc Kill server without generating core. unittest/gunit/CMakeLists.txt Add unit test. unittest/gunit/dbug-t.cc Add unit test. added: unittest/gunit/dbug-t.cc modified: include/my_dbug.h sql/binlog.cc sql/handler.cc unittest/gunit/CMakeLists.txt 3271 Li-Bing.Song@stripped 2010-10-16 [merge] Auto Merge 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/rpl_slave.cc sql/sql_parse.cc === modified file 'include/my_dbug.h' --- a/include/my_dbug.h 2010-07-15 11:16:06 +0000 +++ b/include/my_dbug.h 2010-10-18 11:27:52 +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 +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#endif /* not __WIN__ */ #ifdef __cplusplus extern "C" { @@ -111,6 +121,20 @@ extern const char* _db_get_func_(void); #define DBUG_CRASH_VOID_RETURN \ DBUG_CHECK_CRASH (_db_get_func_(), "_crash_return") +/* + 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) @@ -139,10 +163,11 @@ extern const char* _db_get_func_(void); #define DBUG_EXPLAIN_INITIAL(buf,len) #define DEBUGGER_OFF do { } while(0) #define DEBUGGER_ON do { } while(0) -#define DBUG_ABORT() abort() +#define DBUG_ABORT() do { } while(0) #define DBUG_CRASH_ENTER(func) #define DBUG_CRASH_RETURN(val) do { return(val); } while(0) #define DBUG_CRASH_VOID_RETURN do { return; } while(0) +#define DBUG_SUICIDE() do { } while(0) #endif @@ -164,4 +189,5 @@ void debug_sync_point(const char* lock_n #ifdef __cplusplus } #endif -#endif + +#endif /* MY_DBUG_INCLUDED */ === modified file 'sql/binlog.cc' --- a/sql/binlog.cc 2010-09-28 15:17:07 +0000 +++ b/sql/binlog.cc 2010-10-18 11:31:18 +0000 @@ -1546,7 +1546,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", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_create_non_critical_before_update_index", DBUG_SUICIDE();); #endif write_error= 0; @@ -1643,7 +1643,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", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_create_critical_before_update_index", DBUG_SUICIDE();); #endif DBUG_ASSERT(my_b_inited(&index_file) != 0); @@ -1662,7 +1662,7 @@ bool MYSQL_BIN_LOG::open(const char *log goto err; #ifdef HAVE_REPLICATION - DBUG_EXECUTE_IF("crash_create_after_update_index", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_create_after_update_index", DBUG_SUICIDE();); #endif } } @@ -2114,7 +2114,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", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_before_purge_logs", DBUG_SUICIDE();); mysql_mutex_lock(&rli->log_space_lock); rli->relay_log.purge_logs(to_purge_if_included, included, @@ -2242,7 +2242,7 @@ int MYSQL_BIN_LOG::purge_logs(const char break; } - DBUG_EXECUTE_IF("crash_purge_before_update_index", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_purge_before_update_index", DBUG_SUICIDE();); if ((error= sync_purge_index_file())) { @@ -2257,7 +2257,7 @@ int MYSQL_BIN_LOG::purge_logs(const char goto err; } - DBUG_EXECUTE_IF("crash_purge_critical_after_update_index", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_purge_critical_after_update_index", DBUG_SUICIDE();); err: /* Read each entry from purge_index_file and delete the file. */ @@ -2267,7 +2267,7 @@ err: " that would be purged."); close_purge_index_file(); - DBUG_EXECUTE_IF("crash_purge_non_critical_after_update_index", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_purge_non_critical_after_update_index", DBUG_SUICIDE();); if (need_mutex) mysql_mutex_unlock(&LOCK_index); @@ -3432,7 +3432,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")); - DBUG_ABORT(); + DBUG_SUICIDE(); }); if ((write_error= write_cache(cache, false, false))) @@ -3447,7 +3447,7 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_C bool synced= 0; if (flush_and_sync(&synced)) goto err; - DBUG_EXECUTE_IF("half_binlogged_transaction", DBUG_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); === modified file 'sql/handler.cc' --- a/sql/handler.cc 2010-10-07 12:47:15 +0000 +++ b/sql/handler.cc 2010-10-18 11:31:18 +0000 @@ -1157,7 +1157,7 @@ int ha_commit_trans(THD *thd, bool all) uint rw_ha_count; bool rw_trans; - DBUG_EXECUTE_IF("crash_commit_before", DBUG_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 */ @@ -1209,7 +1209,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", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_commit_after_prepare", DBUG_SUICIDE();); if (error || (is_real_trans && xid && (error= !(cookie= tc_log->log_xid(thd, xid))))) { @@ -1217,13 +1217,13 @@ int ha_commit_trans(THD *thd, bool all) error= 1; goto end; } - DBUG_EXECUTE_IF("crash_commit_after_log", DBUG_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", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_commit_before_unlog", DBUG_SUICIDE();); if (cookie) tc_log->unlog(cookie, xid); - DBUG_EXECUTE_IF("crash_commit_after", DBUG_ABORT();); + DBUG_EXECUTE_IF("crash_commit_after", DBUG_SUICIDE();); RUN_HOOK(transaction, after_commit, (thd, FALSE)); end: if (rw_trans) === modified file 'unittest/gunit/CMakeLists.txt' --- a/unittest/gunit/CMakeLists.txt 2010-07-30 08:34:23 +0000 +++ b/unittest/gunit/CMakeLists.txt 2010-10-18 11:31:18 +0000 @@ -207,7 +207,7 @@ IF (CMAKE_CXX_COMPILER_ID STREQUAL "SunP ENDIF() # Add tests (link them with sql library) -SET(TESTS sql_list mdl mdl_mytap my_regex thread_utils) +SET(TESTS dbug sql_list mdl mdl_mytap my_regex thread_utils) FOREACH(test ${TESTS}) ADD_EXECUTABLE(${test}-t ${test}-t.cc) TARGET_LINK_LIBRARIES(${test}-t gunit sqlgunitlib strings dbug regex) === added file 'unittest/gunit/dbug-t.cc' --- a/unittest/gunit/dbug-t.cc 1970-01-01 00:00:00 +0000 +++ b/unittest/gunit/dbug-t.cc 2010-10-18 11:31:18 +0000 @@ -0,0 +1,35 @@ +/* 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 + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +// First include (the generated) my_config.h, to get correct platform defines, +// then gtest.h (before any other MySQL headers), to avoid min() macros etc ... +#include "my_config.h" +#include + +#include "my_global.h" +#include "my_dbug.h" + +#if defined(DBUG_OFF) +TEST(DebugTest, NoSuicide) +{ + DBUG_SUICIDE(); +} +#else +TEST(DebugDeathTest, Suicide) +{ + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; + EXPECT_DEATH_IF_SUPPORTED(DBUG_SUICIDE(), ""); +} +#endif --===============8134284038087641703== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped\ # 2w0voe5w26ielukt # target_branch: file:///export/home/didrik/repo/trunk-merge-\ # bug52172suicide/ # testament_sha1: 453147e1efa8627a6ad33fa6f75ac139764ec1ac # timestamp: 2010-10-18 13:32:00 +0200 # source_branch: file:///export/home/didrik/repo/5.5-bugteam-\ # bug52172suicide/ # base_revision_id: li-bing.song@stripped\ # mxuv7kvtngo88slj # # Begin bundle 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 --===============8134284038087641703==--