Commit 13e4d547 authored by Michael Widenius's avatar Michael Widenius

Fixed lp:814238 "safe_mutex issues must be assertions in debug binary"

Added --debug-assert-on-error variable which, if set, will cause safe_mutex to assert if it founds an error.

include/my_sys.h:
  Added my_assert_on_error
mysys/my_static.c:
  Added my_assert_on_error
mysys/thr_mutex.c:
  Assert when found wrong mutex usage if my_assert_on_error is set
sql/mysqld.cc:
  Added setting of my_assert_on_error
parent 37a8497d
...@@ -255,6 +255,7 @@ extern ulong my_file_total_opened; ...@@ -255,6 +255,7 @@ extern ulong my_file_total_opened;
extern ulong my_sync_count; extern ulong my_sync_count;
extern uint mysys_usage_id; extern uint mysys_usage_id;
extern my_bool my_init_done; extern my_bool my_init_done;
extern my_bool my_assert_on_error;
extern myf my_global_flags; /* Set to MY_WME for more error messages */ extern myf my_global_flags; /* Set to MY_WME for more error messages */
/* Point to current my_message() */ /* Point to current my_message() */
extern void (*my_sigtstp_cleanup)(void), extern void (*my_sigtstp_cleanup)(void),
......
...@@ -32,7 +32,8 @@ char NEAR curr_dir[FN_REFLEN]= {0}, ...@@ -32,7 +32,8 @@ char NEAR curr_dir[FN_REFLEN]= {0},
ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0; ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0;
ulong my_file_total_opened= 0; ulong my_file_total_opened= 0;
int NEAR my_umask=0664, NEAR my_umask_dir=0777; int NEAR my_umask=0664, NEAR my_umask_dir=0777;
myf my_global_flags; myf my_global_flags= 0;
my_bool my_assert_on_error= 0;
#ifndef THREAD #ifndef THREAD
int NEAR my_errno=0; int NEAR my_errno=0;
#endif #endif
......
...@@ -836,6 +836,7 @@ static void print_deadlock_warning(safe_mutex_t *new_mutex, ...@@ -836,6 +836,7 @@ static void print_deadlock_warning(safe_mutex_t *new_mutex,
mutex_root->file, mutex_root->line)); mutex_root->file, mutex_root->line));
} }
fflush(stderr); fflush(stderr);
DBUG_ASSERT(my_assert_on_error == 0);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -6068,7 +6068,9 @@ enum options_mysqld ...@@ -6068,7 +6068,9 @@ enum options_mysqld
OPT_SECURE_FILE_PRIV, OPT_SECURE_FILE_PRIV,
OPT_MIN_EXAMINED_ROW_LIMIT, OPT_MIN_EXAMINED_ROW_LIMIT,
OPT_LOG_SLOW_SLAVE_STATEMENTS, OPT_LOG_SLOW_SLAVE_STATEMENTS,
OPT_DEBUG_CRC, OPT_DEBUG_ON, OPT_DEBUG_ASSERT_IF_CRASHED_TABLE, OPT_OLD_MODE, OPT_DEBUG_CRC, OPT_DEBUG_ON, OPT_DEBUG_ASSERT_IF_CRASHED_TABLE,
OPT_DEBUG_ASSERT_ON_ERROR,
OPT_OLD_MODE,
OPT_TEST_IGNORE_WRONG_OPTIONS, OPT_TEST_RESTART, OPT_TEST_IGNORE_WRONG_OPTIONS, OPT_TEST_RESTART,
#if defined(ENABLED_DEBUG_SYNC) #if defined(ENABLED_DEBUG_SYNC)
OPT_DEBUG_SYNC_TIMEOUT, OPT_DEBUG_SYNC_TIMEOUT,
...@@ -6243,6 +6245,10 @@ struct my_option my_long_options[] = ...@@ -6243,6 +6245,10 @@ struct my_option my_long_options[] =
"Do an assert in handler::print_error() if we get a crashed table", "Do an assert in handler::print_error() if we get a crashed table",
&debug_assert_if_crashed_table, &debug_assert_if_crashed_table, &debug_assert_if_crashed_table, &debug_assert_if_crashed_table,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"debug-assert-on-error", OPT_DEBUG_ASSERT_ON_ERROR,
"Do an assert in various functions if we get a fatal error",
&my_assert_on_error, &my_assert_on_error,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif
{"default-character-set", OPT_DEFAULT_CHARACTER_SET_OLD, {"default-character-set", OPT_DEFAULT_CHARACTER_SET_OLD,
"Set the default character set (deprecated option, use --character-set-server instead).", "Set the default character set (deprecated option, use --character-set-server instead).",
...@@ -9422,14 +9428,17 @@ static int get_options(int *argc,char **argv) ...@@ -9422,14 +9428,17 @@ static int get_options(int *argc,char **argv)
my_crc_dbug_check= opt_my_crc_dbug_check; my_crc_dbug_check= opt_my_crc_dbug_check;
/* /*
Log mysys errors when we don't have a thd or thd->log_all_errors is set (recovery) to Log mysys errors when we don't have a thd or thd->log_all_errors is set
the log. This is mainly useful for debugging strange system errors. (recovery) to the log. This is mainly useful for debugging strange system
errors.
*/ */
if (global_system_variables.log_warnings >= 10) if (global_system_variables.log_warnings >= 10)
my_global_flags= MY_WME | ME_JUST_INFO; my_global_flags= MY_WME | ME_JUST_INFO;
/* Log all errors not handled by thd->handle_error() to my_message_sql() */ /* Log all errors not handled by thd->handle_error() to my_message_sql() */
if (global_system_variables.log_warnings >= 11) if (global_system_variables.log_warnings >= 11)
my_global_flags|= ME_NOREFRESH; my_global_flags|= ME_NOREFRESH;
if (my_assert_on_error)
debug_assert_if_crashed_table= 1;
/* long_query_time is in microseconds */ /* long_query_time is in microseconds */
global_system_variables.long_query_time= max_system_variables.long_query_time= global_system_variables.long_query_time= max_system_variables.long_query_time=
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment