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

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new c2732d4f30c [fix](memory) Fix jemalloc hook deadlock at BE start 
(#44009)
c2732d4f30c is described below

commit c2732d4f30c6388edbee3c830a1ce8388f0cd698
Author: Xinyi Zou <zouxi...@selectdb.com>
AuthorDate: Sat Nov 16 10:06:34 2024 +0800

    [fix](memory) Fix jemalloc hook deadlock at BE start (#44009)
    
    It should be caused by the third-party library, but in any case, this
    fix should be possible.
    
    ```
    #0  0x00007f738432318c in __lll_lock_wait_private () from /lib64/libc.so.6
    #1  0x00007f73843505ed in __internal_atexit () from /lib64/libc.so.6
    #2  0x0000563f6a54db30 in malloc ()
    #3  0x0000563f74e82b08 in operator new(unsigned long) ()
    #4  0x0000563f6a6144bd in doris::ThreadContextPtr::ThreadContextPtr() ()
    #5  0x0000563f6a54e21c in doris_calloc ()
    #6  0x00007f7384350557 in __new_exitfn () from /lib64/libc.so.6
    #7  0x00007f73843505fc in __internal_atexit () from /lib64/libc.so.6
    #8  0x0000563f72c79c03 in ?? ()
    #9  0x0000563f74e3b5fd in __libc_csu_init ()
    #10 0x00007f7384339d18 in __libc_start_main () from /lib64/libc.so.6
    #11 0x0000563f69ae302a in _start ()
    ```
---
 be/src/common/daemon.cpp        | 1 +
 be/src/common/daemon.h          | 1 +
 be/src/runtime/thread_context.h | 9 +++++----
 be/src/service/doris_main.cpp   | 2 ++
 4 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/be/src/common/daemon.cpp b/be/src/common/daemon.cpp
index f91aec88f59..98315609865 100644
--- a/be/src/common/daemon.cpp
+++ b/be/src/common/daemon.cpp
@@ -409,6 +409,7 @@ static void init_doris_metrics(const 
std::vector<StorePath>& store_paths) {
 void signal_handler(int signal) {
     if (signal == SIGINT || signal == SIGTERM) {
         k_doris_exit = true;
+        k_doris_start = false;
         LOG(INFO) << "doris start to exit";
     }
 }
diff --git a/be/src/common/daemon.h b/be/src/common/daemon.h
index 5ac9abbe2b1..36d2ca0813a 100644
--- a/be/src/common/daemon.h
+++ b/be/src/common/daemon.h
@@ -27,6 +27,7 @@ namespace doris {
 
 struct StorePath;
 inline bool k_doris_exit = false;
+inline bool k_doris_start = false;
 
 class Daemon {
 public:
diff --git a/be/src/runtime/thread_context.h b/be/src/runtime/thread_context.h
index bbfd1a02979..23ee742b867 100644
--- a/be/src/runtime/thread_context.h
+++ b/be/src/runtime/thread_context.h
@@ -100,6 +100,7 @@ class MemTracker;
 class RuntimeState;
 
 extern bool k_doris_exit;
+extern bool k_doris_start;
 extern bthread_key_t btls_key;
 
 // Using gcc11 compiles thread_local variable on lower versions of GLIBC will 
report an error,
@@ -388,17 +389,17 @@ private:
 // which is different from the previous behavior.
 #define CONSUME_MEM_TRACKER(size)                                              
                    \
     do {                                                                       
                    \
-        if (doris::thread_context_ptr.init) {                                  
                    \
+        if (doris::k_doris_start && doris::thread_context_ptr.init) {          
                    \
             doris::thread_context()->consume_memory(size);                     
                    \
-        } else if (doris::ExecEnv::GetInstance()->initialized()) {             
                    \
+        } else if (doris::k_doris_start && 
doris::ExecEnv::GetInstance()->initialized()) {         \
             
doris::ExecEnv::GetInstance()->orphan_mem_tracker_raw()->consume_no_update_peak(size);
 \
         }                                                                      
                    \
     } while (0)
 #define RELEASE_MEM_TRACKER(size)                                              
              \
     do {                                                                       
              \
-        if (doris::thread_context_ptr.init) {                                  
              \
+        if (doris::k_doris_start && doris::thread_context_ptr.init) {          
              \
             doris::thread_context()->consume_memory(-size);                    
              \
-        } else if (doris::ExecEnv::GetInstance()->initialized()) {             
              \
+        } else if (doris::k_doris_start && 
doris::ExecEnv::GetInstance()->initialized()) {   \
             
doris::ExecEnv::GetInstance()->orphan_mem_tracker_raw()->consume_no_update_peak(
 \
                     -size);                                                    
              \
         }                                                                      
              \
diff --git a/be/src/service/doris_main.cpp b/be/src/service/doris_main.cpp
index 3b6cf2969cf..643ba0837b9 100644
--- a/be/src/service/doris_main.cpp
+++ b/be/src/service/doris_main.cpp
@@ -82,6 +82,7 @@ int __llvm_profile_write_file();
 
 namespace doris {
 extern bool k_doris_exit;
+extern bool k_doris_start;
 
 static void thrift_output(const char* x) {
     LOG(WARNING) << "thrift internal message: " << x;
@@ -463,6 +464,7 @@ int main(int argc, char** argv) {
 
     // init exec env
     auto exec_env = doris::ExecEnv::GetInstance();
+    doris::k_doris_start = true;
     doris::ExecEnv::init(exec_env, paths);
     doris::TabletSchemaCache::create_global_schema_cache();
 


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

Reply via email to