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:
commit
8b84c96d9d
1 changed files with 15 additions and 17 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue