summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-06-19 15:24:16 +0530
committerThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-06-19 21:12:13 +0530
commit572e53d8ccf68ec04722d9868ed50db0276d6d54 (patch)
tree952e3f6136324831316d5fde62da70fcaf2a0979
parent451bd32600ea5e1fd4b9320ad20104372c050ccb (diff)
downloadmariadb-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.cc16
-rw-r--r--storage/innobase/include/fil0fil.h3
-rw-r--r--storage/innobase/include/mtr0log.h1
-rw-r--r--storage/innobase/include/mtr0mtr.h13
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc30
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) {