You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/01 02:42:04 UTC

[doris] branch master updated: [bugfix] fix tcmalooc hook cancel deadlock (#10514)

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 659e863bd7 [bugfix] fix tcmalooc hook cancel deadlock (#10514)
659e863bd7 is described below

commit 659e863bd73ee8644dd1ebd42c1d5148343635cd
Author: Kidd <10...@users.noreply.github.com>
AuthorDate: Fri Jul 1 10:41:59 2022 +0800

    [bugfix] fix tcmalooc hook cancel deadlock (#10514)
---
 be/src/runtime/data_stream_recvr.cc       |  6 ++++++
 be/src/runtime/exec_env_init.cpp          | 10 ++++------
 be/src/vec/runtime/vdata_stream_recvr.cpp |  6 ++++++
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/be/src/runtime/data_stream_recvr.cc b/be/src/runtime/data_stream_recvr.cc
index 3e3774c40b..5fb2981993 100644
--- a/be/src/runtime/data_stream_recvr.cc
+++ b/be/src/runtime/data_stream_recvr.cc
@@ -203,6 +203,9 @@ Status DataStreamRecvr::SenderQueue::get_batch(RowBatch** next_batch) {
 void DataStreamRecvr::SenderQueue::add_batch(const PRowBatch& pb_batch, int be_number,
                                              int64_t packet_seq,
                                              ::google::protobuf::Closure** done) {
+    // Avoid deadlock when calling SenderQueue::cancel() in tcmalloc hook,
+    // limit memory via DataStreamRecvr::exceeds_limit.
+    STOP_CHECK_LIMIT_THREAD_LOCAL_MEM_TRACKER();
     lock_guard<mutex> l(_lock);
     if (_is_cancelled) {
         return;
@@ -272,6 +275,9 @@ void DataStreamRecvr::SenderQueue::add_batch(const PRowBatch& pb_batch, int be_n
 }
 
 void DataStreamRecvr::SenderQueue::add_batch(RowBatch* batch, bool use_move) {
+    // Avoid deadlock when calling SenderQueue::cancel() in tcmalloc hook,
+    // limit memory via DataStreamRecvr::exceeds_limit.
+    STOP_CHECK_LIMIT_THREAD_LOCAL_MEM_TRACKER();
     unique_lock<mutex> l(_lock);
     if (_is_cancelled) {
         return;
diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp
index 2347d2bea8..8571fadc00 100644
--- a/be/src/runtime/exec_env_init.cpp
+++ b/be/src/runtime/exec_env_init.cpp
@@ -182,14 +182,12 @@ Status ExecEnv::_init_mem_tracker() {
         global_memory_limit_bytes = MemInfo::physical_mem();
     }
     MemTracker::get_process_tracker()->set_limit(global_memory_limit_bytes);
-    _query_pool_mem_tracker = MemTracker::create_tracker(global_memory_limit_bytes, "QueryPool",
-                                                         MemTracker::get_process_tracker(),
-                                                         MemTrackerLevel::OVERVIEW);
+    _query_pool_mem_tracker = MemTracker::create_tracker(
+            -1, "QueryPool", MemTracker::get_process_tracker(), MemTrackerLevel::OVERVIEW);
     REGISTER_HOOK_METRIC(query_mem_consumption,
                          [this]() { return _query_pool_mem_tracker->consumption(); });
-    _load_pool_mem_tracker = MemTracker::create_tracker(global_memory_limit_bytes, "LoadPool",
-                                                        MemTracker::get_process_tracker(),
-                                                        MemTrackerLevel::OVERVIEW);
+    _load_pool_mem_tracker = MemTracker::create_tracker(
+            -1, "LoadPool", MemTracker::get_process_tracker(), MemTrackerLevel::OVERVIEW);
     REGISTER_HOOK_METRIC(load_mem_consumption,
                          [this]() { return _load_pool_mem_tracker->consumption(); });
     LOG(INFO) << "Using global memory limit: "
diff --git a/be/src/vec/runtime/vdata_stream_recvr.cpp b/be/src/vec/runtime/vdata_stream_recvr.cpp
index 66c2ebb4fe..d7f6c62a42 100644
--- a/be/src/vec/runtime/vdata_stream_recvr.cpp
+++ b/be/src/vec/runtime/vdata_stream_recvr.cpp
@@ -90,6 +90,9 @@ Status VDataStreamRecvr::SenderQueue::get_batch(Block** next_block) {
 void VDataStreamRecvr::SenderQueue::add_block(const PBlock& pblock, int be_number,
                                               int64_t packet_seq,
                                               ::google::protobuf::Closure** done) {
+    // Avoid deadlock when calling SenderQueue::cancel() in tcmalloc hook,
+    // limit memory via DataStreamRecvr::exceeds_limit.
+    STOP_CHECK_LIMIT_THREAD_LOCAL_MEM_TRACKER();
     std::lock_guard<std::mutex> l(_lock);
     if (_is_cancelled) {
         return;
@@ -140,6 +143,9 @@ void VDataStreamRecvr::SenderQueue::add_block(const PBlock& pblock, int be_numbe
 }
 
 void VDataStreamRecvr::SenderQueue::add_block(Block* block, bool use_move) {
+    // Avoid deadlock when calling SenderQueue::cancel() in tcmalloc hook,
+    // limit memory via DataStreamRecvr::exceeds_limit.
+    STOP_CHECK_LIMIT_THREAD_LOCAL_MEM_TRACKER();
     std::unique_lock<std::mutex> l(_lock);
     if (_is_cancelled) {
         return;


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