2
2
mirror of https://github.com/octoleo/restic.git synced 2024-12-23 11:28:54 +00:00

Merge pull request #3401 from MichaelEischer/goroutine-shutdown-cleanups

Goroutine shutdown cleanups
This commit is contained in:
Alexander Neumann 2021-07-11 16:32:28 +02:00 committed by GitHub
commit c707d71b72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 10 deletions

View File

@ -708,15 +708,17 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina
p.V("start backup on %v", targets) p.V("start backup on %v", targets)
} }
_, id, err := arch.Snapshot(gopts.ctx, targets, snapshotOpts) _, id, err := arch.Snapshot(gopts.ctx, targets, snapshotOpts)
if err != nil {
return errors.Fatalf("unable to save snapshot: %v", err)
}
// cleanly shutdown all running goroutines // cleanly shutdown all running goroutines
t.Kill(nil) t.Kill(nil)
// let's see if one returned an error // let's see if one returned an error
err = t.Wait() werr := t.Wait()
// return original error
if err != nil {
return errors.Fatalf("unable to save snapshot: %v", err)
}
// Report finished execution // Report finished execution
p.Finish(id) p.Finish(id)
@ -728,5 +730,5 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina
} }
// Return error if any // Return error if any
return err return werr
} }

View File

@ -25,16 +25,21 @@ const numDeleteWorkers = 8
func deleteFiles(gopts GlobalOptions, ignoreError bool, repo restic.Repository, fileList restic.IDSet, fileType restic.FileType) error { func deleteFiles(gopts GlobalOptions, ignoreError bool, repo restic.Repository, fileList restic.IDSet, fileType restic.FileType) error {
totalCount := len(fileList) totalCount := len(fileList)
fileChan := make(chan restic.ID) fileChan := make(chan restic.ID)
go func() { wg, ctx := errgroup.WithContext(gopts.ctx)
wg.Go(func() error {
defer close(fileChan)
for id := range fileList { for id := range fileList {
fileChan <- id select {
case fileChan <- id:
case <-ctx.Done():
return ctx.Err()
}
} }
close(fileChan) return nil
}() })
bar := newProgressMax(!gopts.JSON && !gopts.Quiet, uint64(totalCount), "files deleted") bar := newProgressMax(!gopts.JSON && !gopts.Quiet, uint64(totalCount), "files deleted")
defer bar.Done() defer bar.Done()
wg, ctx := errgroup.WithContext(gopts.ctx)
for i := 0; i < numDeleteWorkers; i++ { for i := 0; i < numDeleteWorkers; i++ {
wg.Go(func() error { wg.Go(func() error {
for id := range fileChan { for id := range fileChan {