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;