matrix-org / matrix-org/matrix-python-sdk

Remote closing connection leads to unhandled exceptions in _sync

オープン
#278 コメント 6 件 リアクション 6 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
Python
スター
266
フォーク
118
PR マージ指標
30日以内にマージされた PR はありません

説明

I just wanted to point out, that without an error callback, the current implementation of having listen_forever in a thread created by the library can lead to unhandled exceptions that cannot be intercepted.

Following traceback sometimes occurs during running my currently developed bridge software, which atm. lets matrix clients run with start_listener_thread() - it happens very occasionally. I only get a real palpable error later, when i try to send with one of those clients - so until then it does not get noticed. i can also provide more information, but i think this is a more general issue.
I also should mention, my client was connected via https externally

I am of course rewriting it to handle threading on my own anyway so it is not an issue for me i hope in the future - however documentation should probably point out problems like this to the user, so he can prepare or set a general exception handler, and maybe if you keep a "simple we do the threading" solution, an exception callback for the thread would also be a solution.

from pip:
used package: matrix-client==0.3.2

the error logged:
matrix_client.client [ERROR]: Exception thrown during sync

the traceback:

Traceback (most recent call last):
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1198, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/myproject/directory/lib/python3.5/site-packages/requests/adapters.py", line 445, in send
    timeout=timeout
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/util/retry.py", line 367, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/packages/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/myproject/directory/lib/python3.5/site-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1198, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/myproject/directory/lib/python3.5/site-packages/matrix_client/api.py", line 670, in _send
    verify=self.validate_cert
  File "/myproject/directory/lib/python3.5/site-packages/requests/sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)
  File "/myproject/directory/lib/python3.5/site-packages/requests/sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)
  File "/myproject/directory/lib/python3.5/site-packages/requests/adapters.py", line 495, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/myproject/directory/lib/python3.5/site-packages/matrix_client/client.py", line 473, in listen_forever
    self._sync(timeout_ms)
  File "/myproject/directory/lib/python3.5/site-packages/matrix_client/client.py", line 555, in _sync
    response = self.api.sync(self.sync_token, timeout_ms, filter=self.sync_filter)
  File "/myproject/directory/lib/python3.5/site-packages/matrix_client/api.py", line 105, in sync
    api_path=MATRIX_V2_API_PATH)
  File "/myproject/directory/lib/python3.5/site-packages/matrix_client/api.py", line 673, in _send
    raise MatrixHttpLibError(e, method, endpoint)
matrix_client.errors.MatrixHttpLibError: Something went wrong in GET requesting https://myproject.host/_matrix/client/r0/sync: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず matrix_client/client.py の listen_forever と _sync 周辺を読み、次に matrix_client/api.py を通じて sync リクエストを追ってください。報告されたリモート切断を再現または追跡し、バックグラウンドスレッドの例外に対して期待される処理を判断してください。その動作とユーザー向けの案内が明確に定義され、カバーされて初めて、この issue は完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
api, backend
issue の種類
バグ
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。