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]

Reply via email to