forked from TrueCloudLab/restic
s3 migrate layout: Retry on errors
This commit is contained in:
parent
993e370f92
commit
453c9c9199
1 changed files with 27 additions and 3 deletions
|
@ -2,6 +2,8 @@ package migrations
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"restic"
|
"restic"
|
||||||
"restic/backend"
|
"restic/backend"
|
||||||
|
@ -34,13 +36,35 @@ func (m *S3Layout) Check(ctx context.Context, repo restic.Repository) (bool, err
|
||||||
return true, nil
|
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 {
|
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) {
|
for name := range be.List(ctx, t) {
|
||||||
h := restic.Handle{Type: t, Name: name}
|
h := restic.Handle{Type: t, Name: name}
|
||||||
debug.Log("move %v", h)
|
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
|
return nil
|
||||||
|
|
Loading…
Add table
Reference in a new issue