Browse Source

HUE-994 [impala] Close queries

Close Impala query when leaving the result page.
Also close canceled queries.
Romain Rigaux 12 năm trước cách đây
mục cha
commit
074f336

+ 14 - 3
apps/beeswax/src/beeswax/server/dbms.py

@@ -32,8 +32,9 @@ from beeswax import hive_site
 from beeswax.conf import BEESWAX_SERVER_HOST, BEESWAX_SERVER_PORT,\
   BROWSE_PARTITIONED_TABLE_LIMIT, SERVER_INTERFACE
 from beeswax.design import hql_query
-from beeswax.models import QueryHistory, HIVE_SERVER2
+from beeswax.models import QueryHistory, HIVE_SERVER2, BEESWAX
 from desktop.lib.django_util import format_preserving_redirect
+from desktop.lib.exceptions_renderable import PopupException
 
 
 LOG = logging.getLogger(__name__)
@@ -146,8 +147,18 @@ class Dbms:
     return self.client.fetch(query_handle, start_over, rows)
 
 
+  def close_operation(self, query_handle):
+    if self.server_type == BEESWAX:
+      raise PopupException(_('%s interface does not support close_operation. %s interface does.') % (BEESWAX, HIVE_SERVER2))
+
+    return self.client.close_operation(query_handle)
+
+
   def cancel_operation(self, query_handle):
-    return self.client.cancel_operation(query_handle)
+    resp = self.client.cancel_operation(query_handle)
+    if self.client.query_server['server_name'] == 'impala':
+      resp = self.client.close_operation(query_handle)
+    return resp
 
 
   def get_sample(self, database, table):
@@ -296,7 +307,7 @@ class Dbms:
     if self.server_type == HIVE_SERVER2:
       query = hql_query('USE %s' % database)
       self.client.query(query)
-
+      # TODO sync + close query
 
   def get_log(self, query_handle):
     return self.client.get_log(query_handle)

+ 12 - 1
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -27,7 +27,8 @@ from TCLIService import TCLIService
 from TCLIService.ttypes import TOpenSessionReq, TGetTablesReq, TFetchResultsReq,\
   TStatusCode, TGetResultSetMetadataReq, TGetColumnsReq, TType,\
   TExecuteStatementReq, TGetOperationStatusReq, TFetchOrientation,\
-  TCloseSessionReq, TGetSchemasReq, TGetLogReq, TCancelOperationReq
+  TCloseSessionReq, TGetSchemasReq, TGetLogReq, TCancelOperationReq,\
+  TCloseOperationReq
 
 from beeswax import conf
 from beeswax import hive_site
@@ -454,6 +455,11 @@ class HiveServerClient:
     return self.call(self._client.CancelOperation, req)
 
 
+  def close_operation(self, operation_handle):
+    req = TCloseOperationReq(operationHandle=operation_handle)
+    return self.call(self._client.CancelOperation, req)
+
+
   def get_columns(self, database, table):
     req = TGetColumnsReq(schemaName=database, tableName=table)
     res = self.call(self._client.GetColumns, req)
@@ -617,6 +623,11 @@ class HiveServerClientCompatible:
     return self._client.cancel_operation(operationHandle)
 
 
+  def close_operation(self, handle):
+    operationHandle = handle.get_rpc_handle()
+    return self._client.close_operation(operationHandle)
+
+
   def dump_config(self):
     return 'Does not exist in HS2'
 

+ 7 - 1
apps/beeswax/src/beeswax/templates/watch_results.mako

@@ -60,7 +60,6 @@ ${layout.menubar(section='query')}
   .noLeftMargin {
     margin-left: 0!important;
   }
-
 </style>
 
 <div class="container-fluid">
@@ -260,6 +259,7 @@ ${layout.menubar(section='query')}
 
 <script type="text/javascript" charset="utf-8">
 $(document).ready(function () {
+
   var dataTable = $(".resultTable").dataTable({
     "bPaginate": false,
     "bLengthChange": false,
@@ -401,6 +401,12 @@ $(document).ready(function () {
   });
 
   _dt.jHueScrollUp();
+
+  % if app_name == 'impala':
+    window.onbeforeunload = function(e) {
+      $.ajax({url: "${ url(app_name + ':close_operation', query.id) }", type: 'post', async: false});
+    }
+  % endif
 });
 </script>
 

+ 1 - 0
apps/beeswax/src/beeswax/urls.py

@@ -26,6 +26,7 @@ urlpatterns = patterns('beeswax.views',
   url(r'^watch/(?P<id>\d+)$', 'watch_query', name='watch_query'),
   url(r'^watch/json/(?P<id>\d+)$', 'watch_query_refresh_json', name='watch_query_refresh_json'),
   url(r'^cancel_operation/(?P<query_id>\d+)?$', 'cancel_operation', name='cancel_operation'),
+  url(r'^close_operation/(?P<query_id>\d+)?$', 'close_operation', name='close_operation'),
   url(r'^results/(?P<id>\d+)/(?P<first_row>\d+)$', 'view_results', name='view_results'),
   url(r'^download/(?P<id>\d+)/(?P<format>\w+)$', 'download', name='download'),
   url(r'^save_results/(?P<id>\d+)$', 'save_results', name='save_results'),

+ 18 - 0
apps/beeswax/src/beeswax/views.py

@@ -566,6 +566,24 @@ def cancel_operation(request, query_id):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+def close_operation(request, query_id):
+  response = {'status': -1, 'message': ''}
+
+  if request.method != 'POST':
+    response['message'] = _('A POST request is required.')
+  else:
+    try:
+      query_history = authorized_get_history(request, query_id, must_exist=True)
+      db = dbms.get(request.user, query_history.get_query_server_config())
+      db.close_operation(query_history.get_handle())
+      _get_query_handle_and_state(query_history)
+      response = {'status': 0}
+    except Exception, e:
+      response = {'message': unicode(e)}
+
+  return HttpResponse(json.dumps(response), mimetype="application/json")
+
+
 def view_results(request, id, first_row=0):
   """
   Returns the view for the results of the QueryHistory with the given id.