diff --git a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c index 6b1df957194..559e96afcd9 100644 --- a/storage/innobase/srv/srv0srv.c +++ b/storage/innobase/srv/srv0srv.c @@ -1666,11 +1666,16 @@ srv_release_mysql_thread_if_suspended( /********************************************************************** Refreshes the values used to calculate per-second averages. */ static -void +ibool srv_refresh_innodb_monitor_stats(void) /*==================================*/ { - mutex_enter(&srv_innodb_monitor_mutex); + /* Sometimes we will skip stats update to avoid deadlock, since + since this function is called by the background wake-up thread */ + if (mutex_enter_nowait(&srv_innodb_monitor_mutex)) { + /* mutex_enter_nowait returns 1 on failure */ + return FALSE; + } srv_last_monitor_time = time(NULL); @@ -1689,6 +1694,7 @@ srv_refresh_innodb_monitor_stats(void) srv_n_rows_read_old = srv_n_rows_read; mutex_exit(&srv_innodb_monitor_mutex); + return TRUE; } /********************************************************************** @@ -2126,7 +2132,10 @@ exit_func: /************************************************************************* A thread which prints warnings about semaphore waits which have lasted -too long. These can be used to track bugs which cause hangs. */ +too long. These can be used to track bugs which cause hangs. +NOTE: This thread should not wait for any innodb mutexes or rw_locks. +A deadlock could arise where the thread holding that lock requires waking +by this background thread while this thread is blocked on that lock. */ os_thread_ret_t srv_error_monitor_thread( @@ -2138,10 +2147,6 @@ srv_error_monitor_thread( { /* number of successive fatal timeouts observed */ ulint fatal_cnt = 0; - dulint old_lsn; - dulint new_lsn; - - old_lsn = srv_start_lsn; #ifdef UNIV_DEBUG_THREAD_CREATION fprintf(stderr, "Error monitor thread starts, id %lu\n", @@ -2150,29 +2155,8 @@ srv_error_monitor_thread( loop: srv_error_monitor_active = TRUE; - /* Try to track a strange bug reported by Harald Fuchs and others, - where the lsn seems to decrease at times */ - - new_lsn = log_get_lsn(); - - if (ut_dulint_cmp(new_lsn, old_lsn) < 0) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: old log sequence number %lu %lu" - " was greater\n" - "InnoDB: than the new log sequence number %lu %lu!\n" - "InnoDB: Please submit a bug report" - " to http://bugs.mysql.com\n", - (ulong) ut_dulint_get_high(old_lsn), - (ulong) ut_dulint_get_low(old_lsn), - (ulong) ut_dulint_get_high(new_lsn), - (ulong) ut_dulint_get_low(new_lsn)); - } - - old_lsn = new_lsn; - if (difftime(time(NULL), srv_last_monitor_time) > 60) { - /* We referesh InnoDB Monitor values so that averages are + /* We refresh InnoDB Monitor values so that averages are printed from at most 60 last seconds */ srv_refresh_innodb_monitor_stats();