From eaa848f5695fbd1b7ec8629986453d83d3f26a83 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Fri, 15 May 2026 12:32:09 -0600 Subject: [PATCH] internxt: handle file size limit errors during uploads --- backend/internxt/internxt.go | 28 ++++++++++++++++++++++++++++ backend/internxt/upload.go | 3 +++ 2 files changed, 31 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index af317999f6e3f..bc08d86a82424 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -1008,6 +1008,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op o.restoreBackupFile(ctx, backupUUID, origName, origType) return fs.ErrorCantUploadEmptyFiles } + if tooLarge := fileTooLargeError(uploadErr); tooLarge != nil { + o.restoreBackupFile(ctx, backupUUID, origName, origType) + return o.f.tooLargeError(remote, tooLarge) + } o.restoreBackupFile(ctx, backupUUID, origName, origType) return uploadErr } @@ -1033,6 +1037,11 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op return fs.ErrorCantUploadEmptyFiles } + if tooLarge := fileTooLargeError(err); tooLarge != nil { + o.restoreBackupFile(ctx, backupUUID, origName, origType) + return o.f.tooLargeError(remote, tooLarge) + } + if err != nil { meta, err = o.recoverFromTimeoutConflict(ctx, err, remote, dirID) } @@ -1105,6 +1114,25 @@ func isEmptyFileLimitError(err error) bool { strings.Contains(errMsg, "you can not have empty files") } +// fileTooLargeError extracts the SDK's FileTooLargeError from a wrapped error +// chain, returning it (or nil) so callers can branch on the size limit. +func fileTooLargeError(err error) *sdkerrors.FileTooLargeError { + var tooLarge *sdkerrors.FileTooLargeError + if errors.As(err, &tooLarge) { + return tooLarge + } + return nil +} + +// tooLargeError formats a per-file, non-retryable error for the sync engine. +// fserrors.NoRetryError signals "skip this file but continue the sync." +func (f *Fs) tooLargeError(remote string, tooLarge *sdkerrors.FileTooLargeError) error { + return fserrors.NoRetryError(fmt.Errorf("%s: file size %s exceeds account upload limit of %s", + remote, + fs.SizeSuffix(tooLarge.Size), + fs.SizeSuffix(tooLarge.MaxSize))) +} + // recoverFromTimeoutConflict attempts to recover from a timeout or conflict error func (o *Object) recoverFromTimeoutConflict(ctx context.Context, uploadErr error, remote, dirID string) (*buckets.CreateMetaResponse, error) { if !isTimeoutError(uploadErr) && !isConflictError(uploadErr) { diff --git a/backend/internxt/upload.go b/backend/internxt/upload.go index d105ba019139b..4d1665b3e32e1 100644 --- a/backend/internxt/upload.go +++ b/backend/internxt/upload.go @@ -114,6 +114,9 @@ func (f *Fs) OpenChunkWriter(ctx context.Context, remote string, src fs.ObjectIn return f.shouldRetry(ctx, err) }) if err != nil { + if tooLarge := fileTooLargeError(err); tooLarge != nil { + return info, nil, f.tooLargeError(remote, tooLarge) + } return info, nil, fmt.Errorf("failed to create upload session: %w", err) }