1
0
Fork 0
mirror of https://github.com/restic/restic.git synced 2024-12-24 00:37:28 +00:00

Merge pull request #3204 from MichaelEischer/archiver-tomb-race

archiver: fix race condition during worker startup
This commit is contained in:
Alexander Neumann 2020-12-30 20:04:20 +01:00 committed by GitHub
commit 8b84c96d9d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -784,33 +784,31 @@ func (arch *Archiver) Snapshot(ctx context.Context, targets []string, opts Snaps
var t tomb.Tomb
wctx := t.Context(ctx)
arch.runWorkers(wctx, &t)
start := time.Now()
var rootTreeID restic.ID
var stats ItemStats
t.Go(func() error {
arch.runWorkers(wctx, &t)
debug.Log("starting snapshot")
rootTreeID, stats, err := func() (restic.ID, ItemStats, error) {
tree, err := arch.SaveTree(wctx, "/", atree, arch.loadParentTree(wctx, opts.ParentSnapshot))
if err != nil {
return restic.ID{}, ItemStats{}, err
return err
}
if len(tree.Nodes) == 0 {
return restic.ID{}, ItemStats{}, errors.New("snapshot is empty")
return errors.New("snapshot is empty")
}
return arch.saveTree(wctx, tree)
}()
debug.Log("saved tree, error: %v", err)
rootTreeID, stats, err = arch.saveTree(wctx, tree)
// trigger shutdown but don't set an error
t.Kill(nil)
werr := t.Wait()
debug.Log("err is %v, werr is %v", err, werr)
// Use werr when it might contain a more specific error than "context canceled"
if err == nil || (errors.Cause(err) == context.Canceled && werr != nil) {
err = werr
}
return err
})
err = t.Wait()
debug.Log("err is %v", err)
if err != nil {
debug.Log("error while saving tree: %v", err)