From 89b5660a8b0b177a4d8b268b20a8f46e58903502 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 11 Oct 2026 08:37:17 +0300 Subject: [PATCH] =?UTF-8?q?iotpg:=20=D0=BD=D0=B5=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D1=82=D1=8C=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D1=83=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D1=8F=D0=BD=D0=BD=D0=BE=D0=B9=20(poison)=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B5=20flush=20=E2=80=94=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=83=D0=B6=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=80=D0=BE=D1=87=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/storage/iotpg/iot_telemetry_store.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/storage/iotpg/iot_telemetry_store.go b/internal/storage/iotpg/iot_telemetry_store.go index 8f79b9c..e6a88f9 100644 --- a/internal/storage/iotpg/iot_telemetry_store.go +++ b/internal/storage/iotpg/iot_telemetry_store.go @@ -162,18 +162,20 @@ func (s *IoTPostgresStore) flushAll(ctx context.Context) error { for ns, rows := range batches { if err := s.flushTenant(ctx, ns, rows); err != nil { s.log.Error("iotpg: flush batch", "namespace", ns, "rows", len(rows), "err", err) - if firstErr == nil { - firstErr = err - } if isRetryableFlushErr(err) { + if firstErr == nil { + firstErr = err + } // Сеть/PG временно недоступен — возвращаем строки в буфер, повторим. s.mu.Lock() s.batches[ns] = append(s.batches[ns], rows...) s.mu.Unlock() } else { // Постоянная ошибка: валидные строки уже вставлены построчным - // fallback'ом (см. flushTenant), битые отброшены с логом. Повтор - // бессмыслен — в буфер НЕ возвращаем (иначе залипание namespace). + // fallback'ом (см. flushTenant), битые отброшены с логом. Ошибку + // НЕ возвращаем и строки в буфер НЕ возвращаем — данные обработаны, + // иначе consumer увидел бы ошибку и бесконечно гонял poison-батч + // через visibility timeout (ревью 🔴). s.log.Error("iotpg: permanent flush error (валидные строки — построчно, битые отброшены)", "namespace", ns, "rows", len(rows), "err", err) } }