This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-1.1-lts
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-1.1-lts by this push:
     new 3198e1634e fix transfer to tracker (#12932) (#12951)
3198e1634e is described below

commit 3198e1634e27682b627b025fd79b4dbe0e47a31e
Author: Xinyi Zou <zouxiny...@gmail.com>
AuthorDate: Sun Sep 25 10:53:39 2022 +0800

    fix transfer to tracker (#12932) (#12951)
    
    ~MemTrackerLimiter() repeated consumption of _untracked_mem, resulting in 
inaccurate process mem tracker.
---
 be/src/runtime/memory/mem_tracker_limiter.cpp  | 24 ++++++++++++++----------
 be/src/runtime/memory/thread_mem_tracker_mgr.h |  1 +
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/be/src/runtime/memory/mem_tracker_limiter.cpp 
b/be/src/runtime/memory/mem_tracker_limiter.cpp
index aaba7c6b19..aa2f207b16 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.cpp
+++ b/be/src/runtime/memory/mem_tracker_limiter.cpp
@@ -75,20 +75,24 @@ MemTrackerLimiter::~MemTrackerLimiter() {
     // TCMalloc hook will be triggered during destructor memtracker, may cause 
crash.
     if (_label == "Process") doris::thread_context_ptr._init = false;
     DCHECK(remain_child_count() == 0 || _label == "Process");
-    consume(_untracked_mem.exchange(0));
-#ifndef BE_TEST
     // In order to ensure `consumption of all limiter trackers` + `orphan 
tracker consumption` = `process tracker consumption`
-    // in real time. Merge its consumption into orphan when all third level 
limiter trackers are destructed, to avoid repetition.
-    // the first layer: process;
-    // the second layer: a tracker that will not be destructed globally 
(query/load pool, load channel mgr, etc.);
-    // the third layer: a query/load/compaction task generates a tracker 
(query tracker, load channel tracker, etc.).
-    if ((_parent && _parent->label() == "Process") ||
-        (_parent->parent() && _parent->parent()->label() == "Process")) {
+    // in real time. Merge its consumption into orphan when parent is process, 
to avoid repetition.
+    if ((_parent && _parent->label() == "Process")) {
         ExecEnv::GetInstance()->orphan_mem_tracker_raw()->cache_consume_local(
                 _consumption->current_value());
     }
-#endif
-    if (_reset_zero) cache_consume_local(-_consumption->current_value());
+    if (_reset_zero) {
+        ExecEnv::GetInstance()->orphan_mem_tracker_raw()->cache_consume_local(
+                _consumption->current_value());
+        cache_consume_local(-_consumption->current_value());
+        _all_ancestors.clear();
+        
_all_ancestors.push_back(ExecEnv::GetInstance()->orphan_mem_tracker_raw());
+    }
+    for (auto& tracker : _all_ancestors) {
+        if (tracker->label() != "Process") {
+            tracker->_consumption->add(_untracked_mem);
+        }
+    }
     if (_parent) {
         std::lock_guard<std::mutex> l(_parent->_child_tracker_limiter_lock);
         if (_child_tracker_it != _parent->_child_tracker_limiters.end()) {
diff --git a/be/src/runtime/memory/thread_mem_tracker_mgr.h 
b/be/src/runtime/memory/thread_mem_tracker_mgr.h
index 2736ff9630..14e9beef40 100644
--- a/be/src/runtime/memory/thread_mem_tracker_mgr.h
+++ b/be/src/runtime/memory/thread_mem_tracker_mgr.h
@@ -46,6 +46,7 @@ public:
     ~ThreadMemTrackerMgr() {
         flush_untracked_mem<false>();
         DCHECK(_consumer_tracker_stack.empty());
+        DCHECK(_limiter_tracker_stack.size() == 1);
     }
 
     // only for tcmalloc hook


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to