fix(workers): count lots_pf failure correctly, no silent done (#1220) #1267

Merged
bot-backend merged 1 commit from fix/scrape-objective-lots-pf-failure-count into main 2026-06-13 07:34:58 +00:00
Collaborator

Summary

Closes #1220 (P2 silent-failure, prod). scrape_objective помечал run status='done' при полностью провалившемся главном lots_pf-стриме (~600МБ отчёт «Лоты»). Последний P2 из армии Fable 5 ревью.

Bug

scrape_objective.sync_objective_group lots_pf-ветка:

n_requests += 1            # ❌ ДО HTTP
reports_ok += 1            # ❌ ДО HTTP
try:
    with client.stream_report(...) as ...:
        ...
except Exception:           # ❌ глотает без reports_failed += 1
    rollback + logger.warning

ObjectiveAuthError/ObjectiveAPIError — подклассы RuntimeError ⊂ Exception → ловятся внутренним generic-except. Внешний except (ObjectiveAuthError, ObjectiveAPIError) для lots_pf недостижим. Итог: _finish_run(status='done' if reports_failed==0) помечает run УСПЕШНЫМ при провале основного отчёта. objective_lots/history stale молча, админка last_run_at врёт, downstream supply-layers L2 видит 'done' с rows_lots=0.

corp_sum-ветка делает правильно (counter после HTTP) — взят как образец.

Fix

  • n_requests/reports_ok перенесены ИЗ pre-HTTP в after-success (после успешного commit'а внутри with stream_report(...)).
  • В except Exception lots_pf-ветке добавлен n_requests += 1 + reports_failed += 1 + logger.exception с traceback.
  • Graceful (no re-raise) сохранён — sibling jobs продолжают, но статус run теперь честный.
  • corp_sum ветка не тронута, _finish_run сигнатура не меняется.

Test plan

  • 5 новых регрессионных тестов: success keeps reports_ok=1, auth-error / api-error / generic Exception в lots_pf инкрементируют reports_failed (не ok), _finish_run status='failed' при reports_failed>0.
  • pytest tests/workers/tasks/test_scrape_objective.py5 passed.
  • pytest -k scrape_objective → 5 passed, 1 skipped.
  • ruff check → clean.

Closes #1220

## Summary Closes #1220 (P2 silent-failure, prod). `scrape_objective` помечал run `status='done'` при полностью провалившемся главном lots_pf-стриме (~600МБ отчёт «Лоты»). **Последний P2** из армии Fable 5 ревью. ## Bug `scrape_objective.sync_objective_group` lots_pf-ветка: ```python n_requests += 1 # ❌ ДО HTTP reports_ok += 1 # ❌ ДО HTTP try: with client.stream_report(...) as ...: ... except Exception: # ❌ глотает без reports_failed += 1 rollback + logger.warning ``` `ObjectiveAuthError`/`ObjectiveAPIError` — подклассы `RuntimeError ⊂ Exception` → ловятся внутренним generic-except. Внешний `except (ObjectiveAuthError, ObjectiveAPIError)` для lots_pf **недостижим**. Итог: `_finish_run(status='done' if reports_failed==0)` помечает run УСПЕШНЫМ при провале основного отчёта. `objective_lots/history` stale молча, админка `last_run_at` врёт, downstream supply-layers L2 видит 'done' с rows_lots=0. corp_sum-ветка делает правильно (counter после HTTP) — взят как образец. ## Fix - `n_requests/reports_ok` перенесены ИЗ pre-HTTP в **after-success** (после успешного commit'а внутри `with stream_report(...)`). - В `except Exception` lots_pf-ветке добавлен `n_requests += 1` + `reports_failed += 1` + `logger.exception` с traceback. - Graceful (no re-raise) сохранён — sibling jobs продолжают, но статус run теперь честный. - corp_sum ветка не тронута, _finish_run сигнатура не меняется. ## Test plan - [x] **5 новых регрессионных тестов**: success keeps `reports_ok=1`, auth-error / api-error / generic Exception в lots_pf инкрементируют `reports_failed` (не `ok`), `_finish_run` `status='failed'` при `reports_failed>0`. - [x] `pytest tests/workers/tasks/test_scrape_objective.py` → **5 passed**. - [x] `pytest -k scrape_objective` → 5 passed, 1 skipped. - [x] `ruff check` → clean. Closes #1220
bot-backend added 1 commit 2026-06-13 06:24:19 +00:00
fix(workers): count lots_pf failure correctly, no silent 'done' (#1220)
All checks were successful
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 11s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m28s
CI / backend-tests (pull_request) Successful in 6m27s
2b4f8364a6
scrape_objective.sync_objective_group инкрементировал n_requests и reports_ok
ДО HTTP-стрима client.stream_report(...). Любая ошибка стрима (ObjectiveAuthError,
ObjectiveAPIError — оба ⊂ RuntimeError ⊂ Exception, ijson-сбой, обрыв сети)
проглатывалась generic except Exception в lots_pf-ветке без инкремента
reports_failed и без re-raise. Внешний except (ObjectiveAuthError|APIError)
был НЕДОСТИЖИМ для lots_pf. _finish_run(status='done' if reports_failed==0)
помечал run УСПЕШНЫМ при полностью провалившемся главном 600МБ отчёте «Лоты».
objective_lots/history оставались stale молча, админка показывала last_run_at,
downstream supply-layers L2 видел 'done', rows_lots=0.

Patch (зеркалит corp_sum — там паттерн уже правильный):
- n_requests/reports_ok перенесены ИЗ pre-HTTP в after-success (после
  успешного commit'а внутри `with stream_report(...)`).
- В except Exception lots_pf-ветке: n_requests += 1 + reports_failed += 1
  + logger.exception (с traceback). Graceful (no re-raise) сохранён —
  sibling jobs продолжают, но статус run теперь честный.
- corp_sum ветка не тронута. _finish_run сигнатура не меняется.

5 новых регрессионных тестов: success keeps reports_ok=1, auth-error /
api-error / generic Exception в lots_pf инкрементируют reports_failed (не
ok), _finish_run status='failed' при reports_failed>0. ruff clean.

Closes #1220
bot-backend merged commit 06c4bb9fd6 into main 2026-06-13 07:34:58 +00:00
bot-backend deleted branch fix/scrape-objective-lots-pf-failure-count 2026-06-13 07:34:58 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1267
No description provided.