summaryrefslogtreecommitdiff
path: root/storage/innobase/buf/buf0lru.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/buf/buf0lru.cc')
-rw-r--r--storage/innobase/buf/buf0lru.cc26
1 files changed, 16 insertions, 10 deletions
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index c00dd414aa6..cfe3f9a6bcb 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -2165,25 +2165,31 @@ buf_LRU_block_free_hashed_page(
buf_page_mutex_exit(block);
}
-/******************************************************************//**
-Remove one page from LRU list and put it to free list */
-void
-buf_LRU_free_one_page(
-/*==================*/
- buf_page_t* bpage) /*!< in/out: block, must contain a file page and
- be in a state where it can be freed; there
- may or may not be a hash index to the page */
+/** Remove one page from LRU list and put it to free list.
+@param[in,out] bpage block, must contain a file page and be in
+ a freeable state; there may or may not be a
+ hash index to the page
+@param[in] old_page_id page number before bpage->id was invalidated */
+void buf_LRU_free_one_page(buf_page_t* bpage, page_id_t old_page_id)
{
buf_pool_t* buf_pool = buf_pool_from_bpage(bpage);
-
- rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool, bpage->id);
+ rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool,
+ old_page_id);
BPageMutex* block_mutex = buf_page_get_mutex(bpage);
ut_ad(buf_pool_mutex_own(buf_pool));
rw_lock_x_lock(hash_lock);
+
+ while (buf_block_get_fix(bpage) > 0) {
+ /* Wait for other threads to release the fix count
+ before releasing the bpage from LRU list. */
+ }
+
mutex_enter(block_mutex);
+ bpage->id = old_page_id;
+
if (buf_LRU_block_remove_hashed(bpage, true)) {
buf_LRU_block_free_hashed_page((buf_block_t*) bpage);
}