You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2016/07/06 00:40:36 UTC

incubator-impala git commit: IMPALA-2767: Web UI call to force expire sessions

Repository: incubator-impala
Updated Branches:
  refs/heads/master 0dde1c2f8 -> d60b70769


IMPALA-2767: Web UI call to force expire sessions

This change adds a "Close session" button in the sessions Web UI
which destroys the session with the client when clicked.

Change-Id: Ia2639993502a6deb5c24c3f1d055d82ade05ff67
Reviewed-on: http://gerrit.cloudera.org:8080/3555
Reviewed-by: Sailesh Mukil <sa...@cloudera.com>
Tested-by: Sailesh Mukil <sa...@cloudera.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/d60b7076
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/d60b7076
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/d60b7076

Branch: refs/heads/master
Commit: d60b70769a7ef14a8170565253aaefdd6e80f7bf
Parents: 0dde1c2
Author: Sailesh Mukil <sa...@cloudera.com>
Authored: Thu Jun 16 16:39:22 2016 -0700
Committer: Tim Armstrong <ta...@cloudera.com>
Committed: Tue Jul 5 17:40:33 2016 -0700

----------------------------------------------------------------------
 be/src/service/impala-http-handler.cc | 46 +++++++++++++++++++++++-------
 be/src/service/impala-http-handler.h  |  4 +++
 www/sessions.tmpl                     |  2 ++
 3 files changed, 42 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/d60b7076/be/src/service/impala-http-handler.cc
----------------------------------------------------------------------
diff --git a/be/src/service/impala-http-handler.cc b/be/src/service/impala-http-handler.cc
index 5b97890..d2ffdd8 100644
--- a/be/src/service/impala-http-handler.cc
+++ b/be/src/service/impala-http-handler.cc
@@ -50,15 +50,16 @@ Webserver::UrlCallback MakeCallback(T* caller, const F& fnc) {
   };
 }
 
