2
2
mirror of https://github.com/octoleo/restic.git synced 2024-05-31 16:10:49 +00:00

check: wait for progress bar output

Further code will also output to the terminal and the bar's cursor
positioning causes its output to overlap with the remaining output in a
racy way.

Fixes: #3344
This commit is contained in:
Ben Boeckel 2021-11-05 22:55:39 -04:00
parent 6c84ea1412
commit 4d579c4387

View File

@ -5,6 +5,7 @@ import (
"math/rand" "math/rand"
"strconv" "strconv"
"strings" "strings"
"sync"
"time" "time"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -252,7 +253,11 @@ func runCheck(opts CheckOptions, gopts GlobalOptions, args []string) error {
Verbosef("check snapshots, trees and blobs\n") Verbosef("check snapshots, trees and blobs\n")
errChan = make(chan error) errChan = make(chan error)
var wg sync.WaitGroup
wg.Add(1)
go func() { go func() {
defer wg.Done()
bar := newProgressMax(!gopts.Quiet, 0, "snapshots") bar := newProgressMax(!gopts.Quiet, 0, "snapshots")
defer bar.Done() defer bar.Done()
chkr.Structure(gopts.ctx, bar, errChan) chkr.Structure(gopts.ctx, bar, errChan)
@ -270,6 +275,11 @@ func runCheck(opts CheckOptions, gopts GlobalOptions, args []string) error {
} }
} }
// Wait for the progress bar to be complete before printing more below.
// Must happen after `errChan` is read from in the above loop to avoid
// deadlocking in the case of errors.
wg.Wait()
if opts.CheckUnused { if opts.CheckUnused {
for _, id := range chkr.UnusedBlobs(gopts.ctx) { for _, id := range chkr.UnusedBlobs(gopts.ctx) {
Verbosef("unused blob %v\n", id) Verbosef("unused blob %v\n", id)