diff options
author | Yoni Fogel <yoni@tokutek.com> | 2013-07-05 14:11:31 -0700 |
---|---|---|
committer | Yoni Fogel <yoni@tokutek.com> | 2013-07-05 14:11:31 -0700 |
commit | 4279e16c5a031f1148d1a2e473c5da518905d3e0 (patch) | |
tree | eaf5dc07e0feac350b4a33677855d7d1da4c686e /storage | |
parent | e69e0cff9adddebe564331b4a6bd3403d814c6ef (diff) | |
download | mariadb-git-4279e16c5a031f1148d1a2e473c5da518905d3e0.tar.gz |
Refs Tokutek/ft-index#28 attach gdb to the running process and extract information on fatal signal.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/tokudb/hatoku_hton.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/storage/tokudb/hatoku_hton.cc b/storage/tokudb/hatoku_hton.cc index 725275cd963..c4c0f4620e3 100644 --- a/storage/tokudb/hatoku_hton.cc +++ b/storage/tokudb/hatoku_hton.cc @@ -316,6 +316,7 @@ static void tokudb_cleanup_log_files(void); static int tokudb_end(handlerton * hton, ha_panic_function type); static bool tokudb_flush_logs(handlerton * hton); static bool tokudb_show_status(handlerton * hton, THD * thd, stat_print_fn * print, enum ha_stat_type); +static void tokudb_handle_fatal_signal(handlerton *hton, THD *thd, int sig); static int tokudb_close_connection(handlerton * hton, THD * thd); static int tokudb_commit(handlerton * hton, THD * thd, bool all); static int tokudb_rollback(handlerton * hton, THD * thd, bool all); @@ -342,6 +343,9 @@ HASH tokudb_open_tables; pthread_mutex_t tokudb_mutex; pthread_mutex_t tokudb_meta_mutex; +static my_bool tokudb_gdb_on_fatal; +static char *tokudb_gdb_path; + static PARTITIONED_COUNTER tokudb_primary_key_bytes_inserted; void toku_hton_update_primary_key_bytes_inserted(uint64_t row_size) { increment_partitioned_counter(tokudb_primary_key_bytes_inserted, row_size); @@ -493,6 +497,7 @@ static int tokudb_init_func(void *p) { tokudb_hton->panic = tokudb_end; tokudb_hton->flush_logs = tokudb_flush_logs; tokudb_hton->show_status = tokudb_show_status; + tokudb_hton->handle_fatal_signal = tokudb_handle_fatal_signal; if (!tokudb_home) tokudb_home = mysql_real_data_home; DBUG_PRINT("info", ("tokudb_home: %s", tokudb_home)); @@ -1855,6 +1860,14 @@ static bool tokudb_show_status(handlerton * hton, THD * thd, stat_print_fn * sta return false; } +static void tokudb_handle_fatal_signal(handlerton *hton __attribute__ ((__unused__)), + THD *thd __attribute__ ((__unused__)), + int sig) { + if (tokudb_gdb_on_fatal) { + db_env_try_gdb_stack_trace(tokudb_gdb_path); + } +} + static void tokudb_print_error(const DB_ENV * db_env, const char *db_errpfx, const char *buffer) { sql_print_error("%s: %s", db_errpfx, buffer); } @@ -1985,6 +1998,10 @@ static MYSQL_SYSVAR_UINT(read_status_frequency, tokudb_read_status_frequency, 0, static MYSQL_SYSVAR_INT(fs_reserve_percent, tokudb_fs_reserve_percent, PLUGIN_VAR_READONLY, "TokuDB file system space reserve (percent free required)", NULL, NULL, 5, 0, 100, 0); static MYSQL_SYSVAR_STR(tmp_dir, tokudb_tmp_dir, PLUGIN_VAR_READONLY, "Tokudb Tmp Dir", NULL, NULL, NULL); +static MYSQL_SYSVAR_STR(gdb_path, tokudb_gdb_path, PLUGIN_VAR_READONLY|PLUGIN_VAR_RQCMDARG, "TokuDB path to gdb for extra debug info on fatal signal", NULL, NULL, "/usr/bin/gdb"); + +static MYSQL_SYSVAR_BOOL(gdb_on_fatal, tokudb_gdb_on_fatal, 0, "TokuDB enable gdb debug info on fatal signal", NULL, NULL, true); + static void tokudb_fsync_log_period_update(THD *thd, struct st_mysql_sys_var *sys_var, void *var, const void *save) { uint32 *period = (uint32 *) var; *period = *(const ulonglong *) save; @@ -2031,6 +2048,8 @@ static struct st_mysql_sys_var *tokudb_system_variables[] = { #endif MYSQL_SYSVAR(analyze_time), MYSQL_SYSVAR(fsync_log_period), + MYSQL_SYSVAR(gdb_path), + MYSQL_SYSVAR(gdb_on_fatal), NULL }; |