diff options
| author | Marko Mäkelä <marko.makela@mariadb.com> | 2023-05-11 14:27:32 +0300 |
|---|---|---|
| committer | Marko Mäkelä <marko.makela@mariadb.com> | 2023-05-11 14:27:32 +0300 |
| commit | 717e3b3cfdb167e8b930323397dc6e852ef94f17 (patch) | |
| tree | babecdfa58ce6cf768f2d0d8d80e9435df64d33f | |
| parent | 2763f733ee21572ae7a6e317e2e558d0a4842223 (diff) | |
| parent | c271057288f71746d1816824f338f2d9c47f67c1 (diff) | |
| download | mariadb-git-717e3b3cfdb167e8b930323397dc6e852ef94f17.tar.gz | |
Merge 10.6 into 10.9
| -rw-r--r-- | storage/innobase/buf/buf0rea.cc | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index 39ecd5de27f..3d7b1f29fac 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -525,7 +525,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 */ @@ -555,7 +555,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) { buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(i.fold()); transactional_shared_lock_guard<page_hash_latch> g @@ -583,12 +583,21 @@ failed: if (prev == FIL_NULL || next == FIL_NULL) goto 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 fail; + else + id.set_page_no(prev); + } else - goto fail; /* Successor or predecessor not in the right order */ + { + if (prev + 1 != page_id.page_no()) + goto 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); @@ -620,7 +629,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; |
