fix(tests): флейк test_concurrent_cross_process_appends_lose_nothing на Windows, и причина падения скрыта
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 56/100
Research direction
Start with tests/test_missing_queue_sqlite.py, especially the worker process assertion, and run test_concurrent_cross_process_appends_lose_nothing on Windows if possible. Capture the worker's stderr to identify the failure before deciding whether the timeout or transaction handling needs attention in src/stepik_grader/db.py. Done means failures expose a useful cause and concurrent appends still lose no records, without skipping the test.
Written by the indexing model from the issue text.
Description
Найдено на прогоне CI для PR #914 — документного PR, не трогающего ни кода, ни тестов. Эпик #915, риск-группа «сейф-нет и гейты» (#921).
Что произошло
Джоб test (windows-latest, 3.13, false) в run 31475822457:
FAILED tests/test_missing_queue_sqlite.py::test_concurrent_cross_process_appends_lose_nothing
AssertionError: воркер завершился с ненулевым кодом
assert 1 == 0
+ where 1 = wait(timeout=120)
===== 1 failed, 3099 passed, 36 skipped in 413.46s =====
Тот же коммит на Linux и macOS зелёный, локальный прогон теста зелёный, последний прогон main (run 1003) зелёный. То есть это нестабильность, а не регресс.
Два отдельных дефекта
1. Причину падения невозможно узнать. tests/test_missing_queue_sqlite.py:159 проверяет только код возврата:
assert proc.wait(timeout=120) == 0, "воркер завершился с ненулевым кодом"
stdout и stderr воркера не перехватываются и не печатаются. В логе CI есть код 1 и нет ни строчки traceback — диагностировать нечем, приходится гадать. Это чинится независимо от самой нестабильности и делает следующий такой отказ разбираемым.
2. Вероятная причина — BUSY_TIMEOUT_MS = 10000 (src/stepik_grader/db.py:67) при четырёх конкурентных писателях по 15 транзакций каждый. На Windows-раннере файловые операции ощутимо медленнее (весь набор идёт 413 с против ~210 с локально), и sqlite3.OperationalError: database is locked по истечении десяти секунд становится достижим. Гипотеза требует подтверждения — что вернёт пункт 1.
Что сделать
- Перехватывать вывод воркеров (
capture_output=True) и включатьstderrупавшего процесса в текстassert— тогда следующий отказ сразу назовёт причину. - По полученному traceback: либо поднять
busy_timeoutдля этого сценария, либо ретраить транзакцию наSQLITE_BUSY, либо сделать тест устойчивым к медленной ФС, не ослабляя сам acceptance-критерий «ничего не потеряно». - Не заменять
assertнаxfail/skip: проверяемое свойство — межпроцессная сохранность очереди (issue #552, ADR-0011) — реально важно, и отключение теста вернёт исходную проблему невидимой.
Связанные находки аудита
QA-2-01 — инвентарь пропусков слеп к модульному pytestmark; QA-2-02 — guard «набор не скипнулся целиком» считает собранные тесты, а не выполненные. Оба про то же самое: нестабильность и пропуски в наборе сейчас плохо наблюдаемы.
- Dominant language
- Python
- Stars
- 3
- Forks
- 6
- Avg merge
- 2h 41m
- Merged PRs (30d)
- 48
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from ArtVsMark/Stepik-Python-Grader
-
Difficulty 3/5 Half a day Newbie friendliness 35/100
ArtVsMark/Stepik-Python-Grader#1635 ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 18/100
ArtVsMark/Stepik-Python-Grader#1634 ·
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 32/100
ArtVsMark/Stepik-Python-Grader#1633 ·
Maintainers usually reply within 1 day
-
Каталог v1.12.0: Python 3.14 / 3.15 / 3.16 — 3.15 в основной CI, 3.16 в python-next, подъём действийOpen
Difficulty 3/5 1-2 days Newbie friendliness 30/100
ArtVsMark/Stepik-Python-Grader#1632 ·
Maintainers usually reply within 1 day
-
area/glossary bug difficulty/medium
Difficulty 4/5 3-5 days Newbie friendliness 35/100
ArtVsMark/Stepik-Python-Grader#1629 ·
Maintainers usually reply within 1 day
All issues in ArtVsMark/Stepik-Python-Grader
Similar issues
-
area:core-platform effort:S priority:P3 status:in-review type:test
Difficulty 2/5 Under an hour Newbie friendliness 80/100
randomparity/kdive#3246 · 1 comment ·
Maintainers usually reply within 1 day
-
Requantification library converts m/z to mass with the hydrogen-atom mass instead of the proton massOpenbug
Difficulty 1/5 Under an hour Newbie friendliness 85/100
nf-core/metaboigniter#130 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
common-workflow-language/cwl-utils#477 ·
Maintainers usually reply within 1 day
-
Add dependabotOpenfeat
Difficulty 2/5 Under an hour Newbie friendliness 72/100
open-nudge/opentemplate#204 ·
Maintainers usually reply within 1 day
-
github-stale-ci-pr-closer: KV state is double-wrapped, never persists, and hits the depth-32 limitPossibly taken @VascoSch92 claimed this today. Openpriority:medium ready-for-dev
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
OpenHands/extensions#781 ·
Maintainers usually reply within 1 day