diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-06-19 15:24:16 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-06-19 21:12:13 +0530 |
commit | 572e53d8ccf68ec04722d9868ed50db0276d6d54 (patch) | |
tree | 952e3f6136324831316d5fde62da70fcaf2a0979 | |
parent | 451bd32600ea5e1fd4b9320ad20104372c050ccb (diff) | |
download | mariadb-git-572e53d8ccf68ec04722d9868ed50db0276d6d54.tar.gz |
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.
-rw-r--r-- | storage/innobase/btr/btr0btr.cc | 16 | ||||
-rw-r--r-- | storage/innobase/include/fil0fil.h | 3 | ||||
-rw-r--r-- | storage/innobase/include/mtr0log.h | 1 | ||||
-rw-r--r-- | storage/innobase/include/mtr0mtr.h | 13 | ||||
-rw-r--r-- | 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<std::mutex> 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<DebugCheck>())); 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<const ReleaseBlocks> @@ -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) { |