You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by tm...@apache.org on 2018/10/17 17:03:00 UTC
[05/11] impala git commit: IMPALA-7545: Add queuing reason to query
log
IMPALA-7545: Add queuing reason to query log
After this change, the HS2 GetLog() function returns the queuing
reason for a query when it is queued by the AdmissionController.
Testing: Added an end-to-end test to test_admission_controller.py
to verify the query logs returned.
Change-Id: I2e5d8de4f6691a9ba2594ca68c54ea4dca760545
Reviewed-on: http://gerrit.cloudera.org:8080/11669
Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
Tested-by: Impala Public Jenkins <im...@cloudera.com>
Project: http://git-wip-us.apache.org/repos/asf/impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/ec2dabaf
Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/ec2dabaf
Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/ec2dabaf
Branch: refs/heads/master
Commit: ec2dabafb989e2aca0fddb8f6c467e6f551d0424
Parents: 97731e5
Author: poojanilangekar <po...@cloudera.com>
Authored: Fri Oct 12 10:48:49 2018 -0700
Committer: Impala Public Jenkins <im...@cloudera.com>
Committed: Tue Oct 16 01:47:05 2018 +0000
----------------------------------------------------------------------
be/src/scheduling/admission-controller.cc | 28 +++++++------
be/src/scheduling/admission-controller.h | 13 +++++++
be/src/service/impala-hs2-server.cc | 20 +++++++++-
.../custom_cluster/test_admission_controller.py | 41 ++++++++++++++++++++
4 files changed, 89 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/impala/blob/ec2dabaf/be/src/scheduling/admission-controller.cc
----------------------------------------------------------------------
diff --git a/be/src/scheduling/admission-controller.cc b/be/src/scheduling/admission-controller.cc
index e2b5415..000429f 100644
--- a/be/src/scheduling/admission-controller.cc
+++ b/be/src/scheduling/admission-controller.cc
@@ -102,17 +102,23 @@ const string QUERY_EVENT_QUEUED = "Queued";
const string QUERY_EVENT_COMPLETED_ADMISSION = "Completed admission";
// Profile info strings
-const string PROFILE_INFO_KEY_ADMISSION_RESULT = "Admission result";
-const string PROFILE_INFO_VAL_ADMIT_IMMEDIATELY = "Admitted immediately";
-const string PROFILE_INFO_VAL_QUEUED = "Queued";
-const string PROFILE_INFO_VAL_CANCELLED_IN_QUEUE= "Cancelled (queued)";
-const string PROFILE_INFO_VAL_ADMIT_QUEUED = "Admitted (queued)";
-const string PROFILE_INFO_VAL_REJECTED = "Rejected";
-const string PROFILE_INFO_VAL_TIME_OUT = "Timed out (queued)";
-const string PROFILE_INFO_KEY_INITIAL_QUEUE_REASON = "Initial admission queue reason";
-const string PROFILE_INFO_VAL_INITIAL_QUEUE_REASON = "waited $0 ms, reason: $1";
-const string PROFILE_INFO_KEY_LAST_QUEUED_REASON = "Latest admission queue reason";
-const string PROFILE_INFO_KEY_ADMITTED_MEM = "Cluster Memory Admitted";
+const string AdmissionController::PROFILE_INFO_KEY_ADMISSION_RESULT = "Admission result";
+const string AdmissionController::PROFILE_INFO_VAL_ADMIT_IMMEDIATELY =
+ "Admitted immediately";
+const string AdmissionController::PROFILE_INFO_VAL_QUEUED = "Queued";
+const string AdmissionController::PROFILE_INFO_VAL_CANCELLED_IN_QUEUE =
+ "Cancelled (queued)";
+const string AdmissionController::PROFILE_INFO_VAL_ADMIT_QUEUED = "Admitted (queued)";
+const string AdmissionController::PROFILE_INFO_VAL_REJECTED = "Rejected";
+const string AdmissionController::PROFILE_INFO_VAL_TIME_OUT = "Timed out (queued)";
+const string AdmissionController::PROFILE_INFO_KEY_INITIAL_QUEUE_REASON =
+ "Initial admission queue reason";
+const string AdmissionController::PROFILE_INFO_VAL_INITIAL_QUEUE_REASON =
+ "waited $0 ms, reason: $1";
+const string AdmissionController::PROFILE_INFO_KEY_LAST_QUEUED_REASON =
+ "Latest admission queue reason";
+const string AdmissionController::PROFILE_INFO_KEY_ADMITTED_MEM =
+ "Cluster Memory Admitted";
// Error status string details
const string REASON_MEM_LIMIT_TOO_LOW_FOR_RESERVATION =
http://git-wip-us.apache.org/repos/asf/impala/blob/ec2dabaf/be/src/scheduling/admission-controller.h
----------------------------------------------------------------------
diff --git a/be/src/scheduling/admission-controller.h b/be/src/scheduling/admission-controller.h
index b88356c..5b741b9 100644
--- a/be/src/scheduling/admission-controller.h
+++ b/be/src/scheduling/admission-controller.h
@@ -214,6 +214,19 @@ enum class AdmissionOutcome {
class AdmissionController {
public:
+ // Profile info strings
+ static const string PROFILE_INFO_KEY_ADMISSION_RESULT;
+ static const string PROFILE_INFO_VAL_ADMIT_IMMEDIATELY;
+ static const string PROFILE_INFO_VAL_QUEUED;
+ static const string PROFILE_INFO_VAL_CANCELLED_IN_QUEUE;
+ static const string PROFILE_INFO_VAL_ADMIT_QUEUED;
+ static const string PROFILE_INFO_VAL_REJECTED;
+ static const string PROFILE_INFO_VAL_TIME_OUT;
+ static const string PROFILE_INFO_KEY_INITIAL_QUEUE_REASON;
+ static const string PROFILE_INFO_VAL_INITIAL_QUEUE_REASON;
+ static const string PROFILE_INFO_KEY_LAST_QUEUED_REASON;
+ static const string PROFILE_INFO_KEY_ADMITTED_MEM;
+
AdmissionController(StatestoreSubscriber* subscriber,
RequestPoolService* request_pool_service, MetricGroup* metrics,
const TNetworkAddress& host_addr);
http://git-wip-us.apache.org/repos/asf/impala/blob/ec2dabaf/be/src/service/impala-hs2-server.cc
----------------------------------------------------------------------
diff --git a/be/src/service/impala-hs2-server.cc b/be/src/service/impala-hs2-server.cc
index 881b19a..f2e401e 100644
--- a/be/src/service/impala-hs2-server.cc
+++ b/be/src/service/impala-hs2-server.cc
@@ -35,10 +35,11 @@
#include "common/version.h"
#include "rpc/thrift-util.h"
#include "runtime/coordinator.h"
-#include "runtime/raw-value.h"
#include "runtime/exec-env.h"
-#include "service/hs2-util.h"
+#include "runtime/raw-value.h"
+#include "scheduling/admission-controller.h"
#include "service/client-request-state.h"
+#include "service/hs2-util.h"
#include "service/query-options.h"
#include "service/query-result-set.h"
#include "util/auth-util.h"
@@ -826,6 +827,21 @@ void ImpalaServer::GetLog(TGetLogResp& return_val, const TGetLogReq& request) {
}
// Report analysis errors
ss << join(request_state->GetAnalysisWarnings(), "\n");
+ // Report queuing reason if the admission controller queued the query.
+ const string* admission_result = request_state->summary_profile()->GetInfoString(
+ AdmissionController::PROFILE_INFO_KEY_ADMISSION_RESULT);
+ if (admission_result != nullptr) {
+ if (*admission_result == AdmissionController::PROFILE_INFO_VAL_QUEUED) {
+ ss << AdmissionController::PROFILE_INFO_KEY_ADMISSION_RESULT << " : "
+ << *admission_result << "\n";
+ const string* queued_reason = request_state->summary_profile()->GetInfoString(
+ AdmissionController::PROFILE_INFO_KEY_LAST_QUEUED_REASON);
+ if (queued_reason != nullptr) {
+ ss << AdmissionController::PROFILE_INFO_KEY_LAST_QUEUED_REASON << " : "
+ << *queued_reason << "\n";
+ }
+ }
+ }
if (coord != nullptr) {
// Report execution errors
ss << coord->GetErrorLog();
http://git-wip-us.apache.org/repos/asf/impala/blob/ec2dabaf/tests/custom_cluster/test_admission_controller.py
----------------------------------------------------------------------
diff --git a/tests/custom_cluster/test_admission_controller.py b/tests/custom_cluster/test_admission_controller.py
index 56d2b0b..fc74f00 100644
--- a/tests/custom_cluster/test_admission_controller.py
+++ b/tests/custom_cluster/test_admission_controller.py
@@ -817,6 +817,47 @@ class TestAdmissionController(TestAdmissionControllerBase, HS2TestSuite):
assert False, "Timed out waiting for change to profile\nSearch " \
"String: {0}\nProfile:\n{1}".format(search_string, str(profile))
+ @pytest.mark.execute_serially
+ @CustomClusterTestSuite.with_args(
+ impalad_args=impalad_admission_ctrl_flags(max_requests=1, max_queued=10,
+ pool_max_mem=1024 * 1024 * 1024))
+ @needs_session()
+ def test_hs2_admission_controller_logs(self):
+ """Test to verify that the GetLog() function invoked by the HS2 client returns the
+ reason for queuing of the query."""
+ # Start a long running query.
+ long_query_req = TCLIService.TExecuteStatementReq()
+ long_query_req.sessionHandle = self.session_handle
+ long_query_req.statement = "select sleep(1000000)"
+ long_query_resp = self.hs2_client.ExecuteStatement(long_query_req)
+ HS2TestSuite.check_response(long_query_resp)
+ # Ensure that the query is running.
+ self.wait_for_admission_control(long_query_resp.operationHandle)
+ # Submit another query.
+ execute_statement_req = TCLIService.TExecuteStatementReq()
+ execute_statement_req.sessionHandle = self.session_handle
+ execute_statement_req.statement = "select 1"
+ execute_statement_resp = self.hs2_client.ExecuteStatement(execute_statement_req)
+ HS2TestSuite.check_response(execute_statement_resp)
+ # Wait until the query is queued.
+ self.wait_for_operation_state(execute_statement_resp.operationHandle,
+ TCLIService.TOperationState.PENDING_STATE)
+ # Ensure that the log message contains the queuing reason.
+ get_log_req = TCLIService.TGetLogReq()
+ get_log_req.operationHandle = execute_statement_resp.operationHandle
+ log = self.hs2_client.GetLog(get_log_req).log
+ assert "Admission result : Queued" in log, log
+ assert "Latest admission queue reason : number of running queries 1 is at or over "
+ "limit 1" in log, log
+ # Close the running query.
+ close_operation_req = TCLIService.TCloseOperationReq()
+ close_operation_req.operationHandle = long_query_resp.operationHandle
+ HS2TestSuite.check_response(self.hs2_client.CloseOperation(close_operation_req))
+ # Close the queued query.
+ close_operation_req = TCLIService.TCloseOperationReq()
+ close_operation_req.operationHandle = execute_statement_resp.operationHandle
+ HS2TestSuite.check_response(self.hs2_client.CloseOperation(close_operation_req))
+
class TestAdmissionControllerStress(TestAdmissionControllerBase):
"""Submits a number of queries (parameterized) with some delay between submissions