fix(telemetry): не терять строки при ошибке flush (flushAll + InsertTelemetry)

flushAll и InsertTelemetry (путь заполнения батча) вынимали строки из буфера и
подменяли буфер ДО записи: при ошибке flushTenant строки исчезали. Хуже —
фоновый flusher мог забрать строки, которые consumer ждал в Flush, тогда Flush
видел пустой буфер, возвращал nil, и consumer подтверждал SQS-сообщение с
незаписанными данными (потеря). Теперь при ошибке строки возвращаются в буфер
в обоих путях. ctx проброшен в flushAll/flushTenant. Consumer хранит receipt
handle значением (string), не указателем SDK.
This commit is contained in:
2026-10-07 07:32:00 +03:00
parent 38602b7560
commit b6c083e80f
3 changed files with 42 additions and 14 deletions
+13
View File
@@ -61,6 +61,19 @@
не вставляется.
- Легаси `cmd/sqs-consumer`: вызов обновлён (`""`), файл помечен к удалению (P2-14).
### Ревью-фикс P0-7/P0-8 (найдено при перепроверке кода)
- ❗ Была реальная потеря данных: `flushAll` и `InsertTelemetry` (при заполнении
батча) вынимали строки из буфера и **подменяли буфер ДО записи**; при ошибке
`flushTenant` строки исчезали. Хуже — фоновый flusher мог «съесть» строки,
которые consumer ждал в `Flush`, тогда `Flush` вернул бы nil (буфер пуст) и
consumer **подтвердил бы** SQS-сообщение с незаписанными данными.
- Фикс: при ошибке `flushTenant` строки ВОЗВРАЩАЮТСЯ в буфер (в обоих путях) —
данные не теряются, повтор выполняет flusher/Flush. `ctx` проброшен в
`flushAll`/`flushTenant` (раньше `Flush(ctx)` игнорировал ctx).
- Consumer: receipt handle хранится значением (`string`), а не указателем SDK.
- Компромисс: при долгом сбое PG буфер растёт (backpressure) — осознанно, вместо
тихой потери телеметрии.
## Осталось (не сделано)
- P0-3 часть 1 (хэш паролей + EMQX), P1-11/P1-12 (тесты/CI), P2-14
(вычистить легаси `internal/api/`, `cmd/sqs-consumer`).