MagicStack / MagicStack/uvloop

signal handler sockets error on close leaving loop in 'running' state indefinitely

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

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

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

説明

  • uvloop version: 0.19.0 and 0.20.0
  • Python version: 3.12
  • Platform: linux/aws lambda
  • Can you reproduce the bug with PYTHONASYNCIODEBUG in env?:
  • Does uvloop behave differently from vanilla asyncio? How?: have observed the same error on asyncio

I have not been able to come up with a reproduction for this as I think it has something to do with how aws lambda freezes and thaws lambdas.

I have an aws lambda using uvloop that handles requests with using loop.run_until_complete. I can't use uvloop.run or aysncio.run since I need client connected to that loop to still be present on the next invocation of the lambda. Occassionally we have observed errors on the lambda with the following stack trace:

[ERROR] OSError: [Errno 9] Bad file descriptor
Traceback (most recent call last):
  File "/my_code.py", line 302, in request_handler
    self.loop.run_until_complete(_process_records())
  File "uvloop/loop.pyx", line 1511, in uvloop.loop.Loop.run_until_complete
  File "uvloop/loop.pyx", line 1504, in uvloop.loop.Loop.run_until_complete
  File "uvloop/loop.pyx", line 1377, in uvloop.loop.Loop.run_forever
  File "uvloop/loop.pyx", line 547, in uvloop.loop.Loop._run
  File "uvloop/loop.pyx", line 348, in uvloop.loop.Loop._pause_signals
  File "/root/.pyenv/versions/3.12.1/lib/python3.12/socket.py", line 504, in close
    self._real_close()
  File "/root/.pyenv/versions/3.12.1/lib/python3.12/socket.py", line 498, in _real_close
    _ss.close(self)

Because this error happens before the loop sets it's self._running field to 0 this means on the next invocation of the lambda the call to loop.run_until_complete errors with a loop is already running error.

I think the bad file descriptor is caused by some feature of the lambda environment or it could just be some kind of random chance since we have a lot of these running and this happens on very small fraction (<0.01%).

I wrote this patch to catch and ignore the Bad file descriptor error, but don't know if that's the right thing to do in the absence of real test case. If anyone has ideas about how I could produce a test case I am happy to try them out.

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

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

はじめの一歩

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

調査の方向性

まず uvloop/loop.pyx の Loop._pause_signals と Loop.run_until_complete の周辺を読み、次にリンクされている catch-exception-on-pause パッチを調べます。run_until_complete の繰り返し呼び出しを含めて bad-file-descriptor の経路を再現し、回帰テストを追加します。完了条件は、失敗後にループが実行中としてマークされたままにならないことです。

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

評価

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

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

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