diff options
Diffstat (limited to 'innobase/sync/sync0arr.c')
-rw-r--r-- | innobase/sync/sync0arr.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index 9bcee34a7d1..8082f598b0c 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -14,6 +14,7 @@ Created 9/5/1995 Heikki Tuuri #include "sync0sync.h" #include "sync0rw.h" #include "os0sync.h" +#include "os0file.h" #include "srv0srv.h" /* @@ -99,6 +100,7 @@ struct sync_array_struct { since creation of the array */ }; +#ifdef UNIV_SYNC_DEBUG /********************************************************************** This function is called only in the debug version. Detects a deadlock of one or more threads because of waits of semaphores. */ @@ -112,6 +114,7 @@ sync_array_detect_deadlock( sync_cell_t* start, /* in: cell where recursive search started */ sync_cell_t* cell, /* in: cell to search */ ulint depth); /* in: recursion depth */ +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************* Gets the nth cell in array. */ @@ -464,13 +467,17 @@ sync_array_cell_print( mutex = cell->old_wait_mutex; buf += sprintf(buf, - "Mutex at %lx created file %s line %lu, lock var %lu\n", - (ulong) mutex, mutex->cfile_name, - (ulong) mutex->cline, (ulong) mutex->lock_word); - buf += sprintf(buf, - "Last time reserved in file %s line %lu, waiters flag %lu\n", - mutex->file_name, (ulong) mutex->line, - (ulong) mutex->waiters); + "Mutex at %p created file %s line %lu, lock var %lu\n" +#ifdef UNIV_SYNC_DEBUG + "Last time reserved in file %s line %lu, " +#endif /* UNIV_SYNC_DEBUG */ + "waiters flag %lu\n", + mutex, mutex->cfile_name, (ulong) mutex->cline, + (ulong) mutex->lock_word, +#ifdef UNIV_SYNC_DEBUG + mutex->file_name, (ulong) mutex->line, +#endif /* UNIV_SYNC_DEBUG */ + (ulong) mutex->waiters); } else if (type == RW_LOCK_EX || type == RW_LOCK_SHARED) { @@ -522,6 +529,7 @@ sync_array_cell_print( } } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Looks for a cell with the given thread id. */ static @@ -693,7 +701,6 @@ sync_array_detect_deadlock( sync_array_cell_print(buf, cell); printf("rw-lock %lx %s ", (ulong) lock, buf); rw_lock_debug_print(debug); - return(TRUE); } } @@ -743,6 +750,7 @@ sync_array_detect_deadlock( return(TRUE); /* Execution never reaches this line: for compiler fooling only */ } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Determines if we can wake up the thread waiting for a sempahore. */ @@ -936,7 +944,7 @@ sync_array_print_long_waits(void) "InnoDB: We intentionally crash the server, because it appears to be hung.\n" ); - ut_a(0); + ut_error; } } @@ -945,6 +953,16 @@ sync_array_print_long_waits(void) "InnoDB: ###### Starts InnoDB Monitor for 30 secs to print diagnostic info:\n"); old_val = srv_print_innodb_monitor; + /* If some crucial semaphore is reserved, then also the InnoDB + Monitor can hang, and we do not get diagnostics. Since in + many cases an InnoDB hang is caused by a pwrite() or a pread() + call hanging inside the operating system, let us print right + now the values of pending calls of these. */ + + fprintf(stderr, +"InnoDB: Pending preads %lu, pwrites %lu\n", (ulong)os_file_n_pending_preads, + (ulong)os_file_n_pending_pwrites); + srv_print_innodb_monitor = TRUE; os_event_set(srv_lock_timeout_thread_event); |