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 fabd0464a7f [fix](memory) Fix memory tracker destructor deadlock
(#33497)
fabd0464a7f is described below
commit fabd0464a7fd7aaa18cad57517e169030d546f54
Author: Xinyi Zou <[email protected]>
AuthorDate: Wed Apr 10 22:44:40 2024 +0800
[fix](memory) Fix memory tracker destructor deadlock (#33497)
---
be/src/common/daemon.cpp | 1 +
be/src/runtime/memory/mem_tracker_limiter.cpp | 40 ++++++++++++++-------------
be/src/runtime/memory/mem_tracker_limiter.h | 2 +-
3 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/be/src/common/daemon.cpp b/be/src/common/daemon.cpp
index 4c6a0a012c2..3a217413db8 100644
--- a/be/src/common/daemon.cpp
+++ b/be/src/common/daemon.cpp
@@ -211,6 +211,7 @@ void Daemon::memory_maintenance_thread() {
// Update and print memory stat when the memory changes by 256M.
if (abs(last_print_proc_mem - PerfCounters::get_vm_rss()) > 268435456)
{
last_print_proc_mem = PerfCounters::get_vm_rss();
+ doris::MemTrackerLimiter::clean_tracker_limiter_group();
doris::MemTrackerLimiter::enable_print_log_process_usage();
// Refresh mem tracker each type counter.
diff --git a/be/src/runtime/memory/mem_tracker_limiter.cpp
b/be/src/runtime/memory/mem_tracker_limiter.cpp
index 08d8ea4d5e2..2218bed6959 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.cpp
+++ b/be/src/runtime/memory/mem_tracker_limiter.cpp
@@ -89,12 +89,9 @@ std::shared_ptr<MemTrackerLimiter>
MemTrackerLimiter::create_shared(MemTrackerLi
DCHECK(ExecEnv::tracking_memory());
std::lock_guard<std::mutex> l(
ExecEnv::GetInstance()->mem_tracker_limiter_pool[tracker->group_num()].group_lock);
- tracker->tracker_limiter_group_it =
-
ExecEnv::GetInstance()->mem_tracker_limiter_pool[tracker->group_num()].trackers.insert(
- ExecEnv::GetInstance()
- ->mem_tracker_limiter_pool[tracker->group_num()]
- .trackers.end(),
- tracker);
+
ExecEnv::GetInstance()->mem_tracker_limiter_pool[tracker->group_num()].trackers.insert(
+
ExecEnv::GetInstance()->mem_tracker_limiter_pool[tracker->group_num()].trackers.end(),
+ tracker);
#endif
return tracker;
}
@@ -128,19 +125,6 @@ MemTrackerLimiter::~MemTrackerLimiter() {
}
_consumption->set(0);
}
-#ifndef BE_TEST
- if (ExecEnv::tracking_memory()) {
- std::lock_guard<std::mutex> l(
-
ExecEnv::GetInstance()->mem_tracker_limiter_pool[_group_num].group_lock);
- if (tracker_limiter_group_it !=
-
ExecEnv::GetInstance()->mem_tracker_limiter_pool[_group_num].trackers.end()) {
-
ExecEnv::GetInstance()->mem_tracker_limiter_pool[_group_num].trackers.erase(
- tracker_limiter_group_it);
- tracker_limiter_group_it =
-
ExecEnv::GetInstance()->mem_tracker_limiter_pool[_group_num].trackers.end();
- }
- }
-#endif
g_memtrackerlimiter_cnt << -1;
}
@@ -173,6 +157,24 @@ void MemTrackerLimiter::refresh_global_counter() {
}
}
+void MemTrackerLimiter::clean_tracker_limiter_group() {
+#ifndef BE_TEST
+ if (ExecEnv::tracking_memory()) {
+ for (auto& group : ExecEnv::GetInstance()->mem_tracker_limiter_pool) {
+ std::lock_guard<std::mutex> l(group.group_lock);
+ auto it = group.trackers.begin();
+ while (it != group.trackers.end()) {
+ if ((*it).expired()) {
+ it = group.trackers.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+ }
+#endif
+}
+
void
MemTrackerLimiter::make_process_snapshots(std::vector<MemTracker::Snapshot>*
snapshots) {
MemTrackerLimiter::refresh_global_counter();
int64_t all_tracker_mem_sum = 0;
diff --git a/be/src/runtime/memory/mem_tracker_limiter.h
b/be/src/runtime/memory/mem_tracker_limiter.h
index d22a79c73f7..fcb319a8d77 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.h
+++ b/be/src/runtime/memory/mem_tracker_limiter.h
@@ -160,6 +160,7 @@ public:
}
static void refresh_global_counter();
+ static void clean_tracker_limiter_group();
Snapshot make_snapshot() const override;
// Returns a list of all the valid tracker snapshots.
@@ -241,7 +242,6 @@ public:
}
// Iterator into mem_tracker_limiter_pool for this object. Stored to have
O(1) remove.
- std::list<std::weak_ptr<MemTrackerLimiter>>::iterator
tracker_limiter_group_it;
std::list<std::weak_ptr<MemTrackerLimiter>>::iterator
tg_tracker_limiter_group_it;
private:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]