diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-10-30 19:06:50 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-10-30 19:06:50 +0200 |
commit | b0ff791618d97487fb7515d3f785b37f46eba132 (patch) | |
tree | 98788aedae6984f2fca64e158be099c113afd858 | |
parent | 03357ded174c13d941abc37e8c12506d75aaa52d (diff) | |
download | mariadb-git-b0ff791618d97487fb7515d3f785b37f46eba132.tar.gz |
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 b1ab211dee599eabd9a5b886fafa3adea29ae041).
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.
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index cc2f4c36fa4..ac6c45deeab 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -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; |