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)
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)
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))
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)
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)
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))