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:
@@ -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`).
|
||||
|
||||
Reference in New Issue
Block a user