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

michaelsmith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git


The following commit(s) were added to refs/heads/master by this push:
     new f2f297a00 IMPALA-14533: Fix crash in ASAN/TSAN builds due to nullptr 
TcmallocMetric::BYTES_IN_USE
f2f297a00 is described below

commit f2f297a00fbdf8de1e39981d0317dfa537695172
Author: Yida Wu <[email protected]>
AuthorDate: Wed Nov 5 14:45:27 2025 -0800

    IMPALA-14533: Fix crash in ASAN/TSAN builds due to nullptr 
TcmallocMetric::BYTES_IN_USE
    
    Impala uses SanitizerMallocMetric::BYTES_ALLOCATED instead of
    TcmallocMetric::BYTES_IN_USE in ASAN or TSAN builds. However, the
    admissiond logic in IMPALA-14493 still uses uninitialized
    TcmallocMetric::BYTES_IN_USE under these builds, leading to a
    nullptr crash.
    
    To fix this issue, we will use SanitizerMallocMetric::BYTES_ALLOCATED
    instead for ASAN and TSAN builds in admission controller, which is
    the same logic in memory-metrics.cc to use a different metric for
    those builds.
    
    Tests:
    Passed ASAN and TSAN builds testing.
    Passed core tests.
    
    Change-Id: Ic4fbdc134ea302f7302d177d073eb49136ba775c
    Reviewed-on: http://gerrit.cloudera.org:8080/23646
    Reviewed-by: Michael Smith <[email protected]>
    Tested-by: Michael Smith <[email protected]>
---
 be/src/scheduling/admission-controller.cc | 36 ++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/be/src/scheduling/admission-controller.cc 
b/be/src/scheduling/admission-controller.cc
index db6720de4..e3bfc695b 100644
--- a/be/src/scheduling/admission-controller.cc
+++ b/be/src/scheduling/admission-controller.cc
@@ -1651,19 +1651,29 @@ Status AdmissionController::SubmitForAdmission(const 
AdmissionRequest& request,
       return Status::Expected(rejected_msg);
     }
 
-    int64_t bytes_inuse = TcmallocMetric::BYTES_IN_USE->GetValue();
-    if (!is_trivial && AdmissiondEnv::GetInstance() != nullptr
-        && AdmissiondEnv::GetInstance()->admission_service_mem_limit() > 0
-        && bytes_inuse > 
AdmissiondEnv::GetInstance()->admission_service_mem_limit()) {
-      queue_node->not_admitted_reason = Substitute(REASON_EXCEED_MEMORY_LIMIT,
-          bytes_inuse, 
AdmissiondEnv::GetInstance()->admission_service_mem_limit());
-      request.summary_profile->AddInfoString(
-          PROFILE_INFO_KEY_ADMISSION_RESULT, PROFILE_INFO_VAL_REJECTED);
-      stats->metrics()->total_rejected->Increment(1);
-      const ErrorMsg& rejected_msg = ErrorMsg(TErrorCode::ADMISSION_REJECTED,
-          queue_node->pool_name, queue_node->not_admitted_reason);
-      VLOG_QUERY << "query_id=" << PrintId(request.query_id) << " " << 
rejected_msg.msg();
-      return Status::Expected(rejected_msg);
+    if (AdmissiondEnv::GetInstance() != nullptr) {
+      // See RegisterMemoryMetrics() in memory-metrics.cc for where the 
relevant metrics
+      // are registered.
+#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
+      DCHECK(SanitizerMallocMetric::BYTES_ALLOCATED != nullptr);
+      int64_t bytes_inuse = SanitizerMallocMetric::BYTES_ALLOCATED->GetValue();
+#else
+      DCHECK(TcmallocMetric::BYTES_IN_USE != nullptr);
+      int64_t bytes_inuse = TcmallocMetric::BYTES_IN_USE->GetValue();
+#endif
+      if (!is_trivial && 
AdmissiondEnv::GetInstance()->admission_service_mem_limit() > 0
+          && bytes_inuse > 
AdmissiondEnv::GetInstance()->admission_service_mem_limit()) {
+        queue_node->not_admitted_reason = 
Substitute(REASON_EXCEED_MEMORY_LIMIT,
+            bytes_inuse, 
AdmissiondEnv::GetInstance()->admission_service_mem_limit());
+        request.summary_profile->AddInfoString(
+            PROFILE_INFO_KEY_ADMISSION_RESULT, PROFILE_INFO_VAL_REJECTED);
+        stats->metrics()->total_rejected->Increment(1);
+        const ErrorMsg& rejected_msg = ErrorMsg(TErrorCode::ADMISSION_REJECTED,
+            queue_node->pool_name, queue_node->not_admitted_reason);
+        VLOG_QUERY << "query_id=" << PrintId(request.query_id) << " "
+                   << rejected_msg.msg();
+        return Status::Expected(rejected_msg);
+      }
     }
 
     string user;

Reply via email to