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)
|
o.restoreBackupFile(ctx, backupUUID, origName, origType)
|
||||||
return fs.ErrorCantUploadEmptyFiles
|
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)
|
o.restoreBackupFile(ctx, backupUUID, origName, origType)
|
||||||
return uploadErr
|
return uploadErr
|
||||||
}
|
}
|
||||||
@@ -1033,6 +1037,11 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
|
|||||||
return fs.ErrorCantUploadEmptyFiles
|
return fs.ErrorCantUploadEmptyFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tooLarge := fileTooLargeError(err); tooLarge != nil {
|
||||||
|
o.restoreBackupFile(ctx, backupUUID, origName, origType)
|
||||||
|
return o.f.tooLargeError(remote, tooLarge)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
meta, err = o.recoverFromTimeoutConflict(ctx, err, remote, dirID)
|
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")
|
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
|
// 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) {
|
func (o *Object) recoverFromTimeoutConflict(ctx context.Context, uploadErr error, remote, dirID string) (*buckets.CreateMetaResponse, error) {
|
||||||
if !isTimeoutError(uploadErr) && !isConflictError(uploadErr) {
|
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)
|
return f.shouldRetry(ctx, err)
|
||||||
})
|
})
|
||||||
if err != nil {
|
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)
|
return info, nil, fmt.Errorf("failed to create upload session: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -686,6 +686,7 @@ backends:
|
|||||||
- backend: "internxt"
|
- backend: "internxt"
|
||||||
remote: "TestInternxt:"
|
remote: "TestInternxt:"
|
||||||
fastlist: false
|
fastlist: false
|
||||||
|
extratime: 2.0
|
||||||
listretries: 5
|
listretries: 5
|
||||||
ignore:
|
ignore:
|
||||||
- TestRWFileHandleWriteNoWrite
|
- TestRWFileHandleWriteNoWrite
|
||||||
|
|||||||
Reference in New Issue
Block a user