From e08ff973f0406e85540f6225e6b0a265831d8e1f Mon Sep 17 00:00:00 2001 From: divyam234 <47589864+divyam234@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:48:26 +0530 Subject: [PATCH] dont recover upload if gin context is cancelled --- utils/recovery/recovery.go | 19 ++++++++++++++++++- utils/retry/retry.go | 10 +++++++--- utils/tgc/tgc.go | 3 +-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/utils/recovery/recovery.go b/utils/recovery/recovery.go index f1939802..6987fb66 100644 --- a/utils/recovery/recovery.go +++ b/utils/recovery/recovery.go @@ -11,6 +11,20 @@ import ( "github.com/gotd/td/tgerr" ) +func hasError(err error, target string) bool { + for err != nil { + if err.Error() == target { + return true + } + if unwrapper, ok := err.(interface{ Unwrap() error }); ok { + err = unwrapper.Unwrap() + } else { + break + } + } + return false +} + type recovery struct { ctx context.Context backoff backoff.BackOff @@ -47,7 +61,10 @@ func (r *recovery) shouldRecover(err error) bool { default: } + //recover only if context is not cancelled and error is not a rpc error + isContextErr := hasError(err, "context canceled") + _, ok := tgerr.As(err) - return !ok + return !isContextErr && !ok } diff --git a/utils/retry/retry.go b/utils/retry/retry.go index 956340ce..981fa3cc 100644 --- a/utils/retry/retry.go +++ b/utils/retry/retry.go @@ -11,6 +11,11 @@ import ( "github.com/gotd/td/tgerr" ) +var internalErrors = []string{ + "Timedout", + "No workers running", +} + type retry struct { max int errors []string @@ -38,8 +43,7 @@ func (r retry) Handle(next tg.Invoker) telegram.InvokeFunc { func New(max int, errors ...string) telegram.Middleware { return retry{ - max: max, - errors: append(errors, - "Timedout"), + max: max, + errors: append(errors, internalErrors...), } } diff --git a/utils/tgc/tgc.go b/utils/tgc/tgc.go index 300663c5..7c0e3e40 100644 --- a/utils/tgc/tgc.go +++ b/utils/tgc/tgc.go @@ -30,10 +30,9 @@ func deviceConfig(appConfig *utils.Config) telegram.DeviceConfig { return config } func NewDefaultMiddlewares(ctx context.Context) ([]telegram.Middleware, error) { - _clock := tdclock.System return []telegram.Middleware{ - recovery.New(ctx, Backoff(_clock)), + recovery.New(ctx, Backoff(tdclock.System)), retry.New(5), floodwait.NewSimpleWaiter(), }, nil