This is an automated email from the ASF dual-hosted git repository. morningman 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 9f28b4fdcf2 [fix](scan) Avoid memory allocated by buffered_reader from being traced (#41921) (#43478) 9f28b4fdcf2 is described below commit 9f28b4fdcf229aca01ad4e04f9d1f7d4fc8df20c Author: Jerry Hu <mrh...@gmail.com> AuthorDate: Sat Nov 9 19:01:56 2024 +0800 [fix](scan) Avoid memory allocated by buffered_reader from being traced (#41921) (#43478) Pick #41921 --- be/src/io/fs/buffered_reader.cpp | 19 +++++++++++-------- be/src/io/fs/buffered_reader.h | 11 +++-------- be/src/util/slice.h | 6 ++++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/be/src/io/fs/buffered_reader.cpp b/be/src/io/fs/buffered_reader.cpp index 62c0a9c7a0c..20d5684734e 100644 --- a/be/src/io/fs/buffered_reader.cpp +++ b/be/src/io/fs/buffered_reader.cpp @@ -23,6 +23,7 @@ #include <algorithm> #include <chrono> +#include <memory> #include "common/compiler_util.h" // IWYU pragma: keep #include "common/config.h" @@ -31,6 +32,7 @@ #include "runtime/thread_context.h" #include "runtime/workload_management/io_throttle.h" #include "util/runtime_profile.h" +#include "util/slice.h" #include "util/threadpool.h" namespace doris { @@ -270,7 +272,7 @@ void MergeRangeFileReader::_read_in_box(RangeCachedData& cached_data, size_t off } if (copy_out != nullptr) { memcpy(copy_out + to_handle - remaining, - _boxes[box_index] + cached_data.box_start_offset[i], box_to_handle); + _boxes[box_index].data() + cached_data.box_start_offset[i], box_to_handle); } remaining -= box_to_handle; cached_data.box_start_offset[i] += box_to_handle; @@ -307,14 +309,15 @@ void MergeRangeFileReader::_read_in_box(RangeCachedData& cached_data, size_t off Status MergeRangeFileReader::_fill_box(int range_index, size_t start_offset, size_t to_read, size_t* bytes_read, const IOContext* io_ctx) { - if (_read_slice == nullptr) { - _read_slice = new char[READ_SLICE_SIZE]; + if (!_read_slice) { + _read_slice = std::make_unique<OwnedSlice>(READ_SLICE_SIZE); } + *bytes_read = 0; { SCOPED_RAW_TIMER(&_statistics.read_time); - RETURN_IF_ERROR( - _reader->read_at(start_offset, Slice(_read_slice, to_read), bytes_read, io_ctx)); + RETURN_IF_ERROR(_reader->read_at(start_offset, Slice(_read_slice->data(), to_read), + bytes_read, io_ctx)); _statistics.merged_io++; _statistics.merged_bytes += *bytes_read; } @@ -328,8 +331,8 @@ Status MergeRangeFileReader::_fill_box(int range_index, size_t start_offset, siz auto fill_box = [&](int16 fill_box_ref, uint32 box_usage, size_t box_copy_end) { size_t copy_size = std::min(box_copy_end - copy_start, BOX_SIZE - box_usage); - memcpy(_boxes[fill_box_ref] + box_usage, _read_slice + copy_start - start_offset, - copy_size); + memcpy(_boxes[fill_box_ref].data() + box_usage, + _read_slice->data() + copy_start - start_offset, copy_size); filled_boxes.emplace_back(fill_box_ref, box_usage, copy_start, copy_start + copy_size); copy_start += copy_size; _last_box_ref = fill_box_ref; @@ -367,7 +370,7 @@ Status MergeRangeFileReader::_fill_box(int range_index, size_t start_offset, siz } // apply for new box to copy data while (copy_start < range_copy_end && _boxes.size() < NUM_BOX) { - _boxes.emplace_back(new char[BOX_SIZE]); + _boxes.emplace_back(BOX_SIZE); _box_ref.emplace_back(0); fill_box(_boxes.size() - 1, 0, range_copy_end); } diff --git a/be/src/io/fs/buffered_reader.h b/be/src/io/fs/buffered_reader.h index 70c8445db23..907ea11b216 100644 --- a/be/src/io/fs/buffered_reader.h +++ b/be/src/io/fs/buffered_reader.h @@ -168,12 +168,7 @@ public: } } - ~MergeRangeFileReader() override { - delete[] _read_slice; - for (char* box : _boxes) { - delete[] box; - } - } + ~MergeRangeFileReader() override = default; Status close() override { if (!_closed) { @@ -244,8 +239,8 @@ private: bool _closed = false; size_t _remaining; - char* _read_slice = nullptr; - std::vector<char*> _boxes; + std::unique_ptr<OwnedSlice> _read_slice; + std::vector<OwnedSlice> _boxes; int16 _last_box_ref = -1; uint32 _last_box_usage = 0; std::vector<int16> _box_ref; diff --git a/be/src/util/slice.h b/be/src/util/slice.h index b38b1147894..fd6bcf0adfb 100644 --- a/be/src/util/slice.h +++ b/be/src/util/slice.h @@ -344,6 +344,10 @@ class OwnedSlice : private Allocator<false, false, false, DefaultMemoryAllocator public: OwnedSlice() : _slice((uint8_t*)nullptr, 0) {} + OwnedSlice(size_t length) + : _slice(reinterpret_cast<char*>(Allocator::alloc(length)), length), + _capacity(length) {} + OwnedSlice(OwnedSlice&& src) : _slice(src._slice), _capacity(src._capacity) { src._slice.data = nullptr; src._slice.size = 0; @@ -369,6 +373,8 @@ public: } } + char* data() const { return _slice.data; } + const Slice& slice() const { return _slice; } private: --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org