fix(msk-collector): ретрай заливки батча на обрыве ssh #3435

Merged
lekss361 merged 1 commit from fix/msk-collector-ssh-retry into main 2026-09-09 07:25:17 +00:00
Owner

Summary

Пятая находка живого прогона (#2989, трек 1). Прогон идёт часами, и ssh рвётся:

RuntimeError: psql через ssh вернул 255:
Read from remote host 46.173.16.127: Connection reset by peer
client_loop: send disconnect: Connection reset by peer

Обрыв пришёлся ровно на заливку батча — умирал весь прогон, несброшенный батч (до 1000 карточек) терялся, --resume перечитывал те же страницы заново.

Ретрай здесь безопасен, потому что SQL идемпотентен целиком: батч вставляется через ON CONFLICT (batch_id) DO NOTHING, карточки — через ON CONFLICT (source_id, batch_id, kind) DO NOTHING. Повтор не может задвоить данные.

Ретраится только транспорт (ssh код 255), 4 попытки с нарастающей паузой 15/30/45 с. Ошибка самого psql под ON_ERROR_STOP=1 (любой другой код возврата) поднимается сразу — это дефект данных или SQL, повтор его не лечит и только замаскировал бы причину.

Test plan

  • Симптом пойман живым прогоном, код возврата и текст — из лога, не предположение
  • Идемпотентность заливки проверена по фактическому SQL: оба ON CONFLICT ... DO NOTHING на месте
  • --help работает
  • Прогон возобновлён с --resume, план и прогресс коридоров целы
  • Срабатывание ретрая на живом обрыве — сторож лога ловит строку ssh оборвался

Тесты не пишутся до подтверждения поведения полным проходом.

Часть эпика #2989.

## Summary Пятая находка живого прогона (#2989, трек 1). Прогон идёт часами, и ssh рвётся: ``` RuntimeError: psql через ssh вернул 255: Read from remote host 46.173.16.127: Connection reset by peer client_loop: send disconnect: Connection reset by peer ``` Обрыв пришёлся ровно на заливку батча — умирал весь прогон, несброшенный батч (до 1000 карточек) терялся, `--resume` перечитывал те же страницы заново. Ретрай здесь безопасен, потому что SQL идемпотентен целиком: батч вставляется через `ON CONFLICT (batch_id) DO NOTHING`, карточки — через `ON CONFLICT (source_id, batch_id, kind) DO NOTHING`. Повтор не может задвоить данные. **Ретраится только транспорт** (ssh код 255), 4 попытки с нарастающей паузой 15/30/45 с. Ошибка самого `psql` под `ON_ERROR_STOP=1` (любой другой код возврата) поднимается сразу — это дефект данных или SQL, повтор его не лечит и только замаскировал бы причину. ## Test plan - [x] Симптом пойман живым прогоном, код возврата и текст — из лога, не предположение - [x] Идемпотентность заливки проверена по фактическому SQL: оба `ON CONFLICT ... DO NOTHING` на месте - [x] `--help` работает - [x] Прогон возобновлён с `--resume`, план и прогресс коридоров целы - [ ] Срабатывание ретрая на живом обрыве — сторож лога ловит строку `ssh оборвался` Тесты не пишутся до подтверждения поведения полным проходом. Часть эпика #2989.
lekss361 added 1 commit 2026-09-09 07:14:02 +00:00
fix(msk-collector): ретрай заливки батча на обрыве ssh
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
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
ae70e7a39b
Прогон длится часами, и ssh рвётся: живьём поймано Connection reset by peer
(ssh 255) прямо посреди заливки — умирал весь прогон, несброшенный батч
(до 1000 карточек) терялся, resume перечитывал страницы заново.

Ретрай безопасен: SQL идемпотентен целиком — batch через ON CONFLICT DO
NOTHING, карточки через ON CONFLICT (source_id,batch_id,kind) DO NOTHING.
Ретраится ТОЛЬКО транспорт (код 255); ошибка самого psql под ON_ERROR_STOP
поднимается сразу — это дефект данных или SQL, повтор его не лечит.
lekss361 merged commit e5f31d4dc7 into main 2026-09-09 07:25:17 +00:00
lekss361 deleted branch fix/msk-collector-ssh-retry 2026-09-09 07:25:18 +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#3435
No description provided.