Commit b0ff7916 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-24054 Assertion in_LRU_list failed in buf_flush_try_neighbors()

buf_flush_try_neighbors(): Before invoking buf_page_t::ready_for_flush(),
check that the freshly looked up buf_pool.page_hash entry actually is
a buffer page and not a buf_pool.watch[] sentinel for purge buffering.

This race condition was introduced in MDEV-15053
(commit b1ab211d).
It is rather hard to hit this bug, because
buf_flush_check_neighbors() already checked the condition.
The problem exists if buf_pool.watch_set() was invoked for
a page in the range after the check in buf_flush_check_neighbor()
had been finished.
parent 03357ded
......@@ -1106,7 +1106,8 @@ static ulint buf_flush_try_neighbors(fil_space_t *space,
because the flushed blocks are soon freed */
if (!lru || id == page_id || bpage->is_old())
{
if (bpage->ready_for_flush() && buf_flush_page(bpage, lru, space))
if (!buf_pool.watch_is_sentinel(*bpage) &&
bpage->ready_for_flush() && buf_flush_page(bpage, lru, space))
{
++count;
continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment