mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
MDEV-29967 innodb_read_ahead_threshold (linear read-ahead) does not work
buf_read_ahead_linear(): Correct some calculations that were broken
in commit b1ab211dee (MDEV-15053).
Thanks to Daniel Black for providing a test case and initial debugging.
Tested by: Matthias Leich
This commit is contained in:
parent
d4dd634529
commit
279d0120f5
1 changed files with 17 additions and 8 deletions
|
|
@ -582,7 +582,7 @@ buf_read_ahead_linear(const page_id_t page_id, ulint zip_size, bool ibuf)
|
|||
|
||||
/* We will check that almost all pages in the area have been accessed
|
||||
in the desired order. */
|
||||
const bool descending= page_id == low;
|
||||
const bool descending= page_id != low;
|
||||
|
||||
if (!descending && page_id != high_1)
|
||||
/* This is not a border page of the area */
|
||||
|
|
@ -612,7 +612,7 @@ fail:
|
|||
uint32_t{buf_pool.read_ahead_area});
|
||||
page_id_t new_low= low, new_high_1= high_1;
|
||||
unsigned prev_accessed= 0;
|
||||
for (page_id_t i= low; i != high_1; ++i)
|
||||
for (page_id_t i= low; i <= high_1; ++i)
|
||||
{
|
||||
const ulint fold= i.fold();
|
||||
page_hash_latch *hash_lock= buf_pool.page_hash.lock<false>(fold);
|
||||
|
|
@ -647,12 +647,21 @@ hard_fail:
|
|||
if (prev == FIL_NULL || next == FIL_NULL)
|
||||
goto hard_fail;
|
||||
page_id_t id= page_id;
|
||||
if (descending && next - 1 == page_id.page_no())
|
||||
id.set_page_no(prev);
|
||||
else if (!descending && prev + 1 == page_id.page_no())
|
||||
id.set_page_no(next);
|
||||
if (descending)
|
||||
{
|
||||
if (id == high_1)
|
||||
++id;
|
||||
else if (next - 1 != page_id.page_no())
|
||||
goto hard_fail;
|
||||
else
|
||||
id.set_page_no(prev);
|
||||
}
|
||||
else
|
||||
goto hard_fail; /* Successor or predecessor not in the right order */
|
||||
{
|
||||
if (prev + 1 != page_id.page_no())
|
||||
goto hard_fail;
|
||||
id.set_page_no(next);
|
||||
}
|
||||
|
||||
new_low= id - (id.page_no() % buf_read_ahead_area);
|
||||
new_high_1= new_low + (buf_read_ahead_area - 1);
|
||||
|
|
@ -693,7 +702,7 @@ failed:
|
|||
/* If we got this far, read-ahead can be sensible: do it */
|
||||
count= 0;
|
||||
for (ulint ibuf_mode= ibuf ? BUF_READ_IBUF_PAGES_ONLY : BUF_READ_ANY_PAGE;
|
||||
new_low != new_high_1; ++new_low)
|
||||
new_low <= new_high_1; ++new_low)
|
||||
{
|
||||
if (ibuf_bitmap_page(new_low, zip_size))
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue