Ver código fonte

HUE-5928 [metastore] Table page of partitioned table crashes even if user has some column level access

Romain Rigaux 8 anos atrás
pai
commit
c02168aba3

+ 8 - 4
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -147,10 +147,14 @@ class HiveServerTable(Table):
 
   @property
   def stats(self):
-    rows = self.properties
-    col_row_index = map(itemgetter('col_name'), rows).index('Table Parameters:') + 1
-    end_cols_index = map(itemgetter('data_type'), rows[col_row_index:]).index(None)
-    return rows[col_row_index:][:end_cols_index]
+    try:
+      rows = self.properties
+      col_row_index = map(itemgetter('col_name'), rows).index('Table Parameters:') + 1
+      end_cols_index = map(itemgetter('data_type'), rows[col_row_index:]).index(None)
+      return rows[col_row_index:][:end_cols_index]
+    except:
+      LOG.exception('Table stats could not be retrieved')
+      return []
 
   @property
   def storage_details(self):

+ 12 - 5
apps/metastore/src/metastore/views.py

@@ -29,14 +29,14 @@ from django.views.decorators.http import require_http_methods
 from desktop.context_processors import get_app_name
 from desktop.lib.django_util import JsonResponse, render
 from desktop.lib.exceptions_renderable import PopupException
-from desktop.models import Document, Document2
+from desktop.models import Document2
 
 from metadata.conf import has_optimizer, has_navigator, get_optimizer_url, get_navigator_url
 
 from beeswax.design import hql_query
-from beeswax.models import SavedQuery, MetaInstall
+from beeswax.models import SavedQuery
 from beeswax.server import dbms
-from beeswax.server.dbms import get_query_server_config, QueryServerException
+from beeswax.server.dbms import get_query_server_config
 from filebrowser.views import location_to_url
 from metastore.forms import LoadDataForm, DbForm
 from metastore.settings import DJANGO_APPS
@@ -272,7 +272,10 @@ def describe_table(request, database, table):
 
     partitions = None
     if app_name != 'impala' and table.partition_keys:
-      partitions = [_massage_partition(database, table, partition) for partition in db.get_partitions(database, table)]
+      try:
+        partitions = [_massage_partition(database, table, partition) for partition in db.get_partitions(database, table)]
+      except:
+        LOG.exception('Table partitions could not be retrieved')
 
     return render(renderable, request, {
       'breadcrumbs': [{
@@ -450,7 +453,11 @@ def describe_partitions(request, database, table):
   else:
     partition_spec = ''
 
-  partitions = db.get_partitions(database, table_obj, partition_spec, reverse_sort=reverse_sort)
+  try:
+    partitions = db.get_partitions(database, table_obj, partition_spec, reverse_sort=reverse_sort)    
+  except:
+    LOG.exception('Table partitions could not be retrieved')
+    partitions = []
   massaged_partitions = [_massage_partition(database, table_obj, partition) for partition in partitions]
 
   if request.method == "POST" or request.GET.get('format', 'html') == 'json':

+ 5 - 2
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -416,8 +416,11 @@ class HS2Api(Api):
 
   @query_error_handler
   def get_sample_data(self, snippet, database=None, table=None, column=None):
-    db = self._get_db(snippet)
-    return _get_sample_data(db, database, table, column)
+    try:
+      db = self._get_db(snippet)
+      return _get_sample_data(db, database, table, column)
+    except QueryServerException, ex:
+      raise QueryError(ex.message)
 
 
   @query_error_handler