diff options
Diffstat (limited to 'innobase/buf')
-rw-r--r-- | innobase/buf/buf0buf.c | 13 | ||||
-rw-r--r-- | innobase/buf/buf0lru.c | 4 |
2 files changed, 16 insertions, 1 deletions
diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c index 16662b6c51c..34fbc5b9f98 100644 --- a/innobase/buf/buf0buf.c +++ b/innobase/buf/buf0buf.c @@ -863,6 +863,19 @@ buf_page_get_known_nowait( mutex_enter(&(buf_pool->mutex)); + if (block->state == BUF_BLOCK_REMOVE_HASH) { + /* Another thread is just freeing the block from the LRU list + of the buffer pool: do not try to access this page; this + attempt to access the page can only come through the hash + index because when the buffer block state is ..._REMOVE_HASH, + we have already removed it from the page address hash table + of the buffer pool. */ + + mutex_exit(&(buf_pool->mutex)); + + return(FALSE); + } + #ifdef UNIV_SYNC_DEBUG buf_block_buf_fix_inc_debug(block, file, line); #else diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index 26bdd7db1fe..4626dc2757b 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -138,6 +138,8 @@ buf_LRU_search_and_free_block( mutex_enter(&(buf_pool->mutex)); + ut_a(block->buf_fix_count == 0); + buf_LRU_block_free_hashed_page(block); freed = TRUE; @@ -435,7 +437,7 @@ buf_LRU_add_block_to_end_low( defined: init it */ buf_LRU_old_init(); - } + } } /********************************************************************** |