-// We expect the query id to be passed as one parameter, 'query_id'.
-// Returns true if the query id was present and valid; false otherwise.
-static Status ParseQueryId(const Webserver::ArgumentMap& args, TUniqueId* id) {
-  Webserver::ArgumentMap::const_iterator it = args.find("query_id");
+// We expect the id to be passed as one parameter. Eg: 'query_id' or 'session_id'.
+// Returns true if the id was present and valid; false otherwise.
+static Status ParseIdFromArguments(const Webserver::ArgumentMap& args, TUniqueId* id,
+    const std::string &to_find) {
+  Webserver::ArgumentMap::const_iterator it = args.find(to_find);
   if (it == args.end()) {
-    return Status("No 'query_id' argument found");
+    return Status(Substitute("No '$0' argument found.", to_find));
   } else {
     if (ParseId(it->second, id)) return Status::OK();
-    return Status(Substitute("Could not parse 'query_id' argument: $0", it->second));
+    return Status(Substitute("Could not parse '$0' argument: $1", to_find, it->second));
   }
 }
 
@@ -88,6 +89,9 @@ void ImpalaHttpHandler::RegisterHandlers(Webserver* webserver) {
   webserver->RegisterUrlCallback("/cancel_query", "common-pre.tmpl",
       MakeCallback(this, &ImpalaHttpHandler::CancelQueryHandler), false);
 
+  webserver->RegisterUrlCallback("/close_session", "common-pre.tmpl",
+      MakeCallback(this, &ImpalaHttpHandler::CloseSessionHandler), false);
+
   webserver->RegisterUrlCallback("/query_profile_encoded", "raw_text.tmpl",
       MakeCallback(this, &ImpalaHttpHandler::QueryProfileEncodedHandler), false);
 
@@ -133,7 +137,7 @@ void ImpalaHttpHandler::HadoopVarzHandler(const Webserver::ArgumentMap& args,
 void ImpalaHttpHandler::CancelQueryHandler(const Webserver::ArgumentMap& args,
     Document* document) {
   TUniqueId unique_id;
-  Status status = ParseQueryId(args, &unique_id);
+  Status status = ParseIdFromArguments(args, &unique_id, "query_id");
   if (!status.ok()) {
     Value error(status.GetDetail().c_str(), document->GetAllocator());
     document->AddMember("error", error, document->GetAllocator());
@@ -150,10 +154,32 @@ void ImpalaHttpHandler::CancelQueryHandler(const Webserver::ArgumentMap& args,
   document->AddMember("contents", message, document->GetAllocator());
 }
 
+void ImpalaHttpHandler::CloseSessionHandler(const Webserver::ArgumentMap& args,
+    Document* document) {
+  TUniqueId unique_id;
+  Status status = ParseIdFromArguments(args, &unique_id, "session_id");
+  if (!status.ok()) {
+    Value error(status.GetDetail().c_str(), document->GetAllocator());
+    document->AddMember("error", error, document->GetAllocator());
+    return;
+  }
+  Status cause("Session closed from Impala's debug web interface");
+  status = server_->CloseSessionInternal(unique_id, true);
+  if (!status.ok()) {
+    Value error(status.GetDetail().c_str(), document->GetAllocator());
+    document->AddMember("error", error, document->GetAllocator());
+    return;
+  }
+  stringstream ss;
+  ss << "Session " << unique_id << " closed successfully";
+  Value message(ss.str().c_str(), document->GetAllocator());
+  document->AddMember("contents", message, document->GetAllocator());
+}
+
 void ImpalaHttpHandler::QueryProfileHandler(const Webserver::ArgumentMap& args,
     Document* document) {
   TUniqueId unique_id;
-  Status parse_status = ParseQueryId(args, &unique_id);
+  Status parse_status = ParseIdFromArguments(args, &unique_id, "query_id");
   if (!parse_status.ok()) {
     Value error(parse_status.GetDetail().c_str(), document->GetAllocator());
     document->AddMember("error", error, document->GetAllocator());
@@ -178,7 +204,7 @@ void ImpalaHttpHandler::QueryProfileEncodedHandler(const Webserver::ArgumentMap&
     Document* document) {
   TUniqueId unique_id;
   stringstream ss;
-  Status status = ParseQueryId(args, &unique_id);
+  Status status = ParseIdFromArguments(args, &unique_id, "query_id");
   if (!status.ok()) {
     ss << status.GetDetail();
   } else {
@@ -609,7 +635,7 @@ void PlanToJson(const vector<TPlanFragment>& fragments, const TExecSummary& summ
 void ImpalaHttpHandler::QuerySummaryHandler(bool include_json_plan, bool include_summary,
     const Webserver::ArgumentMap& args, Document* document) {
   TUniqueId query_id;
-  Status status = ParseQueryId(args, &query_id);
+  Status status = ParseIdFromArguments(args, &query_id, "query_id");
   if (!status.ok()) {
     // Redact the error message, it may contain part or all of the query.
     Value json_error(RedactCopy(status.GetDetail()).c_str(), document->GetAllocator());

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/d60b7076/be/src/service/impala-http-handler.h
----------------------------------------------------------------------
diff --git a/be/src/service/impala-http-handler.h b/be/src/service/impala-http-handler.h
index e5c41f9..443ab65 100644
--- a/be/src/service/impala-http-handler.h
+++ b/be/src/service/impala-http-handler.h
@@ -92,6 +92,10 @@ class ImpalaHttpHandler {
   void CancelQueryHandler(const Webserver::ArgumentMap& args,
       rapidjson::Document* document);
 
+  /// Closes an active session with a client.
+  void CloseSessionHandler(const Webserver::ArgumentMap& args,
+      rapidjson::Document* document);
+
   /// Upon return, 'document' will contain the query profile as a base64 encoded object in
   /// 'contents'.
   void QueryProfileEncodedHandler(const Webserver::ArgumentMap& args,

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/d60b7076/www/sessions.tmpl
----------------------------------------------------------------------
diff --git a/www/sessions.tmpl b/www/sessions.tmpl
index e8f541d..9d2de5d 100644
--- a/www/sessions.tmpl
+++ b/www/sessions.tmpl
@@ -34,6 +34,7 @@ There are {{num_sessions}} active sessions.
     <th>Expired</th>
     <th>Closed</th>
     <th>Ref count</th>
+    <th>Action</th>
   </tr>
 {{#sessions}}
   <tr>
@@ -51,6 +52,7 @@ There are {{num_sessions}} active sessions.
     <td>{{expired}}</td>
     <td>{{closed}}</td>
     <td>{{ref_count}}</td>
+    <td><a href='/close_session?session_id={{session_id}}'>Close Session</a></td>
   </tr>
 {{/sessions}}
 </table>