From 453c9c91999604ffe085cbb3ad2b20ecf9f27782 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 2 Jul 2017 11:14:44 +0200 Subject: [PATCH] s3 migrate layout: Retry on errors --- src/restic/migrations/s3_layout.go | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/restic/migrations/s3_layout.go b/src/restic/migrations/s3_layout.go index 342bdd7e0..3ddb6ed3d 100644 --- a/src/restic/migrations/s3_layout.go +++ b/src/restic/migrations/s3_layout.go @@ -2,6 +2,8 @@ package migrations import ( "context" + "fmt" + "os" "path" "restic" "restic/backend" @@ -34,13 +36,35 @@ func (m *S3Layout) Check(ctx context.Context, repo restic.Repository) (bool, err return true, nil } +func retry(max int, fail func(err error), f func() error) error { + var err error + for i := 0; i < max; i++ { + err = f() + if err == nil { + return err + } + if fail != nil { + fail(err) + } + } + return err +} + +// maxErrors for retrying renames on s3. +const maxErrors = 20 + func (m *S3Layout) moveFiles(ctx context.Context, be *s3.Backend, l backend.Layout, t restic.FileType) error { + printErr := func(err error) { + fmt.Fprintf(os.Stderr, "renaming file returned error: %v\n", err) + } + for name := range be.List(ctx, t) { h := restic.Handle{Type: t, Name: name} debug.Log("move %v", h) - if err := be.Rename(h, l); err != nil { - return err - } + + retry(maxErrors, printErr, func() error { + return be.Rename(h, l) + }) } return nil