コード例 #1
0
 def _raise_for_status(self, response):
     """ make sure that only crate.exceptions are raised that are defined in
     the DB-API specification """
     http_error_msg = ''
     if 400 <= response.status < 500:
         http_error_msg = '%s Client Error: %s' % (
                             response.status, response.reason)
     elif 500 <= response.status < 600:
         http_error_msg = '%s Server Error: %s' % (
                             response.status, response.reason)
     else:
         return
     if response.status == 503:
         raise ConnectionError(http_error_msg)
     if response.headers.get("content-type", ""
                             ).startswith("application/json"):
         data = json.loads(six.text_type(response.data, 'utf-8'))
         error = data.get('error', {})
         error_trace = data.get('error_trace', None)
         if "results" in data:
             errors = [res["error_message"] for res in data["results"] if res.get("error_message")]
             if errors:
                 raise ProgrammingError("\n".join(errors))
         if isinstance(error, dict):
             raise ProgrammingError(error.get('message', ''), error_trace=error_trace)
         raise ProgrammingError(error, error_trace=error_trace)
     raise ProgrammingError(http_error_msg)
コード例 #2
0
    def _drop_server(self, server, message):
        """
        Drop server from active list and adds it to the inactive ones.
        """

        # Try to close resource first.
        try:
            self.server_pool[server].close()
        except Exception as ex:
            logger.warning(
                "When removing server from active pool, "
                "resource could not be closed: %s", ex)

        # Apply bookkeeping.
        try:
            self._active_servers.remove(server)
        except ValueError:
            pass
        else:
            heapq.heappush(self._inactive_servers, (time(), server, message))
            logger.warning("Removed server %s from active pool", server)

        # If this is the last server, raise an exception.
        if not self._active_servers:
            raise ConnectionError(("No more Servers available, "
                                   "exception from last server: %s") % message)
コード例 #3
0
    def _request(self, method, path, server=None, **kwargs):
        """Execute a request to the cluster

        A server is selected from the server pool.
        """
        while True:
            next_server = server or self._get_server()
            try:
                response = self.server_pool[next_server].request(
                    method,
                    path,
                    username=self.username,
                    password=self.password,
                    backoff_factor=self.backoff_factor,
                    schema=self.schema,
                    **kwargs)
                redirect_location = response.get_redirect_location()
                if redirect_location and 300 <= response.status <= 308:
                    redirect_server = _server_url(redirect_location)
                    self._add_server(redirect_server)
                    return self._request(method,
                                         path,
                                         server=redirect_server,
                                         **kwargs)
                if not server and response.status in SRV_UNAVAILABLE_STATUSES:
                    with self._lock:
                        # drop server from active ones
                        self._drop_server(next_server, response.reason)
                else:
                    return response
            except (
                    MaxRetryError,
                    ReadTimeoutError,
                    SSLError,
                    HTTPError,
                    ProxyError,
            ) as ex:
                ex_message = _ex_to_message(ex)
                if server:
                    raise ConnectionError(
                        "Server not available, exception: %s" % ex_message)
                preserve_server = False
                if isinstance(ex, ProtocolError):
                    preserve_server = any(
                        t in [type(arg) for arg in ex.args]
                        for t in PRESERVE_ACTIVE_SERVER_EXCEPTIONS)
                if (not preserve_server):
                    with self._lock:
                        # drop server from active ones
                        self._drop_server(next_server, ex_message)
            except Exception as e:
                raise ProgrammingError(_ex_to_message(e))
コード例 #4
0
def _execute_sql(stmt):
    """
    Invoke a single SQL statement and automatically close the HTTP connection
    when done.
    """
    with connect(crate.http_url) as conn:
        c = conn.cursor()
        try:
            c.execute(stmt)
        except ConnectionError as e:
            logfile = os.path.join(crate.logs_path,
                                   crate.cluster_name + '.log')
            with open(logfile, 'r') as f:
                logs = f.read()
            msg = str(e) + '\n' + logs
            raise ConnectionError(msg, e.error_trace)
コード例 #5
0
    def _drop_server(self, server, message):
        """
        Drop server from active list and adds it to the inactive ones.
        """
        try:
            self._active_servers.remove(server)
        except ValueError:
            pass
        else:
            heapq.heappush(self._inactive_servers, (time(), server, message))
            logger.warning("Removed server %s from active pool", server)

        # if this is the last server raise exception, otherwise try next
        if not self._active_servers:
            raise ConnectionError(("No more Servers available, "
                                   "exception from last server: %s") % message)
コード例 #6
0
ファイル: http.py プロジェクト: danish123gupta/assignment-19
    def _request(self, method, path, server=None, **kwargs):
        """Execute a request to the cluster

        A server is selected from the server pool.
        """
        while True:
            next_server = server or self._get_server()
            try:
                response = self.server_pool[next_server].request(
                    method,
                    path,
                    username=self.username,
                    password=self.password,
                    schema=self.schema,
                    **kwargs)
                redirect_location = response.get_redirect_location()
                if redirect_location and 300 <= response.status <= 308:
                    redirect_server = _server_url(redirect_location)
                    self._add_server(redirect_server)
                    return self._request(method,
                                         path,
                                         server=redirect_server,
                                         **kwargs)
                if not server and response.status in SRV_UNAVAILABLE_STATUSES:
                    with self._lock:
                        # drop server from active ones
                        self._drop_server(next_server, response.reason)
                else:
                    return response
            except (
                    urllib3.exceptions.MaxRetryError,
                    urllib3.exceptions.ReadTimeoutError,
                    urllib3.exceptions.SSLError,
                    urllib3.exceptions.HTTPError,
                    urllib3.exceptions.ProxyError,
            ) as ex:
                ex_message = _ex_to_message(ex)
                if server:
                    raise ConnectionError(
                        "Server not available, exception: %s" % ex_message)
                with self._lock:
                    # drop server from active ones
                    self._drop_server(next_server, ex_message)
            except Exception as e:
                raise ProgrammingError(_ex_to_message(e))