diff --git a/HISTORY/2026-10-07-session-log.md b/HISTORY/2026-10-07-session-log.md index 6bc10ee..8610576 100644 --- a/HISTORY/2026-10-07-session-log.md +++ b/HISTORY/2026-10-07-session-log.md @@ -111,7 +111,23 @@ permanent (нарушение constraint → не вешать namespace, выброс в лог/DLQ). ### Статус -Реализация п.1 (разделение ошибок flush) и п.3 (ббитые → DLQ) — см. ниже. +Реализация п.1 (разделение ошибок flush) и п.3 (битые → DLQ) — см. ниже. + +### Реализовано (п.3) — битые envelope → DLQ (`42f0045`) +- `processor.go`: `processTelemetry` возвращает sentinel `errInvalidEnvelope` + при битом JSON (вместо молчаливого nil, из-за которого мусор подтверждался и + исчезал навсегда). +- `consumer.go`: при `errInvalidEnvelope` тело кладётся в DLQ + (`SQS_DLQ_NAME`, дефолт `iot-telemetry-dlq`) и основное сообщение подтверждается; + без DLQ — только лог (НЕ подтверждаем). Реальные ошибки PG — по-прежнему ретрай. +- `config.go`/`defaults.go`: добавлен `SQSDLQName` + `DefaultSQSDLQName`. + +### Реализовано (п.1) — разделение retryable/permanent ошибок flush (`f1a7266`) +- `iot_telemetry_store.go`: `isRetryableFlushErr` — `'08'` (connection) и + 57P01/02/03 (shutdown/crash) retryable (возврат в буфер); `'22'` (data exception) + и `'23'` (integrity violation) permanent (батч выбрасывается с логом, НЕ в буфер). +- Закрыто замеченное залипание: один «ядовитый» payload больше не зацикливает + flush namespace навсегда. ## Проверки - `go build ./...` и `go vet ./internal/...` — зелёные на каждом шаге.