This is an automated email from the ASF dual-hosted git repository. dataroaring pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new 44df61b4561 branch-3.0: [fix](memory) Fix init segment map check memory exceeds limit (#47403) 44df61b4561 is described below commit 44df61b456191cb036eb043d77773a87a747c330 Author: Xinyi Zou <zouxi...@selectdb.com> AuthorDate: Thu Feb 6 19:42:01 2025 +0800 branch-3.0: [fix](memory) Fix init segment map check memory exceeds limit (#47403) Cherry-picked from #44092 --- be/src/olap/rowid_conversion.h | 30 ++++++++++++++++++++---------- be/src/olap/rowset/beta_rowset_reader.cpp | 3 ++- be/test/olap/rowid_conversion_test.cpp | 6 ++++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/be/src/olap/rowid_conversion.h b/be/src/olap/rowid_conversion.h index 01a2cea0d5e..8f9d96a136a 100644 --- a/be/src/olap/rowid_conversion.h +++ b/be/src/olap/rowid_conversion.h @@ -37,21 +37,33 @@ public: ~RowIdConversion() { RELEASE_THREAD_MEM_TRACKER(_seg_rowid_map_mem_used); } // resize segment rowid map to its rows num - void init_segment_map(const RowsetId& src_rowset_id, const std::vector<uint32_t>& num_rows) { - size_t delta_std_pair_cap = 0; + Status init_segment_map(const RowsetId& src_rowset_id, const std::vector<uint32_t>& num_rows) { for (size_t i = 0; i < num_rows.size(); i++) { + constexpr size_t RESERVED_MEMORY = 10 * 1024 * 1024; // 10M + if (doris::GlobalMemoryArbitrator::is_exceed_hard_mem_limit(RESERVED_MEMORY)) { + return Status::MemoryLimitExceeded(fmt::format( + "RowIdConversion init_segment_map failed, memory exceed limit, {}, " + "consuming " + "tracker:<{}>, peak used {}, current used {}.", + doris::GlobalMemoryArbitrator::process_limit_exceeded_errmsg_str(), + doris::thread_context()->thread_mem_tracker()->label(), + doris::thread_context()->thread_mem_tracker()->peak_consumption(), + doris::thread_context()->thread_mem_tracker()->consumption())); + } + uint32_t id = _segments_rowid_map.size(); _segment_to_id_map.emplace(std::pair<RowsetId, uint32_t> {src_rowset_id, i}, id); _id_to_segment_map.emplace_back(src_rowset_id, i); std::vector<std::pair<uint32_t, uint32_t>> vec( num_rows[i], std::pair<uint32_t, uint32_t>(UINT32_MAX, UINT32_MAX)); - delta_std_pair_cap += vec.capacity(); + + //NOTE: manually count _segments_rowid_map's memory here, because _segments_rowid_map could be used by indexCompaction. + // indexCompaction is a thridparty code, it's too complex to modify it. + // refer compact_column. + track_mem_usage(vec.capacity()); _segments_rowid_map.emplace_back(std::move(vec)); } - //NOTE: manually count _segments_rowid_map's memory here, because _segments_rowid_map could be used by indexCompaction. - // indexCompaction is a thridparty code, it's too complex to modify it. - // refer compact_column. - track_mem_usage(delta_std_pair_cap); + return Status::OK(); } // set dst rowset id @@ -124,9 +136,7 @@ private: size_t new_size = _std_pair_cap * sizeof(std::pair<uint32_t, uint32_t>) + _segments_rowid_map.capacity() * sizeof(std::vector<std::pair<uint32_t, uint32_t>>); - - RELEASE_THREAD_MEM_TRACKER(_seg_rowid_map_mem_used); - CONSUME_THREAD_MEM_TRACKER(new_size); + CONSUME_THREAD_MEM_TRACKER(new_size - _seg_rowid_map_mem_used); _seg_rowid_map_mem_used = new_size; } diff --git a/be/src/olap/rowset/beta_rowset_reader.cpp b/be/src/olap/rowset/beta_rowset_reader.cpp index d690b9b58d5..9a4d71587a0 100644 --- a/be/src/olap/rowset/beta_rowset_reader.cpp +++ b/be/src/olap/rowset/beta_rowset_reader.cpp @@ -244,7 +244,8 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context // init segment rowid map for rowid conversion std::vector<uint32_t> segment_num_rows; RETURN_IF_ERROR(get_segment_num_rows(&segment_num_rows)); - _read_context->rowid_conversion->init_segment_map(rowset()->rowset_id(), segment_num_rows); + RETURN_IF_ERROR(_read_context->rowid_conversion->init_segment_map(rowset()->rowset_id(), + segment_num_rows)); } auto [seg_start, seg_end] = _segment_offsets; diff --git a/be/test/olap/rowid_conversion_test.cpp b/be/test/olap/rowid_conversion_test.cpp index d48d4150ad3..df56cd0559e 100644 --- a/be/test/olap/rowid_conversion_test.cpp +++ b/be/test/olap/rowid_conversion_test.cpp @@ -490,10 +490,12 @@ TEST_F(TestRowIdConversion, Basic) { RowIdConversion rowid_conversion; src_rowset.init(0); std::vector<uint32_t> rs0_segment_num_rows = {4, 3}; - rowid_conversion.init_segment_map(src_rowset, rs0_segment_num_rows); + auto st = rowid_conversion.init_segment_map(src_rowset, rs0_segment_num_rows); + EXPECT_EQ(st.ok(), true); src_rowset.init(1); std::vector<uint32_t> rs1_segment_num_rows = {4}; - rowid_conversion.init_segment_map(src_rowset, rs1_segment_num_rows); + st = rowid_conversion.init_segment_map(src_rowset, rs1_segment_num_rows); + EXPECT_EQ(st.ok(), true); rowid_conversion.set_dst_rowset_id(dst_rowset); std::vector<uint32_t> dst_segment_num_rows = {4, 3, 4}; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org