From 572e53d8ccf68ec04722d9868ed50db0276d6d54 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 19 Jun 2020 15:24:16 +0530 Subject: MDEV-22931 mtr_t::mtr_t() allocates some memory mtr_t::m_freed_pages: Renamed from m_freed_ranges and made it as pointer indirection. mtr_t::add_freed_offset(): Allocates m_freed_pages. mtr_t:clear_freed_ranges(): Removed. mtr_t::init(): Added debug assertion to check whether m_freed_pages is not yet initialized. btr_page_alloc_low(): Remove #ifdef UNIV_DEBUG_SCRUBBING. mtr_t::commit(): Delete m_freed_pages, reset m_trim_pages and m_freed_in_system_tablespace. fil_space_t::clear_freed_ranges(): Added a comment to explain how undo log tablespaces uses it. --- storage/innobase/btr/btr0btr.cc | 16 ---------------- storage/innobase/include/fil0fil.h | 3 ++- storage/innobase/include/mtr0log.h | 1 + storage/innobase/include/mtr0mtr.h | 13 ++++--------- storage/innobase/mtr/mtr0mtr.cc | 30 ++++++++++++++---------------- 5 files changed, 21 insertions(+), 42 deletions(-) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 11104f078ff..43a3b44903f 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -537,22 +537,6 @@ btr_page_alloc_low( seg_header, hint_page_no, file_direction, true, mtr, init_mtr); -#ifdef UNIV_DEBUG_SCRUBBING - if (block != NULL) { - fprintf(stderr, - "alloc %lu:%lu to index: %lu root: %lu\n", - buf_block_get_page_no(block), - buf_block_get_space(block), - index->id, - dict_index_get_page(index)); - } else { - fprintf(stderr, - "failed alloc index: %lu root: %lu\n", - index->id, - dict_index_get_page(index)); - } -#endif /* UNIV_DEBUG_SCRUBBING */ - return block; } diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 7d0402574d6..6bc150184ef 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -502,7 +502,8 @@ struct fil_space_t last_freed_lsn= lsn; } - /** Clear all freed ranges */ + /** Clear all freed ranges for undo tablespace when InnoDB + encounters TRIM redo log record */ void clear_freed_ranges() { std::lock_guard freed_lock(freed_range_mutex); diff --git a/storage/innobase/include/mtr0log.h b/storage/innobase/include/mtr0log.h index cf5f7c751ee..926411a6f97 100644 --- a/storage/innobase/include/mtr0log.h +++ b/storage/innobase/include/mtr0log.h @@ -511,6 +511,7 @@ inline void mtr_t::memcpy(const buf_block_t &b, void *dest, const void *str, @param[in,out] b buffer page */ inline void mtr_t::init(buf_block_t *b) { + ut_ad(!m_freed_pages); b->page.status= buf_page_t::INIT_ON_FLUSH; if (m_log_mode != MTR_LOG_ALL) diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index cd1b9bef4aa..6058d0daaf6 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -580,16 +580,11 @@ public: void add_freed_offset(page_id_t id) { ut_ad(m_user_space == NULL || id.space() == m_user_space->id); - m_freed_ranges.add_value(id.page_no()); + if (!m_freed_pages) + m_freed_pages= new range_set(); + m_freed_pages->add_value(id.page_no()); } - /** Clear the freed pages */ - void clear_freed_ranges() - { - m_freed_ranges.clear(); - m_freed_in_system_tablespace= 0; - m_trim_pages= false; - } private: /** Log a write of a byte string to a page. @param block buffer page @@ -685,7 +680,7 @@ private: lsn_t m_commit_lsn; /** set of freed page ids */ - range_set m_freed_ranges; + range_set *m_freed_pages= nullptr; }; #include "mtr0mtr.ic" diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 0997a735699..2a2f61641fe 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -354,12 +354,8 @@ struct mtr_write_log_t { /** Start a mini-transaction. */ void mtr_t::start() { -#ifdef HAVE_valgrind_or_MSAN - char m_freed_ranges_vbits[sizeof m_freed_ranges]; -#endif - MEM_GET_VBITS(&m_freed_ranges, m_freed_ranges_vbits, sizeof m_freed_ranges); UNIV_MEM_INVALID(this, sizeof *this); - MEM_SET_VBITS(&m_freed_ranges, m_freed_ranges_vbits, sizeof m_freed_ranges); + UNIV_MEM_VALID(&m_freed_pages, sizeof(m_freed_pages)); ut_d(m_start= true); ut_d(m_commit= false); @@ -378,6 +374,7 @@ void mtr_t::start() m_user_space= nullptr; m_commit_lsn= 0; m_freed_in_system_tablespace= m_trim_pages= false; + ut_ad(!m_freed_pages); } /** Release the resources */ @@ -387,7 +384,6 @@ inline void mtr_t::release_resources() ut_d(m_memo.for_each_block_in_reverse(CIterate())); m_log.erase(); m_memo.erase(); - clear_freed_ranges(); ut_d(m_commit= true); } @@ -420,8 +416,9 @@ void mtr_t::commit() to insert into the flush list. */ log_mutex_exit(); - if (!m_freed_ranges.empty()) + if (m_freed_pages) { + ut_ad(!m_freed_pages->empty()); fil_space_t *freed_space= m_user_space; /* Get the freed tablespace in case of predefined tablespace */ if (!freed_space) @@ -434,14 +431,15 @@ void mtr_t::commit() /* Update the last freed lsn */ freed_space->update_last_freed_lsn(m_commit_lsn); - for (const auto &range : m_freed_ranges) - freed_space->add_free_range(range); - } - - if (is_trim_pages()) - { - ut_ad(m_user_space != nullptr); - m_user_space->clear_freed_ranges(); + if (!is_trim_pages()) + for (const auto &range : *m_freed_pages) + freed_space->add_free_range(range); + else + freed_space->clear_freed_ranges(); + delete m_freed_pages; + m_freed_pages= nullptr; + /* Reset of m_trim_pages and m_freed_in_system_tablespace + happens in mtr_t::start() */ } m_memo.for_each_block_in_reverse(CIterate @@ -472,7 +470,7 @@ void mtr_t::commit_files(lsn_t checkpoint_lsn) ut_ad(!m_made_dirty); ut_ad(m_memo.size() == 0); ut_ad(!srv_read_only_mode); - ut_ad(m_freed_ranges.empty()); + ut_ad(!m_freed_pages); ut_ad(!m_freed_in_system_tablespace); if (checkpoint_lsn) { -- cgit v1.2.1