mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
InnoDB: tolerate system clock glitches a little better
in the error monitor thread. (Bug #5898) innobase/include/sync0arr.h: sync_array_print_long_waits(): return error status innobase/srv/srv0srv.c: srv_error_monitor_thread(): Keep track on successive fatal timeouts, and crash the server only if the timeouts have been exceeded for several times in succession. innobase/sync/sync0arr.c: sync_array_print_long_waits(): return error status
This commit is contained in:
@ -1754,7 +1754,8 @@ srv_error_monitor_thread(
|
||||
/* in: a dummy parameter required by
|
||||
os_thread_create */
|
||||
{
|
||||
ulint cnt = 0;
|
||||
/* number of successive fatal timeouts observed */
|
||||
ulint fatal_cnt = 0;
|
||||
|
||||
#ifdef UNIV_DEBUG_THREAD_CREATION
|
||||
fprintf(stderr, "Error monitor thread starts, id %lu\n",
|
||||
@ -1763,8 +1764,6 @@ srv_error_monitor_thread(
|
||||
loop:
|
||||
srv_error_monitor_active = TRUE;
|
||||
|
||||
cnt++;
|
||||
|
||||
os_thread_sleep(2000000);
|
||||
|
||||
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
|
||||
@ -1774,7 +1773,20 @@ loop:
|
||||
srv_refresh_innodb_monitor_stats();
|
||||
}
|
||||
|
||||
sync_array_print_long_waits();
|
||||
if (sync_array_print_long_waits()) {
|
||||
fatal_cnt++;
|
||||
if (fatal_cnt > 5) {
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: semaphore wait has lasted > %lu seconds\n"
|
||||
"InnoDB: We intentionally crash the server, because it appears to be hung.\n",
|
||||
srv_fatal_semaphore_wait_threshold);
|
||||
|
||||
ut_error;
|
||||
}
|
||||
} else {
|
||||
fatal_cnt = 0;
|
||||
}
|
||||
|
||||
/* Flush stderr so that a database user gets the output
|
||||
to possible MySQL error file */
|
||||
|
Reference in New Issue
Block a user