mirror of
https://github.com/rclone/rclone.git
synced 2026-07-13 09:12:31 -04:00
internxt: handle file size limit errors during uploads
This commit is contained in:
committed by
Nick Craig-Wood
parent
0ce75add5a
commit
75429ca647
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -686,6 +686,7 @@ backends:
|
||||
- backend: "internxt"
|
||||
remote: "TestInternxt:"
|
||||
fastlist: false
|
||||
extratime: 2.0
|
||||
listretries: 5
|
||||
ignore:
|
||||
- TestRWFileHandleWriteNoWrite
|
||||
|
||||
Reference in New Issue
Block a user