From: Inaam Rana Date: Fri, 17 Jul 2026 15:29:03 +0000 Subject: [PATCH] Fix dblwr performance regression in upstream This is a fix for https://bugs.mysql.com/bug.php?id=116209. It handles two things: 1) Any zero filled pages in the dblwr are pruned out 2) For a given space_id the dblwr recovery is called only once. This protects us against calling recovery on the same space_id multiple times due to MLOG_FILE_EXTEND records in the log stream. diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 3eb92075295..ce2a5109c90 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -45,6 +45,7 @@ Atomic writes handling. */ #include #include #include +#include #include /** Doublewrite buffer */ @@ -356,6 +357,9 @@ class Pages { /** Page entries from reduced doublewrite buffer */ Page_entries m_page_entries; + /** Spaces that have been recovered */ + std::unordered_set m_recovered_spaces; + // Disable copying Pages(const Pages &) = delete; Pages(Pages &&) = delete; @@ -3169,6 +3173,11 @@ void recv::Pages::recover(fil_space_t *space) noexcept { return; } + if (space != nullptr && m_recovered_spaces.contains(space->id)) { + /* Already recovered this space. No need to do it again. */ + return; + } + auto recover_all = (space == nullptr); for (const auto &page : m_pages) { @@ -3193,6 +3202,7 @@ void recv::Pages::recover(fil_space_t *space) noexcept { continue; } + m_recovered_spaces.insert(space->id); fil_space_open_if_needed(space); page->m_recovered = @@ -3206,6 +3216,11 @@ void recv::Pages::recover(fil_space_t *space) noexcept { void recv::Pages::reduced_recover(fil_space_t *space) noexcept { #ifndef UNIV_HOTBACKUP + if (space != nullptr && m_recovered_spaces.contains(space->id)) { + /* Already recovered this space. No need to do it again. */ + return; + } + auto recover_all = (space == nullptr); for (const auto &entry : m_page_entries) { @@ -3225,6 +3240,7 @@ void recv::Pages::reduced_recover(fil_space_t *space) noexcept { continue; } + m_recovered_spaces.insert(space->id); fil_space_open_if_needed(space); bool is_corrupted = false; @@ -3312,6 +3328,10 @@ void recv::Pages::add(page_no_t page_no, const byte *page, if (!dblwr::is_enabled()) { return; } + if (buf_page_is_zeroes(page, univ_page_size)) { + return; + } + /* Make a copy of the page contents. */ auto dblwr_page = ut::new_withkey(UT_NEW_THIS_FILE_PSI_KEY, page_no, page, n_bytes);