Skip to content

Commit

Permalink
[fix](memory) Fix memory tracker destructor deadlock (apache#33497)
Browse files Browse the repository at this point in the history
  • Loading branch information
xinyiZzz authored Apr 10, 2024
1 parent 1fea40a commit fabd046
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
1 change: 1 addition & 0 deletions be/src/common/daemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
40 changes: 21 additions & 19 deletions be/src/runtime/memory/mem_tracker_limiter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion be/src/runtime/memory/mem_tracker_limiter.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ class MemTrackerLimiter final : public MemTracker {
}

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.
Expand Down Expand Up @@ -241,7 +242,6 @@ class MemTrackerLimiter final : public MemTracker {
}

// 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:
Expand Down

0 comments on commit fabd046

Please sign in to comment.