2
2
mirror of https://github.com/octoleo/restic.git synced 2024-05-29 07:00:49 +00:00

read packs concurrently

This commit is contained in:
Alexander Neumann 2015-12-06 17:09:06 +01:00
parent 43a23f91a6
commit 0e66a66bce
2 changed files with 46 additions and 10 deletions

View File

@ -693,18 +693,41 @@ func checkPack(r *repository.Repository, id backend.ID) error {
func (c *Checker) ReadData(errChan chan<- error, done <-chan struct{}) { func (c *Checker) ReadData(errChan chan<- error, done <-chan struct{}) {
defer close(errChan) defer close(errChan)
for packID := range c.repo.List(backend.Data, done) { worker := func(wg *sync.WaitGroup, in <-chan backend.ID) {
debug.Log("Checker.ReadData", "checking pack %v", packID.Str()) defer wg.Done()
for {
var id backend.ID
var ok bool
err := checkPack(c.repo, packID) select {
if err == nil { case <-done:
continue return
} case id, ok = <-in:
if !ok {
return
}
}
select { err := checkPack(c.repo, id)
case <-done: if err == nil {
return continue
case errChan <- err: }
select {
case <-done:
return
case errChan <- err:
}
} }
} }
ch := c.repo.List(backend.Data, done)
var wg sync.WaitGroup
for i := 0; i < defaultParallelism; i++ {
wg.Add(1)
go worker(&wg, ch)
}
wg.Wait()
} }

View File

@ -109,6 +109,19 @@ func (cmd CmdCheck) Execute(args []string) error {
} }
} }
if cmd.ReadData {
cmd.global.Verbosef("reading all data\n")
errChan := make(chan error)
go chkr.ReadData(errChan, done)
for err := range errChan {
errorsFound = true
fmt.Fprintf(os.Stderr, "%v\n", err)
}
}
if errorsFound { if errorsFound {
return errors.New("repository contains errors") return errors.New("repository contains errors")
} }