Per-mutant timeout budget is parallelism-blind — full-core runs convert contention into spurious timeout verdicts
Maintainer thường phản hồi trong vòng 2 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 38/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Ít trao đổi
- Lĩnh vực
- databases, performance, testing-qa
Hướng nghiên cứu
Bắt đầu với việc tính timeout cho từng mutant được mutmut run sử dụng, bao gồm ngân sách (estimated_time_of_tests + 1) * 15 / * 30 và cách xử lý --max-children. Sau đó kiểm tra hành vi tiếp tục chạy đối với các kết quả đã được lưu trong cache ở mutants/; tái hiện sự khác biệt về điểm số bằng các lần chạy sạch với số lượng tiến trình con khác nhau, và xác định hoàn thành là ngăn các verdict timeout liên quan đến việc chạy song song hoặc xử lý rõ ràng các verdict đã lưu trong cache nhưng không tương thích.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
[boxed/mutmut] Per-mutant timeout budget is parallelism-blind — full-core runs convert contention into spurious ⏰ verdicts
Summary
The per-mutant wall/CPU budget ((estimated_time_of_tests + 1) * 15 / * 30) is computed from a solo-run estimate, but mutmut run defaults to forking one child per core, all hammering the same test database and CPUs. Under that contention each child's covering set runs several times slower than the estimate assumes, so the fixed deadline converts scheduler contention into timeout verdicts.
Measurements (6-core runner, DB-bound Django suite)
- Default parallelism, cold cache: run "finishes" in ~20 min with 616 ⏰ at ~1 s per "timeout" — the verdicts are contention artifacts, not scores.
- Same tree,
mutmut run --max-children 2, cold cache: 708 🎉 / 24 🙁 / 366 ⏰ in ~83 min (~96.7 % of scored mutants killed) — the residual ⏰ being the fixed-budget issue reported separately (missingcall.whenfilter starves the estimate).
So the same code and tests score wildly differently depending only on child count — and nothing warns about it.
Compounding trap: cached ⏰ verdicts replay as final
Resume-from-cache replays previously recorded ⏰ verdicts across config generations: after changing the covering set's cost (or --max-children), a "resumed" run still reports the old timeouts. A meaningful re-score requires a cold mutants/ — worth documenting, or invalidating cached ⏰ (only ⏰) on config change.
Suggested fixes (any of)
- Scale the deadline by the number of concurrent children (estimate × children is a cheap upper bound for a shared-resource suite).
- Re-measure the baseline estimate AT the configured parallelism before scoring.
- Expose the multiplier/constant as config (the ask in closed #492) so operators can compensate explicitly.
- At minimum: document that DB-bound suites need
--max-childrenwell below core count, and that ⏰ verdicts from a differently-parallel run must not be resumed.
Environment
- mutmut 3.x, pytest 8.x, Django + Postgres suite, 6-core Linux runner
- Related: #492 (closed — configurable multiplier), #518 (wrong est-lookup key), and our separate report on the
call.whenrecording bug.
- Ngôn ngữ chính
- Python
- Star
- 1.5k
- Fork
- 185
- Merge trung bình
- 1 ngày 14 giờ
- Pull request đã merge (30 ngày)
- 5
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của boxed/mutmut
-
Removing `not` from a parenthesized multi-line expression drops the parentheses (InvalidGeneratedSyntaxException, 3.8.0)Có thể đã có người làm @jihtsan đã nhận 9 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
boxed/mutmut#602 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
`run` with a `name__mutmut_*` pattern runs the whole test suite in the clean-test checkCó thể đã có người làm @Ishaan400 đã nhận 20 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
boxed/mutmut#592 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Invalid unary plus generated in match statementCó thể đã có người làm @GhostCoder6969 đã nhận 29 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 2 ngày
-
What do the emoji's mean?Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
boxed/mutmut#560 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
boxed/mutmut#529 · 7 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
microsoft/agent-lightning#661 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
area/profiles comp/cli P3 type/feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
NousResearch/hermes-agent#146372 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[BUG] OpenAI-compatible embedding model alias breaks embedder constructionCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[oblt-aw][autodoc] Document obs-aw-automerge contract and fix automerge doc inconsistenciesCó thể đã có người làm @github-actions đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày
-
GeoSeries scale and skew tests fail with pytest 9.2.0Có thể đã có người làm @jiayuasu đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày