BUG#22530768 Innodb freeze running REPLACE statements

we can see from the hang stacktrace, srv_monitor_thread is blocked
when getting log_sys::mutex, so that sync_arr_wake_threads_if_sema_free
cannot get a change to break the mutex deadlock.

The fix is simply removing any mutex wait in srv_monitor_thread.

Patch is reviewed by Sunny over IM.
This commit is contained in:
Shaohua Wang 2016-01-12 15:08:09 +08:00
parent c06138e46d
commit 79032a7ae1
2 changed files with 21 additions and 17 deletions

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -2103,7 +2103,10 @@ buf_flush_stat_update(void)
ib_uint64_t lsn; ib_uint64_t lsn;
ulint n_flushed; ulint n_flushed;
lsn = log_get_lsn(); if (!log_peek_lsn(&lsn)) {
return;
}
if (buf_flush_stat_cur.redo == 0) { if (buf_flush_stat_cur.redo == 0) {
/* First time around. Just update the current LSN /* First time around. Just update the current LSN
and return. */ and return. */

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc. Copyright (c) 2009, Percona Inc.
@ -2413,6 +2413,8 @@ exit_func:
/*********************************************************************//** /*********************************************************************//**
A thread which prints warnings about semaphore waits which have lasted 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: In order to make sync_arr_wake_threads_if_sema_free work as expected,
we should avoid waiting any mutexes in this function!
@return a dummy parameter */ @return a dummy parameter */
UNIV_INTERN UNIV_INTERN
os_thread_ret_t os_thread_ret_t
@ -2450,9 +2452,7 @@ loop:
/* Try to track a strange bug reported by Harald Fuchs and others, /* Try to track a strange bug reported by Harald Fuchs and others,
where the lsn seems to decrease at times */ where the lsn seems to decrease at times */
if (log_peek_lsn(&new_lsn)) {
new_lsn = log_get_lsn();
if (new_lsn < old_lsn) { if (new_lsn < old_lsn) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
@ -2466,6 +2466,7 @@ loop:
} }
old_lsn = new_lsn; old_lsn = new_lsn;
}
if (difftime(time(NULL), srv_last_monitor_time) > 60) { if (difftime(time(NULL), srv_last_monitor_time) > 60) {
/* We referesh InnoDB Monitor values so that averages are /* We referesh InnoDB Monitor values so that averages are