python / python/cpython

`test_profiling` sometimes times out under TSan

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

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

tests topic-profiling type-bug
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

We don't currently run test_profiling in the TSan CI, but the context is that I'm trying to get the entire test suite running under thread sanitizer (TSan).

Some of the tests in test_profiling fail to attach in time when run with thread sanitizer, because the sanitizer makes everything slower. This is especially the case when running tests in parallel with -j.

Here's a example:

ERROR: test_run_failed_script_live (test.test_profiling.test_sampling_profiler.test_live_collector_ui.TestLiveModeErrors.test_run_failed_script_live)
Test that running a failing script exits with clean error.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 279, in _run_with_sync
    _wait_for_ready_signal(sync_sock, process, _SYNC_TIMEOUT_SEC)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 223, in _wait_for_ready_signal
    raise socket.timeout("timed out")
TimeoutError: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 1110, in _handle_live_run
    process = _run_with_sync(cmd, suppress_output=True)
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 289, in _run_with_sync
    raise RuntimeError(
        "Process failed to signal readiness within timeout"
    )
RuntimeError: Process failed to signal readiness within timeout

I think the problem is that the the _SYNC_TIMEOUT_SEC of 5 seconds isn't enough in this case:

https://github.com/python/cpython/blob/4f9a8d075ee52b8f56aca14102c8bf9fd6f3c512/Lib/profiling/sampling/cli.py#L78

Here are some options to consider:

  1. Make _SYNC_TIMEOUT_SEC configurable via a command line option and specify a larger value for the tests (i.e., SHORT_TIMEOUT)
  2. Make _SYNC_TIMEOUT_SEC configurable via environment variable
  3. Skip these tests under TSan
  4. ???

cc @pablogsal

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

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

はじめの一歩

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

調査の方向性

Lib/profiling/sampling/cli.py の _SYNC_TIMEOUT_SEC と _wait_for_ready_signal から始め、失敗している test_profiling のケース test_run_failed_script_live を調べます。-j による並列実行を含め、TSan 下で profiling テストを実行し、sanitizer 固有の動作に関する既存のテスト規約と比較します。影響を受けるテストが通常のテストカバレッジを弱めることなく、TSan 下で確実に完了すれば完了です。

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

評価

技術スタック
python
領域
performance, testing
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

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

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