This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 13cc7a31ab [fix](bug) Fix page handle safe exit #22849
13cc7a31ab is described below
commit 13cc7a31ab13f5e7bfcec25acb862c14a9ac77fd
Author: Xinyi Zou <[email protected]>
AuthorDate: Fri Aug 11 09:55:19 2023 +0800
[fix](bug) Fix page handle safe exit #22849
---
be/src/olap/rowset/segment_v2/page_handle.h | 8 ++++++--
be/src/runtime/exec_env.h | 2 +-
be/src/runtime/memory/mem_tracker_limiter.cpp | 4 +++-
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/be/src/olap/rowset/segment_v2/page_handle.h
b/be/src/olap/rowset/segment_v2/page_handle.h
index 6494048774..b1e53ee808 100644
--- a/be/src/olap/rowset/segment_v2/page_handle.h
+++ b/be/src/olap/rowset/segment_v2/page_handle.h
@@ -37,7 +37,8 @@ public:
// This class will take the ownership of input data's memory. It will
// free it when deconstructs.
PageHandle(DataPage* data) : _is_data_owner(true), _data(data) {
-
ExecEnv::GetInstance()->page_no_cache_mem_tracker()->consume(_data->capacity());
+ _page_tracker = ExecEnv::GetInstance()->page_no_cache_mem_tracker();
+ _page_tracker->consume(_data->capacity());
}
// This class will take the content of cache data, and will make input
@@ -50,18 +51,20 @@ public:
// we can use std::exchange if we switch c++14 on
std::swap(_is_data_owner, other._is_data_owner);
std::swap(_data, other._data);
+ _page_tracker = ExecEnv::GetInstance()->page_no_cache_mem_tracker();
}
PageHandle& operator=(PageHandle&& other) noexcept {
std::swap(_is_data_owner, other._is_data_owner);
std::swap(_data, other._data);
_cache_data = std::move(other._cache_data);
+ _page_tracker = ExecEnv::GetInstance()->page_no_cache_mem_tracker();
return *this;
}
~PageHandle() {
if (_is_data_owner) {
-
ExecEnv::GetInstance()->page_no_cache_mem_tracker()->release(_data->capacity());
+ _page_tracker->release(_data->capacity());
delete _data;
} else {
DCHECK(_data == nullptr);
@@ -82,6 +85,7 @@ private:
// otherwise _cache_data is valid, and data is belong to cache.
bool _is_data_owner = false;
DataPage* _data = nullptr;
+ std::shared_ptr<MemTracker> _page_tracker;
PageCacheHandle _cache_data;
// Don't allow copy and assign
diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h
index 3077eaa3f5..2f8b51ce8e 100644
--- a/be/src/runtime/exec_env.h
+++ b/be/src/runtime/exec_env.h
@@ -123,7 +123,7 @@ public:
std::shared_ptr<MemTrackerLimiter> orphan_mem_tracker() { return
_orphan_mem_tracker; }
MemTrackerLimiter* orphan_mem_tracker_raw() { return
_orphan_mem_tracker_raw; }
MemTrackerLimiter* experimental_mem_tracker() { return
_experimental_mem_tracker.get(); }
- MemTracker* page_no_cache_mem_tracker() { return
_page_no_cache_mem_tracker.get(); }
+ std::shared_ptr<MemTracker> page_no_cache_mem_tracker() { return
_page_no_cache_mem_tracker; }
MemTracker* brpc_iobuf_block_memory_tracker() { return
_brpc_iobuf_block_memory_tracker.get(); }
ThreadPool* send_batch_thread_pool() { return
_send_batch_thread_pool.get(); }
diff --git a/be/src/runtime/memory/mem_tracker_limiter.cpp
b/be/src/runtime/memory/mem_tracker_limiter.cpp
index fccf29f7f4..fe2639ab5e 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.cpp
+++ b/be/src/runtime/memory/mem_tracker_limiter.cpp
@@ -87,7 +87,9 @@ MemTrackerLimiter::~MemTrackerLimiter() {
// nor can it guarantee that the memory alloc and free are recorded in a
one-to-one correspondence.
// In order to ensure `consumption of all limiter trackers` + `orphan
tracker consumption` = `process tracker consumption`
// in real time. Merge its consumption into orphan when parent is process,
to avoid repetition.
-
ExecEnv::GetInstance()->orphan_mem_tracker()->consume(_consumption->current_value());
+ if (ExecEnv::GetInstance()->initialized()) {
+
ExecEnv::GetInstance()->orphan_mem_tracker()->consume(_consumption->current_value());
+ }
_consumption->set(0);
{
std::lock_guard<std::mutex>
l(mem_tracker_limiter_pool[_group_num].group_lock);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]