This is an automated email from the ASF dual-hosted git repository. stigahuang pushed a commit to branch branch-4.0.1 in repository https://gitbox.apache.org/repos/asf/impala.git
commit edca349527657a9847659d7b0400bf62aa6938ce Author: Bikramjeet Vig <[email protected]> AuthorDate: Thu Sep 30 19:03:15 2021 -0700 IMPALA-10942: Fix memory leak in admission controller This patch fixes a memory leak in the admission controller where objects tracking state required for queuing were being retained despite the query being admitted or rejected immediately. Change-Id: I1df0de0e658f6dcb5a044d108d0943aaa3dea0a1 Reviewed-on: http://gerrit.cloudera.org:8080/17893 Reviewed-by: Impala Public Jenkins <[email protected]> Tested-by: Impala Public Jenkins <[email protected]> --- be/src/scheduling/admission-control-service.cc | 2 +- be/src/scheduling/admission-controller.cc | 6 +++--- be/src/scheduling/admission-controller.h | 2 +- be/src/scheduling/local-admission-control-client.cc | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/be/src/scheduling/admission-control-service.cc b/be/src/scheduling/admission-control-service.cc index f00f335..748107f 100644 --- a/be/src/scheduling/admission-control-service.cc +++ b/be/src/scheduling/admission-control-service.cc @@ -323,7 +323,7 @@ void AdmissionControlService::AdmitFromThreadPool(UniqueIdPB query_id) { admission_state->blacklisted_executor_addresses}; admission_state->admit_status = AdmissiondEnv::GetInstance()->admission_controller()->SubmitForAdmission(request, - &admission_state->admit_outcome, &admission_state->schedule, &queued, + &admission_state->admit_outcome, &admission_state->schedule, queued, &admission_state->request_pool); admission_state->submitted = true; if (!queued) { diff --git a/be/src/scheduling/admission-controller.cc b/be/src/scheduling/admission-controller.cc index 1d1f544..9aebfad 100644 --- a/be/src/scheduling/admission-controller.cc +++ b/be/src/scheduling/admission-controller.cc @@ -1133,9 +1133,9 @@ void AdmissionController::PoolStats::UpdateConfigMetrics(const TPoolConfig& pool Status AdmissionController::SubmitForAdmission(const AdmissionRequest& request, Promise<AdmissionOutcome, PromiseMode::MULTIPLE_PRODUCER>* admit_outcome, - unique_ptr<QuerySchedulePB>* schedule_result, bool* queued, + unique_ptr<QuerySchedulePB>* schedule_result, bool& queued, std::string* request_pool) { - *queued = false; + queued = false; DebugActionNoFail(request.query_options, "AC_BEFORE_ADMISSION"); DCHECK(schedule_result->get() == nullptr); @@ -1249,7 +1249,7 @@ Status AdmissionController::SubmitForAdmission(const AdmissionRequest& request, PROFILE_INFO_KEY_INITIAL_QUEUE_REASON, queue_node->initial_queue_reason); queue_node->wait_start_ms = MonotonicMillis(); - *queued = true; + queued = true; return Status::OK(); } diff --git a/be/src/scheduling/admission-controller.h b/be/src/scheduling/admission-controller.h index fb8bca2..635ceac 100644 --- a/be/src/scheduling/admission-controller.h +++ b/be/src/scheduling/admission-controller.h @@ -369,7 +369,7 @@ class AdmissionController { /// cancelled to ensure that the pool statistics are updated. Status SubmitForAdmission(const AdmissionRequest& request, Promise<AdmissionOutcome, PromiseMode::MULTIPLE_PRODUCER>* admit_outcome, - std::unique_ptr<QuerySchedulePB>* schedule_result, bool* queued, + std::unique_ptr<QuerySchedulePB>* schedule_result, bool& queued, std::string* request_pool = nullptr); /// After SubmitForAdmission(), if the query was queued this must be called. If diff --git a/be/src/scheduling/local-admission-control-client.cc b/be/src/scheduling/local-admission-control-client.cc index faf47a5..e85f34b 100644 --- a/be/src/scheduling/local-admission-control-client.cc +++ b/be/src/scheduling/local-admission-control-client.cc @@ -38,7 +38,7 @@ Status LocalAdmissionControlClient::SubmitForAdmission( query_events->MarkEvent(QUERY_EVENT_SUBMIT_FOR_ADMISSION); bool queued; Status status = ExecEnv::GetInstance()->admission_controller()->SubmitForAdmission( - request, &admit_outcome_, schedule_result, &queued); + request, &admit_outcome_, schedule_result, queued); if (queued) { query_events->MarkEvent(QUERY_EVENT_QUEUED); DCHECK(status.ok());
