From cac1f5acded9eeb2c9b0ed0be088c4ea9a452c27 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 29 Dec 2025 23:03:10 +0200 Subject: [PATCH] gotd: retry auth transfers on AUTH_BYTES_INVALID error --- pkg/gotd/telegram/pool.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pkg/gotd/telegram/pool.go b/pkg/gotd/telegram/pool.go index 11b3e611..e7ba3973 100644 --- a/pkg/gotd/telegram/pool.go +++ b/pkg/gotd/telegram/pool.go @@ -2,6 +2,7 @@ package telegram import ( "context" + "time" "github.com/go-faster/errors" "go.uber.org/zap" @@ -12,6 +13,7 @@ import ( "go.mau.fi/mautrix-telegram/pkg/gotd/telegram/dcs" "go.mau.fi/mautrix-telegram/pkg/gotd/telegram/internal/manager" "go.mau.fi/mautrix-telegram/pkg/gotd/tg" + "go.mau.fi/mautrix-telegram/pkg/gotd/tgerr" "go.mau.fi/mautrix-telegram/pkg/gotd/transport" ) @@ -94,7 +96,21 @@ func (c *Client) dc(ctx context.Context, dcID int, max int64, dialer mtproto.Dia return nil, errors.Wrap(err, "create pool") } - _, err = c.transfer(ctx, tg.NewClient(p), dcID) + for i := range 5 { + _, err = c.transfer(ctx, tg.NewClient(p), dcID) + // TODO why does import authorization sometimes throw AUTH_BYTES_INVALID? + // The calls to this should already be locked so it doesn't seem like a race + if err != nil && tgerr.Is(err, tg.ErrAuthBytesInvalid) { + c.log.Warn("Got auth bytes invalid error, retrying DC transfer", zap.Error(err), zap.Int("retry_count", i)) + select { + case <-time.After(time.Duration(i*500) * time.Millisecond): + continue + case <-ctx.Done(): + return nil, ctx.Err() + } + } + break + } if err != nil { // Ignore case then we are not authorized. if auth.IsUnauthorized(err) {