You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zo...@apache.org on 2022/07/01 02:20:59 UTC
[doris] branch master updated: [fix] (mem tracker) Fix BE hangs at startup, stuck in tcmalloc hook call ExecEnv::GetInstance() (#10517)
This is an automated email from the ASF dual-hosted git repository.
zouxinyi 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 0d99b27d89 [fix] (mem tracker) Fix BE hangs at startup, stuck in tcmalloc hook call ExecEnv::GetInstance() (#10517)
0d99b27d89 is described below
commit 0d99b27d893ed660a1618c0f6d5d3e75785385b4
Author: Kidd <10...@users.noreply.github.com>
AuthorDate: Fri Jul 1 10:20:53 2022 +0800
[fix] (mem tracker) Fix BE hangs at startup, stuck in tcmalloc hook call ExecEnv::GetInstance() (#10517)
1. Added flag exec_env_existed to indicate whether ExecEnv Instance is created.
2. ThreadMemTrackerMgr::add_tracker fail when USE_MEM_TRACKER=OFF, add USE_MEM_TRACKER compile option.
---
be/src/runtime/exec_env.h | 3 +++
be/src/runtime/tcmalloc_hook.h | 8 ++++----
be/src/runtime/thread_context.h | 8 ++------
be/src/runtime/thread_mem_tracker_mgr.h | 2 ++
4 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h
index e0e09ae047..03e9971152 100644
--- a/be/src/runtime/exec_env.h
+++ b/be/src/runtime/exec_env.h
@@ -72,6 +72,8 @@ class ClientCache;
class HeartbeatFlags;
+static bool exec_env_existed = false;
+
// Execution environment for queries/plan fragments.
// Contains all required global structures, and handles to
// singleton services. Clients must call StartServices exactly
@@ -87,6 +89,7 @@ public:
/// we return the most recently created instance.
static ExecEnv* GetInstance() {
static ExecEnv s_exec_env;
+ exec_env_existed = true;
return &s_exec_env;
}
diff --git a/be/src/runtime/tcmalloc_hook.h b/be/src/runtime/tcmalloc_hook.h
index af60cdc178..dd0e1c788f 100644
--- a/be/src/runtime/tcmalloc_hook.h
+++ b/be/src/runtime/tcmalloc_hook.h
@@ -37,17 +37,17 @@
// destructor to control the behavior of consume can lead to unexpected behavior,
// like this: if (LIKELY(doris::start_thread_mem_tracker)) {
void new_hook(const void* ptr, size_t size) {
- if (doris::tls_ctx()) {
+ if (doris::thread_local_ctx._init) {
doris::tls_ctx()->consume_mem(tc_nallocx(size, 0));
- } else if (doris::ExecEnv::GetInstance()->initialized()) {
+ } else if (doris::exec_env_existed && doris::ExecEnv::GetInstance()->initialized()) {
doris::MemTracker::get_process_tracker()->consume(tc_nallocx(size, 0));
}
}
void delete_hook(const void* ptr) {
- if (doris::tls_ctx()) {
+ if (doris::thread_local_ctx._init) {
doris::tls_ctx()->release_mem(tc_malloc_size(const_cast<void*>(ptr)));
- } else if (doris::ExecEnv::GetInstance()->initialized()) {
+ } else if (doris::exec_env_existed && doris::ExecEnv::GetInstance()->initialized()) {
doris::MemTracker::get_process_tracker()->release(tc_malloc_size(const_cast<void*>(ptr)));
}
}
diff --git a/be/src/runtime/thread_context.h b/be/src/runtime/thread_context.h
index 33478b19c5..bf347e0a28 100644
--- a/be/src/runtime/thread_context.h
+++ b/be/src/runtime/thread_context.h
@@ -214,6 +214,7 @@ public:
ThreadContext* get();
+ // TCMalloc hook is triggered during ThreadContext construction, which may lead to deadlock.
bool _init = false;
private:
@@ -227,12 +228,7 @@ static ThreadContext* tls_ctx() {
if (tls != nullptr) {
return tls;
} else {
- if (thread_local_ctx._init) {
- return thread_local_ctx.get();
- } else {
- // TCMalloc hook is triggered during ThreadContext construction, which may lead to deadlock.
- return nullptr;
- }
+ return thread_local_ctx.get();
}
}
diff --git a/be/src/runtime/thread_mem_tracker_mgr.h b/be/src/runtime/thread_mem_tracker_mgr.h
index d8042ac0fa..ffc6fdc01f 100644
--- a/be/src/runtime/thread_mem_tracker_mgr.h
+++ b/be/src/runtime/thread_mem_tracker_mgr.h
@@ -292,11 +292,13 @@ inline void ThreadMemTrackerMgr::noncache_try_consume(int64_t size) {
}
inline void ThreadMemTrackerMgr::add_tracker(const std::shared_ptr<MemTracker>& mem_tracker) {
+#ifdef USE_MEM_TRACKER
DCHECK(_mem_trackers.find(mem_tracker->id()) == _mem_trackers.end()) << print_debug_string();
_mem_trackers[mem_tracker->id()] = mem_tracker;
DCHECK(_mem_trackers[mem_tracker->id()]) << print_debug_string();
_untracked_mems[mem_tracker->id()] = 0;
_mem_tracker_labels[mem_tracker->id()] = mem_tracker->label();
+#endif
}
inline std::shared_ptr<MemTracker> ThreadMemTrackerMgr::mem_tracker() {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org