avito_city_sweep: чекпоинт мёртв по построению — 0 из 67 прогонов за 60 дней записали done_buckets, плюс две дыры честности #3319

Closed
opened 2026-09-02 06:56:01 +00:00 by bot-backend · 0 comments
Collaborator

Армейский аудит 01-02.09, линза kit-core; все три пункта подтверждены скептиками по коду и проду.

1. Чекпоинт не пишется ВООБЩЕ (high)

Прод: 0 из 67 прогонов за 60 дней записали done_buckets; после мержа #3074 (05869517, 26.08) — тоже 0. resume_reason живьём 31.08–02.09: только status_done/no_checkpoint, ни одного резюма.

Механика: pipeline.py:1780-1807 — done-ветка #1950 завершает прогон до единственной точки записи чекпоинта (:1822); а 'done' отсутствует в _RESUME_STATUSES (scheduler.py:570). Итог: якоря 2-5 Екатеринбурга не собираются никогда — ровно тот сценарий, ради которого чекпоинт и вводили.

2. Таймаут-якорь попадает в чекпоинт как пройденный (medium)

pipeline.py:1751-1764: except TimeoutError не сбрасывает _anchor_ok (generic except :1811 — сбрасывает). Якорь, умерший по таймауту, кладётся в done_buckets (:1820) → при резюме пропускается навсегда, молча. Инвариант-комментарий #3074 рядом обещает обратное.

3. SIGTERM-drain финализирует частичный прогон как done (low)

pipeline.py:1292-1306, 1836-1845: drain → mark_done с частичными counters. done неотличим от полного обхода и исключён из резюма — недоделанное объявляется готовым.

Смежное (low, тот же файл семейства)

domclick_detail_backfill.py:444/473-482: обрыв «пул пуст» бросает попытку неучтённой — attempted ≠ enriched+failed+blocked (прод: 5 прогонов с diff=1).

Приёмка

  • Прогон с ≥1 завершённым якорем оставляет done_buckets в counters (прод-SELECT, не тест)
  • Таймаут-якорь НЕ попадает в done_buckets (тест по значению)
  • Drain-финализация отличима от полного done (статус/counters-флаг) и участвует в резюме
  • Тождество счётчиков attempted = enriched+failed+blocked+прочие на всех выходах

Refs #3074, #3315 (пере-пробинг exhaustive — другой файл того же класса), #3288.

Армейский аудит 01-02.09, линза kit-core; все три пункта подтверждены скептиками по коду и проду. ## 1. Чекпоинт не пишется ВООБЩЕ (high) Прод: **0 из 67 прогонов за 60 дней** записали `done_buckets`; после мержа #3074 (05869517, 26.08) — тоже 0. `resume_reason` живьём 31.08–02.09: только `status_done`/`no_checkpoint`, ни одного резюма. Механика: `pipeline.py:1780-1807` — done-ветка #1950 завершает прогон **до** единственной точки записи чекпоинта (`:1822`); а `'done'` отсутствует в `_RESUME_STATUSES` (`scheduler.py:570`). Итог: якоря 2-5 Екатеринбурга не собираются никогда — ровно тот сценарий, ради которого чекпоинт и вводили. ## 2. Таймаут-якорь попадает в чекпоинт как пройденный (medium) `pipeline.py:1751-1764`: `except TimeoutError` **не сбрасывает** `_anchor_ok` (generic except `:1811` — сбрасывает). Якорь, умерший по таймауту, кладётся в `done_buckets` (`:1820`) → при резюме пропускается **навсегда**, молча. Инвариант-комментарий #3074 рядом обещает обратное. ## 3. SIGTERM-drain финализирует частичный прогон как `done` (low) `pipeline.py:1292-1306, 1836-1845`: drain → `mark_done` с частичными counters. `done` неотличим от полного обхода и исключён из резюма — недоделанное объявляется готовым. ## Смежное (low, тот же файл семейства) `domclick_detail_backfill.py:444/473-482`: обрыв «пул пуст» бросает попытку неучтённой — `attempted ≠ enriched+failed+blocked` (прод: 5 прогонов с diff=1). ## Приёмка - [ ] Прогон с ≥1 завершённым якорем оставляет done_buckets в counters (прод-SELECT, не тест) - [ ] Таймаут-якорь НЕ попадает в done_buckets (тест по значению) - [ ] Drain-финализация отличима от полного done (статус/counters-флаг) и участвует в резюме - [ ] Тождество счётчиков attempted = enriched+failed+blocked+прочие на всех выходах Refs #3074, #3315 (пере-пробинг exhaustive — другой файл того же класса), #3288.
Sign in to join this conversation.
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#3319
No description provided.