MagicStack / MagicStack/asyncpg

Infinite hang on leaving conn.transaction() block

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

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

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

説明

Hi, I am experiencing hangs at aexit of Transaction context manager, with traceback as follows:

...
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/transaction.py", line 89, in __aexit__
    await self.__rollback()
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/transaction.py", line 198, in __rollback
    await self._connection.execute(query)
  File "/code/callmeback/detail/log_helpers/postgre_conn.py", line 53, in execute
    return await super(LoggingConn, self).execute(query, *args, timeout=timeout)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 273, in execute
    return await self._protocol.query(query, timeout)

Default command timeout is set for connection:

>>> conn = frame.f_locals['self']
>>> conn._config
ConnectionConfiguration(command_timeout=10.0, statement_cache_size=100, max_cached_statement_lifetime=300, max_cacheable_statement_size=15360)
>>> conn._protocol._get_timeout(None)
10.0

So I expect self._protocol.query() to throw TimeoutError of some kind, but related coroutine hanged for three days with no progress.

I will happily provide you with any additional information, if I can. My app has aiomonitor onboard, so if any info reachable that way will help you - please let me know.

I tried to fiddle with conn._protocol, but almost nothing of its state is reachable from aioconsole since it's Cython.

My suspection is that exception that leads to rollback is coming from in-transaction query that somehow leads connection in such a state that rollback() cannot be processed normally. I will provide you with information about exception once that problem triggers next time.

  • asyncpg version: 0.18.3
  • PostgreSQL version: 10.7
  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
    the issue with a local PostgreSQL install?
    :
  • Python version: 3.7
  • Platform: Ubuntu 16.04
  • Do you use pgbouncer?: Yes (session-level pooling)
  • Did you install asyncpg with pip?: Yes
  • If you built asyncpg locally, which version of Cython did you use?: --
  • Can the issue be reproduced under both asyncio and
    uvloop?
    : Yes, I am using uvloop

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

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

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

調査の方向性

asyncpg/transaction.py の aexitrollback から始め、次に connection.py の execute() をたどって _protocol.query() まで確認してください。可能であれば、PostgreSQL 10.7、セッションレベルの pgbouncer プーリング、uvloop を使ってハングを再現します。ロールバックパスが完了するか、ハングする代わりに設定されたタイムアウトを表面化すれば完了です。

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

評価

技術スタック
postgresql, python
領域
backend, databases
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
35/100

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

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