// AllPacks sends the contents of all packs to ch. func AllPacks(repo Lister, ch chan<- worker.Job, done <-chan struct{}) { f := func(job worker.Job, done <-chan struct{}) (interface{}, error) { packID := job.Data.(restic.ID) entries, size, err := repo.ListPack(packID) return Result{ packID: packID, size: size, entries: entries, }, err } jobCh := make(chan worker.Job) wp := worker.New(listPackWorkers, f, jobCh, ch) go func() { defer close(jobCh) for id := range repo.List(restic.DataFile, done) { select { case jobCh <- worker.Job{Data: id}: case <-done: return } } }() wp.Wait() }
func printPacks(repo *repository.Repository, wr io.Writer) error { done := make(chan struct{}) defer close(done) f := func(job worker.Job, done <-chan struct{}) (interface{}, error) { name := job.Data.(string) h := backend.Handle{Type: backend.Data, Name: name} rd := backend.NewReadSeeker(repo.Backend(), h) unpacker, err := pack.NewUnpacker(repo.Key(), rd) if err != nil { return nil, err } return unpacker.Entries, nil } jobCh := make(chan worker.Job) resCh := make(chan worker.Job) wp := worker.New(dumpPackWorkers, f, jobCh, resCh) go func() { for name := range repo.Backend().List(backend.Data, done) { jobCh <- worker.Job{Data: name} } close(jobCh) }() for job := range resCh { name := job.Data.(string) if job.Error != nil { fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", name, job.Error) continue } entries := job.Result.([]pack.Blob) p := Pack{ Name: name, Blobs: make([]Blob, len(entries)), } for i, blob := range entries { p.Blobs[i] = Blob{ Type: blob.Type, Length: blob.Length, ID: blob.ID, Offset: blob.Offset, } } prettyPrintJSON(os.Stdout, p) } wp.Wait() return nil }
func loadBlobsFromPacks(repo *repository.Repository) (packs map[backend.ID][]pack.Blob) { done := make(chan struct{}) defer close(done) f := func(job worker.Job, done <-chan struct{}) (interface{}, error) { return repo.ListPack(job.Data.(backend.ID)) } jobCh := make(chan worker.Job) resCh := make(chan worker.Job) wp := worker.New(rebuildIndexWorkers, f, jobCh, resCh) go func() { for id := range repo.List(backend.Data, done) { jobCh <- worker.Job{Data: id} } close(jobCh) }() packs = make(map[backend.ID][]pack.Blob) for job := range resCh { id := job.Data.(backend.ID) if job.Error != nil { fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", id, job.Error) continue } entries := job.Result.([]pack.Blob) packs[id] = entries } wp.Wait() return packs }
func newBufferedPool(bufsize int, n int, f worker.Func) (chan worker.Job, chan worker.Job, *worker.Pool) { inCh := make(chan worker.Job, bufsize) outCh := make(chan worker.Job, bufsize) return inCh, outCh, worker.New(n, f, inCh, outCh) }