internxt: handle file size limit errors during uploads

This commit is contained in:
jzunigax2
2026-05-15 12:32:09 -06:00
committed by Nick Craig-Wood
parent 0ce75add5a
commit 75429ca647
3 changed files with 32 additions and 0 deletions

View File

@@ -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) {

View File

@@ -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)
}

View File

@@ -686,6 +686,7 @@ backends:
- backend: "internxt"
remote: "TestInternxt:"
fastlist: false
extratime: 2.0
listretries: 5
ignore:
- TestRWFileHandleWriteNoWrite