diff --git a/storage/innobase/btr/btr0load.cc b/storage/innobase/btr/btr0load.cc index c0b99f5..cde1eeb 100644 --- a/storage/innobase/btr/btr0load.cc +++ b/storage/innobase/btr/btr0load.cc @@ -100,7 +100,7 @@ class Page_load : private ut::Non_copyable { /** Initialize members and allocate page if needed and start mtr. @note Must be called and only once right after constructor. @return error code */ - [[nodiscard]] dberr_t init() noexcept; + [[nodiscard]] dberr_t init(page_no_t hint_page_no) noexcept; /** Insert a tuple in the page. @param[in] tuple Tuple to insert @@ -293,7 +293,7 @@ class Page_load : private ut::Non_copyable { friend class Btree_load; }; -dberr_t Page_load::init() noexcept { +dberr_t Page_load::init(page_no_t hint_page_no) noexcept { page_t *new_page; page_no_t new_page_no; buf_block_t *new_block; @@ -335,7 +335,7 @@ dberr_t Page_load::init() noexcept { } /* Allocate a new page. */ - new_block = btr_page_alloc(m_index, 0, FSP_UP, m_level, &alloc_mtr, mtr); + new_block = btr_page_alloc(m_index, hint_page_no, FSP_UP, m_level, &alloc_mtr, mtr); if (n_reserved > 0) { fil_space_release_free_extents(m_index->space, n_reserved); @@ -901,11 +901,13 @@ dberr_t Btree_load::page_split(Page_load *page_loader, return DB_TOO_BIG_RECORD; } + page_no_t page_no = page_loader->m_page_no; + /* 2. create a new page. */ Page_load new_page_loader(m_index, m_trx_id, FIL_NULL, page_loader->get_level(), m_flush_observer); - err = new_page_loader.init(); + err = new_page_loader.init(page_no == FIL_NULL? 0 : page_no + 1); if (err != DB_SUCCESS) { return err; @@ -1023,6 +1025,8 @@ dberr_t Btree_load::prepare_space(Page_load *&page_loader, size_t level, return DB_SUCCESS; } + page_no_t page_no = page_loader->m_page_no; + /* Finish page modifications. */ page_loader->finish(); @@ -1038,7 +1042,7 @@ dberr_t Btree_load::prepare_space(Page_load *&page_loader, size_t level, } { - auto err = sibling_page_loader->init(); + auto err = sibling_page_loader->init(page_no == FIL_NULL? 0 : page_no + 1); if (err != DB_SUCCESS) { ut::delete_(sibling_page_loader); @@ -1104,7 +1108,7 @@ dberr_t Btree_load::insert(dtuple_t *tuple, size_t level) noexcept { return DB_OUT_OF_MEMORY; } - err = page_loader->init(); + err = page_loader->init(0); if (err != DB_SUCCESS) { return err; @@ -1241,7 +1245,7 @@ dberr_t Btree_load::load_root_page(page_no_t last_page_no) noexcept { auto last_page = buf_block_get_frame(last_block); /* Copy last page to root page. */ - auto err = page_loader.init(); + auto err = page_loader.init(0); if (err == DB_SUCCESS) { page_loader.copy_all(last_page);