From 2e435af4dec1f3aea3516292468d1b4174b69c2f Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 2 Nov 2022 10:27:31 +0000 Subject: [PATCH] ftp: retry 426 errors Before this change we didn't retry 426 errors which are 426 Connection closed; transfer aborted. Or in this particular case 426 Failure writing network stream. These seem like they might be temporary so retry them. See: https://forum.rclone.org/t/downloads-fail-from-remote-server-error-426-failure-writing-network-stream/33839/ --- backend/ftp/ftp.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/backend/ftp/ftp.go b/backend/ftp/ftp.go index fad583c1c..6ebafb344 100644 --- a/backend/ftp/ftp.go +++ b/backend/ftp/ftp.go @@ -315,18 +315,26 @@ func (dl *debugLog) Write(p []byte) (n int, err error) { return len(p), nil } +// returns true if this FTP error should be retried +func isRetriableFtpError(err error) bool { + switch errX := err.(type) { + case *textproto.Error: + switch errX.Code { + case ftp.StatusNotAvailable, ftp.StatusTransfertAborted: + return true + } + } + return false +} + // shouldRetry returns a boolean as to whether this err deserve to be // retried. It returns the err as a convenience func shouldRetry(ctx context.Context, err error) (bool, error) { if fserrors.ContextError(ctx, &err) { return false, err } - switch errX := err.(type) { - case *textproto.Error: - switch errX.Code { - case ftp.StatusNotAvailable: - return true, err - } + if isRetriableFtpError(err) { + return true, err } return fserrors.ShouldRetry(err), err }