Esempio n. 1
0
 def decorator(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except StructuredException, e:
         message = force_unicode(str(e))
         if 'timed out' in message:
             raise OperationTimeout(e)
         else:
             raise QueryError(message)
Esempio n. 2
0
    def _sync_execute(self, sql, database):
        editor = make_notebook(name='Execute and watch',
                               editor_type=self.engine,
                               statement=sql,
                               database=database,
                               status='ready-execute',
                               skip_historify=True
                               # async=False
                               )

        request = MockRequest(self.user, self.cluster)
        mock_notebook = {}
        snippet = {'type': self.engine}
        response = editor.execute(request)

        if 'handle' in response:
            snippet['result'] = response

            if response['handle'].get('sync'):
                result = response['result']
            else:
                timeout_sec = 20  # To move to Notebook API
                sleep_interval = 0.5
                curr = time.time()
                end = curr + timeout_sec

                api = get_api(request, snippet)

                while curr <= end:
                    status = api.check_status(mock_notebook, snippet)
                    if status['status'] == 'available':
                        result = api.fetch_result(mock_notebook,
                                                  snippet,
                                                  rows=10,
                                                  start_over=True)
                        api.close_statement(mock_notebook, snippet)
                        break
                    time.sleep(sleep_interval)
                    curr = time.time()

                if curr > end:
                    try:
                        api.cancel_operation(snippet)
                    except Exception as e:
                        LOG.warning("Failed to cancel query: %s" % e)
                        api.close_statement(mock_notebook, snippet)
                    raise OperationTimeout(e)

        return result
Esempio n. 3
0
 def decorator(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except StructuredException as e:
         message = force_unicode(str(e))
         if 'timed out' in message:
             raise OperationTimeout(e)
         else:
             raise QueryError(message)
     except QueryServerException as e:
         message = force_unicode(str(e))
         if 'Invalid query handle' in message or 'Invalid OperationHandle' in message:
             raise QueryExpired(e)
         else:
             raise QueryError(message)
Esempio n. 4
0
 def decorator(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except StructuredException as e:
         message = force_unicode(str(e))
         if 'timed out' in message:
             raise OperationTimeout(e)
         elif 'Connection refused' in message or 'Name or service not known' in message or 'Could not connect to any' in message:
             reset_ha()
         else:
             raise QueryError(message)
     except QueryServerException as e:
         message = force_unicode(str(e))
         if 'Invalid query handle' in message or 'Invalid OperationHandle' in message:
             raise QueryExpired(e)
         else:
             raise QueryError(message)
Esempio n. 5
0
    def stats(self, dashboard, fields):
        database, table = self._get_database_table_names(dashboard)

        # TODO: check column stats to go faster

        sql = "SELECT MIN(`%(field)s`), MAX(`%(field)s`) FROM `%(database)s`.`%(table)s`" % {
            'field': fields[0],
            'database': database,
            'table': table
        }

        editor = make_notebook(name='Execute and watch',
                               editor_type=self.engine,
                               statement=sql,
                               database=database,
                               status='ready-execute',
                               skip_historify=True
                               # async=False
                               )

        request = MockRequest(self.user)
        snippet = {'type': self.engine}
        response = editor.execute(request)

        if 'handle' in response:
            snippet['result'] = response

            if response['handle'].get('sync'):
                result = response['result']
            else:
                timeout_sec = 20  # To move to Notebook API
                sleep_interval = 0.5
                curr = time.time()
                end = curr + timeout_sec

                api = get_api(request, snippet)

                while curr <= end:
                    status = api.check_status(dashboard, snippet)
                    if status['status'] == 'available':
                        result = api.fetch_result(dashboard,
                                                  snippet,
                                                  rows=10,
                                                  start_over=True)
                        api.close_statement(snippet)
                        break
                    time.sleep(sleep_interval)
                    curr = time.time()

                if curr > end:
                    try:
                        api.cancel_operation(snippet)
                    except Exception, e:
                        LOG.warning("Failed to cancel query: %s" % e)
                        api.close_statement(snippet)
                    raise OperationTimeout(e)

            stats = list(result['data'])
            min_value, max_value = stats[0]

            if not isinstance(min_value, numbers.Number):
                min_value = min_value.replace(' ', 'T') + 'Z'
                max_value = max_value.replace(' ', 'T') + 'Z'

            return {
                'stats': {
                    'stats_fields': {
                        fields[0]: {
                            'min': min_value,
                            'max': max_value
                        }
                    }
                }
            }