Skip to content

Handle temporary connection errors gracefully #26

Description

@jlumbroso

The error log below is okay, but happened for arbitrary error, not clear if there was a retry. May consider catching these types of errors for better reporting?

------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------
RemoteDisconnected                        Traceback (most recent call last)
~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    664             # Make the request on the httplib connection object.
--> 665             httplib_response = self._make_request(
    666                 conn,

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    420                     # Otherwise it looks like a bug in the code.
--> 421                     six.raise_from(e, None)
    422         except (SocketTimeout, BaseSSLError, SocketError) as e:

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/packages/six.py in raise_from(value, from_value)

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    415                 try:
--> 416                     httplib_response = conn.getresponse()
    417                 except BaseException as e:

/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py in getresponse(self)
   1321             try:
-> 1322                 response.begin()
   1323             except ConnectionError:

/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py in begin(self)
    302         while True:
--> 303             version, status, reason = self._read_status()
    304             if status != CONTINUE:

/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py in _read_status(self)
    271             # sending a valid response.
--> 272             raise RemoteDisconnected("Remote end closed connection without"
    273                                      " response")

RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

MaxRetryError                             Traceback (most recent call last)
~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    438             if not chunked:
--> 439                 resp = conn.urlopen(
    440                     method=request.method,

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    718 
--> 719             retries = retries.increment(
    720                 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    435         if new_retry.is_exhausted():
--> 436             raise MaxRetryError(_pool, url, error or ResponseError(cause))
    437 

MaxRetryError: HTTPSConnectionPool(host='api.codepost.io', port=443): Max retries exceeded with url: /submissionTests/149717/ (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))

During handling of the above exception, another exception occurred:

ProxyError                                Traceback (most recent call last)
<ipython-input-37-0ba20f823506> in <module>
      2     print("-", end="")
      3     if submission.id not in test_passed_by_submission_id:
----> 4         test_passed_by_submission_id[submission.id] = sum(map(
      5             lambda test: 1 if test.passed and get_category_from_testcase(test) == "Correctness" else 0,
      6             submission.tests))

<ipython-input-37-0ba20f823506> in <lambda>(test)
      3     if submission.id not in test_passed_by_submission_id:
      4         test_passed_by_submission_id[submission.id] = sum(map(
----> 5             lambda test: 1 if test.passed and get_category_from_testcase(test) == "Correctness" else 0,
      6             submission.tests))
      7 

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/models/abstract/lazy.py in __getattribute__(self, attr)
    100                 # Fetch object and cache
    101                 try:
--> 102                     self._inner = cls().retrieve(id=id)
    103                 except _errors.NotFoundAPIError:
    104                     self._null = True

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/models/abstract/api_crud.py in retrieve(self, id)
     92             raise _errors.InvalidIDError()
     93 
---> 94         ret = self._requestor._request(
     95             endpoint=self.instance_endpoint_by_id(id=_id),
     96             method="GET",

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/api_requestor.py in _request(self, endpoint, method, **kwargs)
    197                 kws["data"] = _json.dumps(kws["data"])
    198 
--> 199         ret = self._client.request(
    200             url=urljoin(self._base_url, endpoint),
    201             **kws

<boltons.funcutils.FunctionBuilder-2> in request(self, url, method, headers, **kwargs)

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/eliot/_action.py in logging_wrapper(*args, **kwargs)
    922 
    923         with start_action(action_type=action_type, **callargs) as ctx:
--> 924             result = wrapped_function(*args, **kwargs)
    925             if include_result:
    926                 ctx.add_success_fields(result=result)

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/http_client.py in request(self, url, method, headers, **kwargs)
    213         except Exception as e:
    214             log_action.finish(exception=e)
--> 215             self._handle_request_error(e)
    216 
    217         log_action.finish()

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/http_client.py in _handle_request_error(self, e)
    222         # Meant to handle HTTP/socket-level errors
    223         # API errors are handled in APIRequestor
--> 224         raise e
    225 
    226     def close(self):

~/GoogleDrive/Programming/codepost/sdk/codepost-python/codepost/http_client.py in request(self, url, method, headers, **kwargs)
    179             try:
    180                 with log_action.context():
--> 181                     ret = session.request(
    182                         method=method,
    183                         url=url,

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    528         }
    529         send_kwargs.update(settings)
--> 530         resp = self.send(prep, **send_kwargs)
    531 
    532         return resp

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/requests/sessions.py in send(self, request, **kwargs)
    641 
    642         # Send the request
--> 643         r = adapter.send(request, **kwargs)
    644 
    645         # Total elapsed time of the request (approximately)

~/.local/share/virtualenvs/pylifttk-jrMvvMYL/lib/python3.8/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    508 
    509             if isinstance(e.reason, _ProxyError):
--> 510                 raise ProxyError(e, request=request)
    511 
    512             if isinstance(e.reason, _SSLError):

ProxyError: HTTPSConnectionPool(host='api.codepost.io', port=443): Max retries exceeded with url: /submissionTests/149717/ (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    pipesThis is not a bug, but something that needs/could be changed with the low-level infrastructurequestionFurther information is requested

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions