fix(tradein-browser): in-page fetch retry + settle tuning for /fetch-json (#1917) #1938

Merged
bot-backend merged 1 commit from fix/1917-fetch-json-network-retry into main 2026-06-27 00:31:20 +00:00
Collaborator

Что

Первый XHR после goto(origin) в /fetch-json иногда падал с NetworkError when attempting to fetch resource (сетевой стек/anti-bot страницы ещё не готов). Лечился только внешним retry с полной ре-навигацией (~30-45с/дом в house_imv_backfill, #562). Это перф-фикс (корректность уже была).

Как (efficient: in-page retry вместо outer re-navigation)

_fetch_json_once:

  • settle FETCH_JSON_SETTLE_MS (default 1200, было хардкод 500) — меньше first-fails;
  • in-page retry самого fetch(): JS-цикл повторяет ТОЛЬКО при сетевом throw (TypeError/NetworkError), НЕ при HTTP-статусе (4xx/5xx — это успешный resp, short-circuit, решает caller). Повтор внутри страницы ≈ FETCH_JSON_RETRY_DELAY_MS (800мс) против ~30-45с полной ре-навигации. Последняя ошибка ре-throw'ится → outer crash-retry контракт цел.
  • Env-кнобы: FETCH_JSON_SETTLE_MS / FETCH_JSON_INPAGE_RETRIES (default 1) / FETCH_JSON_RETRY_DELAY_MS (default 800).

/fetch (SERP, BROWSER_WAIT_MS=6000) — НЕ тронут.

Безопасность / совместимость

  • Handler проецирует {status, body} явно (server.py:642) → новый внутренний attempts НЕ утекает клиентам; browser_fetcher._post_fetch_json валидирует только наличие status/body. Нулевой риск схемы.
  • Outer crash-retry (_do_fetch_json relaunch) и 500-путь без регресса (in-page retry вложен в одну _fetch_json_once попытку).

Проверки

  • Browser-тесты: 11 passed (9 + 2 новых: settle uses configured ms; retry params passed to evaluate).
  • code-reviewer: APPROVE, 0 critical (retry-семантика network-only / caller-compat / crash-retry / /fetch-isolation — все трассированы корректными).

Прим.: browser-sidecar тесты не гоняются в tradein-CI (отдельный camoufox/aiohttp env) — прогнал локально в ephemeral uv-env. Эмпирическую проверку (403 → attempts:1, без retry) можно сделать на проде после деплоя.

Refs #1917, #562

## Что Первый XHR после `goto(origin)` в `/fetch-json` иногда падал с `NetworkError when attempting to fetch resource` (сетевой стек/anti-bot страницы ещё не готов). Лечился только внешним retry с полной ре-навигацией (~30-45с/дом в `house_imv_backfill`, #562). Это перф-фикс (корректность уже была). ## Как (efficient: in-page retry вместо outer re-navigation) `_fetch_json_once`: - **settle** `FETCH_JSON_SETTLE_MS` (default **1200**, было хардкод 500) — меньше first-fails; - **in-page retry** самого `fetch()`: JS-цикл повторяет ТОЛЬКО при сетевом throw (TypeError/NetworkError), НЕ при HTTP-статусе (4xx/5xx — это успешный resp, short-circuit, решает caller). Повтор внутри страницы ≈ `FETCH_JSON_RETRY_DELAY_MS` (800мс) против ~30-45с полной ре-навигации. Последняя ошибка ре-throw'ится → outer crash-retry контракт цел. - Env-кнобы: `FETCH_JSON_SETTLE_MS` / `FETCH_JSON_INPAGE_RETRIES` (default 1) / `FETCH_JSON_RETRY_DELAY_MS` (default 800). `/fetch` (SERP, `BROWSER_WAIT_MS=6000`) — НЕ тронут. ## Безопасность / совместимость - Handler проецирует `{status, body}` явно (`server.py:642`) → новый внутренний `attempts` НЕ утекает клиентам; `browser_fetcher._post_fetch_json` валидирует только наличие `status`/`body`. Нулевой риск схемы. - Outer crash-retry (`_do_fetch_json` relaunch) и 500-путь без регресса (in-page retry вложен в одну `_fetch_json_once` попытку). ## Проверки - Browser-тесты: **11 passed** (9 + 2 новых: settle uses configured ms; retry params passed to evaluate). - `code-reviewer`: **✅ APPROVE**, 0 critical (retry-семантика network-only / caller-compat / crash-retry / /fetch-isolation — все трассированы корректными). > Прим.: browser-sidecar тесты не гоняются в tradein-CI (отдельный camoufox/aiohttp env) — прогнал локально в ephemeral uv-env. Эмпирическую проверку (403 → `attempts:1`, без retry) можно сделать на проде после деплоя. Refs #1917, #562
bot-backend added 1 commit 2026-06-27 00:30:41 +00:00
fix(tradein-browser): in-page fetch retry + configurable settle for /fetch-json (#1917)
All checks were successful
CI / changes (pull_request) Successful in 6s
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
2687f75b92
First XHR after goto(origin) intermittently hit "NetworkError when
attempting to fetch resource" (page net stack/anti-bot not ready),
healed only by the outer re-navigation retry (~30-45s/house in the
house_imv_backfill, #562).

_fetch_json_once now:
- settles FETCH_JSON_SETTLE_MS (default 1200, was hardcoded 500) — fewer
  first-fails;
- wraps the in-page fetch() in a JS retry loop (FETCH_JSON_INPAGE_RETRIES
  default 1, FETCH_JSON_RETRY_DELAY_MS default 800) that retries ONLY on
  network throw, never on HTTP status (4xx/5xx short-circuit, caller
  decides). An in-page retry costs ~retryDelayMs vs the ~30-45s outer
  re-navigation. Last error re-thrown — outer crash-retry contract intact.

/fetch (SERP) path untouched. +2 tests (settle ms, retry params).

Refs #1917, #562
bot-backend merged commit 5968d78049 into main 2026-06-27 00:31:20 +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#1938
No description provided.