Data race in list.sort() on no-gil build
オープン
まだ誰も着手していません。
interpreter-core
topic-free-threading
type-bug
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 35.9k
- PR マージ指標
- PR 指標を取得中
説明
Bug report
Bug description:
Summary
As reported in #153852 (TSAN0014), list.sort() writes each slot of the array with a plain, non-atomic store. When another thread concurrently accesses the same list, there is a data race between the in-place sort and the reader, which will be reported by TSAN.
How to reproduce
First we need to enable thread-sanitizer
- ./configure --disable-gil --with-thread-sanitizer
- TSAN_OPTIONS="halt_on_error=1 symbolize=1 history_size=4" ./python repro.py
Then run the following repro.py
import sys, threading
size, rounds, num_threads = 2000, 1500, 32
SCRAMBLED = sorted(range(size), key=lambda x: (x * 2654435761) & 0xFFFFFFFF)
global_list = list(SCRAMBLED)
enter, leave = threading.Barrier(num_threads + 1), threading.Barrier(num_threads + 1)
def reader():
for _ in range(rounds):
enter.wait()
for _x in global_list:
pass
leave.wait()
def main_sorter():
for _ in range(rounds):
global_list[:] = SCRAMBLED
enter.wait()
global_list.sort()
leave.wait()
ts = [threading.Thread(target=reader) for _ in range(num_threads)]
for t in ts:
t.start()
main_sorter()
for t in ts:
t.join()
Finally we could see the log from TSan
WARNING: ThreadSanitizer: data race (pid=3143552)
Write of size 8 at 0xffffb6b3c018 by main thread:
#0 binarysort Objects/listobject.c:1918 (python+0x1c64bc)
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-154572
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、記載された no-GIL および ThreadSanitizer の設定で repro.py を実行し、次に 1918 行目の binarysort 周辺にある Objects/listobject.c を調べます。race レポートを、リンクされている gh-154572 の作業と比較します。再現で ThreadSanitizer の data-race レポートが生成されなくなれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- c, python
- 領域
- operating-systems, testing-qa
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 30/100