From e68a7fea8ae3375968a5cd5d40b7c8c1e2555101 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sat, 31 Mar 2018 10:02:09 +0200 Subject: [PATCH] check: Allow filling the cache during check Closes #1665 --- internal/checker/checker.go | 6 +++++- internal/mock/repository.go | 6 +++--- internal/repository/repository.go | 16 +++++++++++++++- internal/restic/repository.go | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 81c0d8347..ca289be10 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -164,7 +164,11 @@ func (c *Checker) LoadIndex(ctx context.Context) (hints []error, errs []error) { } } - c.repo.SetIndex(c.masterIndex) + err := c.repo.SetIndex(c.masterIndex) + if err != nil { + debug.Log("SetIndex returned error: %v", err) + errs = append(errs, err) + } return hints, errs } diff --git a/internal/mock/repository.go b/internal/mock/repository.go index a6a68988a..c3a9f0f9f 100644 --- a/internal/mock/repository.go +++ b/internal/mock/repository.go @@ -11,7 +11,7 @@ type Repository struct { KeyFn func() *crypto.Key - SetIndexFn func(restic.Index) + SetIndexFn func(restic.Index) error IndexFn func() restic.Index SaveFullIndexFn func() error @@ -51,8 +51,8 @@ func (repo Repository) Key() *crypto.Key { } // SetIndex is a stub method. -func (repo Repository) SetIndex(idx restic.Index) { - repo.SetIndexFn(idx) +func (repo Repository) SetIndex(idx restic.Index) error { + return repo.SetIndexFn(idx) } // Index is a stub method. diff --git a/internal/repository/repository.go b/internal/repository/repository.go index ee3e3b549..3a1ce40c2 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -331,8 +331,20 @@ func (r *Repository) Index() restic.Index { } // SetIndex instructs the repository to use the given index. -func (r *Repository) SetIndex(i restic.Index) { +func (r *Repository) SetIndex(i restic.Index) error { r.idx = i.(*MasterIndex) + + ids := restic.NewIDSet() + for _, idx := range r.idx.All() { + id, err := idx.ID() + if err != nil { + debug.Log("not using index, ID() returned error %v", err) + continue + } + ids.Insert(id) + } + + return r.PrepareCache(ids) } // SaveIndex saves an index in the repository. @@ -428,6 +440,8 @@ func (r *Repository) PrepareCache(indexIDs restic.IDSet) error { return nil } + debug.Log("prepare cache with %d index files", len(indexIDs)) + // clear old index files err := r.Cache.Clear(restic.IndexFile, indexIDs) if err != nil { diff --git a/internal/restic/repository.go b/internal/restic/repository.go index 5a3a01a8a..ff8f38034 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -15,7 +15,7 @@ type Repository interface { Key() *crypto.Key - SetIndex(Index) + SetIndex(Index) error Index() Index SaveFullIndex(context.Context) error