diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index afe213732..a285f851d 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -708,15 +708,17 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina p.V("start backup on %v", targets) } _, 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 t.Kill(nil) // 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 p.Finish(id) @@ -728,5 +730,5 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina } // Return error if any - return err + return werr } diff --git a/cmd/restic/delete.go b/cmd/restic/delete.go index 26ca08196..98dd91ece 100644 --- a/cmd/restic/delete.go +++ b/cmd/restic/delete.go @@ -25,16 +25,21 @@ const numDeleteWorkers = 8 func deleteFiles(gopts GlobalOptions, ignoreError bool, repo restic.Repository, fileList restic.IDSet, fileType restic.FileType) error { totalCount := len(fileList) fileChan := make(chan restic.ID) - go func() { + wg, ctx := errgroup.WithContext(gopts.ctx) + wg.Go(func() error { + defer close(fileChan) 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") defer bar.Done() - wg, ctx := errgroup.WithContext(gopts.ctx) for i := 0; i < numDeleteWorkers; i++ { wg.Go(func() error { for id := range fileChan {