From a887f2602398ada86dcdc8b646e0103e42df9bb1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 18 Dec 2025 16:45:31 +0200 Subject: [PATCH] gotd: retry non-fatal errors in getDifference calls --- pkg/gotd/telegram/updates/state.go | 32 +++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/pkg/gotd/telegram/updates/state.go b/pkg/gotd/telegram/updates/state.go index 91d6f348..d1437b12 100644 --- a/pkg/gotd/telegram/updates/state.go +++ b/pkg/gotd/telegram/updates/state.go @@ -489,11 +489,33 @@ func (s *internalState) getDifference(ctx context.Context) error { s.date = state.Date } - diff, err := s.client.UpdatesGetDifference(ctx, &tg.UpdatesGetDifferenceRequest{ - Pts: s.pts.State(), - Qts: s.qts.State(), - Date: s.date, - }) + var diff tg.UpdatesDifferenceClass + var err error + for { + diff, err = s.client.UpdatesGetDifference(ctx, &tg.UpdatesGetDifferenceRequest{ + Pts: s.pts.State(), + Qts: s.qts.State(), + Date: s.date, + }) + if isFatalError(err) { + return err + } else if err != nil { + dur, ok := tgerr.AsFloodWait(err) + if ok { + s.log.Warn("Flood wait error while getting difference", zap.Duration("wait", dur)) + } else { + s.log.Error("Failed to get difference, retrying in 5 seconds...", zap.Error(err)) + dur = 5 * time.Second + } + select { + case <-time.After(dur): + case <-ctx.Done(): + return fmt.Errorf("context canceled while waiting to retry: %w", ctx.Err()) + } + } else { + break + } + } if err != nil { return errors.Wrap(err, "get difference") }