fix(tradein/backfill): save-False у yandex/avito больше не теряет попытку — attempted == сумма исходов у всех трёх бэкфиллов #3347

Merged
bot-backend merged 2 commits from fix/3338-backfill-save-false into main 2026-09-05 18:14:08 +00:00
Collaborator

Closes #3338 (находка ревью PR #3335). Тот же дефект, что был у domclick: if save(...): enriched += 1 без else — UPDATE, не задевший строку, оставлял попытку без исхода.

Полный разбор точек выхода (обе таблицы в отчёте воркера)

  • yandex (yandex_detail_backfill.py, цикл 338): единственная дыра — save-False (459) → failed += 1 + warning «UPDATE не нашёл строку id=…». Тождество attempted == enriched + failed (blocked ⊆ failed по #3196 — не двойное начисление).
  • avito (avito_detail_backfill.py, цикл 562): единственная дыра — save-False (685) → то же. Тождество attempted == enriched + blocked + gone + failed.
  • Обрыва «пул пуст» у обоих нет — ProxyPoolExhaustedError бросается ДО цикла, вторая дыра #3332 неприменима.

Намеренно: у avito после save-False по-прежнему breaker.record_success() — фетч прошёл, тракт цел (зеркалит domclick); иначе ненайденные строки гнали бы прогон в ложный banned.

Тесты

Новый test_3338_backfill_counter_identity.py + кейс из ревью #3335 в test_3332 (транспортный сбой → пустой пул = attempted 2 / failed 2, не 3). Прогон: 460 passed, 4 skipped (-k backfill/counter/3332/3338). Фальсификация (git apply -R только исходников): оба тождества красные по значению — attempted=2, сумма исходов=0 … потеряно 2.

Прод-приёмка

Новые прогоны yandex/avito detail_backfill: attempted − сумма исходов = 0.

Closes #3338 (находка ревью PR #3335). Тот же дефект, что был у domclick: `if save(...): enriched += 1` без else — UPDATE, не задевший строку, оставлял попытку без исхода. ## Полный разбор точек выхода (обе таблицы в отчёте воркера) - **yandex** (`yandex_detail_backfill.py`, цикл 338): единственная дыра — save-False (459) → `failed += 1` + warning «UPDATE не нашёл строку id=…». Тождество `attempted == enriched + failed` (blocked ⊆ failed по #3196 — не двойное начисление). - **avito** (`avito_detail_backfill.py`, цикл 562): единственная дыра — save-False (685) → то же. Тождество `attempted == enriched + blocked + gone + failed`. - Обрыва «пул пуст» у обоих нет — `ProxyPoolExhaustedError` бросается ДО цикла, вторая дыра #3332 неприменима. Намеренно: у avito после save-False по-прежнему `breaker.record_success()` — фетч прошёл, тракт цел (зеркалит domclick); иначе ненайденные строки гнали бы прогон в ложный `banned`. ## Тесты Новый `test_3338_backfill_counter_identity.py` + кейс из ревью #3335 в `test_3332` (транспортный сбой → пустой пул = attempted 2 / failed 2, не 3). Прогон: `460 passed, 4 skipped` (-k backfill/counter/3332/3338). Фальсификация (`git apply -R` только исходников): оба тождества красные по значению — `attempted=2, сумма исходов=0 … потеряно 2`. ## Прод-приёмка Новые прогоны yandex/avito detail_backfill: `attempted − сумма исходов = 0`.
bot-backend added 1 commit 2026-09-05 17:49:38 +00:00
fix(tradein/backfill): save-False у yandex/avito больше не теряет попытку — attempted == сумма исходов
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 12s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m41s
3658434c03
Тот же дефект, что #3332 у domclick (#3335), у обоих соседей: `if save(...):
enriched += 1` без else. UPDATE, не задевший строку (объявление удалено между
снимком и записью), оставлял попытку без исхода — attempted переставал сходиться
с суммой исходов, и расхождение читается как потерянный отказ площадки.

Разбор ВСЕХ точек выхода из цикла попыток показал, что у соседей это
единственная дыра: обрыва «пул прокси пуст» у них нет (resolve_proxy_url
бросает ProxyPoolExhaustedError ДО цикла), а budget/SIGTERM-брейки стоят до
`attempted += 1`. Исход — failed с отдельным warning про ненайденную строку.

Формы тождества разные и это не описка: у yandex blocked ⊆ failed (#3196),
у avito blocked/gone/failed — непересекающиеся корзины.

Тесты — по значению (числа, не «не бросило»), плюс контроль на противоположную
ошибку (исход не начисляется дважды). В test_3332 добавлен запрошенный ревью
кейс: транспортный сбой → пустой пул даёт attempted=2 failed=2, а не 3.

Closes #3338
Light1YT added 1 commit 2026-09-05 18:06:34 +00:00
fix(tradein/backfill): warning save-False называет оба id (avito) и не дублирует listing_id (yandex)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 15s
CI / changes (pull_request) Successful in 17s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 6m13s
659543f004
Ревью #3347, два minor.

1. avito: WHERE в save_detail_enrichment ключуется по source_id из РАЗОБРАННОГО
   HTML (enrichment.item_id), а warning печатал row["id"] из снимка. При
   редиректе/подмене карточки строка с row-id жива, и читатель лога идёт искать
   несуществующую проблему не у той строки («текст ошибки называет гонца»).
   Печатаем оба: listing_id=%s item_id=%s.
2. yandex: listing_id стоял в строке дважды (в начале и как «id=%d» в хвосте) —
   убран дубль.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bot-backend merged commit 65155e5ccd into main 2026-09-05 18:14:08 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#3347
No description provided.