From de0162ea76e7201ead3bd8ddbccd8193ee4b8804 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 21 Aug 2022 11:14:53 +0200 Subject: [PATCH] backend/retry: Overwrite failed uploads instead of deleting them For backends which are able to atomically replace files, we just can overwrite the old copy, if it is necessary to retry an upload. This has the benefit of issuing one operation less and might be beneficial if a backend storage, due to bugs or similar, could mix up the order of the upload and delete calls. --- internal/backend/backend_retry.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/internal/backend/backend_retry.go b/internal/backend/backend_retry.go index 5d7a58b64..fe0d34799 100644 --- a/internal/backend/backend_retry.go +++ b/internal/backend/backend_retry.go @@ -68,10 +68,16 @@ func (be *RetryBackend) Save(ctx context.Context, h restic.Handle, rd restic.Rew return nil } - debug.Log("Save(%v) failed with error, removing file: %v", h, err) - rerr := be.Backend.Remove(ctx, h) - if rerr != nil { - debug.Log("Remove(%v) returned error: %v", h, err) + if be.Backend.HasAtomicReplace() { + debug.Log("Save(%v) failed with error: %v", h, err) + // there is no need to remove files from backends which can atomically replace files + // in fact if something goes wrong at the backend side the delete operation might delete the wrong instance of the file + } else { + debug.Log("Save(%v) failed with error, removing file: %v", h, err) + rerr := be.Backend.Remove(ctx, h) + if rerr != nil { + debug.Log("Remove(%v) returned error: %v", h, err) + } } // return original error