diff --git a/internal/checker/checker.go b/internal/checker/checker.go index d5e7fd1f8..031e13807 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -146,7 +146,11 @@ func (c *Checker) LoadIndex(ctx context.Context, p *progress.Counter) (hints []e return hints, append(errs, err) } - 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) + } // compute pack size using index entries c.packs, err = pack.Size(ctx, c.repo, false) diff --git a/internal/repository/repair_index.go b/internal/repository/repair_index.go index c72dcfd00..770809254 100644 --- a/internal/repository/repair_index.go +++ b/internal/repository/repair_index.go @@ -52,8 +52,10 @@ func RepairIndex(ctx context.Context, repo *Repository, opts RepairIndexOptions, return err } - repo.SetIndex(mi) - + err = repo.SetIndex(mi) + if err != nil { + return err + } packSizeFromIndex, err = pack.Size(ctx, repo, false) if err != nil { return err diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 3dc248c5e..f7fd65c71 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "math" + "os" "runtime" "sort" "sync" @@ -585,8 +586,9 @@ func (r *Repository) ListPacksFromIndex(ctx context.Context, packs restic.IDSet) } // SetIndex instructs the repository to use the given index. -func (r *Repository) SetIndex(i restic.MasterIndex) { +func (r *Repository) SetIndex(i restic.MasterIndex) error { r.idx = i.(*index.MasterIndex) + return r.prepareCache() } func (r *Repository) clearIndex() { @@ -626,8 +628,12 @@ func (r *Repository) LoadIndex(ctx context.Context, p *progress.Counter) error { return errors.New("index uses feature not supported by repository version 1") } } + if ctx.Err() != nil { + return ctx.Err() + } - return ctx.Err() + // remove index files from the cache which have been removed in the repo + return r.prepareCache() } // createIndexFromPacks creates a new index by reading all given pack files (with sizes). @@ -693,6 +699,33 @@ func (r *Repository) createIndexFromPacks(ctx context.Context, packsize map[rest return invalid, nil } +// prepareCache initializes the local cache. indexIDs is the list of IDs of +// index files still present in the repo. +func (r *Repository) prepareCache() error { + if r.Cache == nil { + return nil + } + + indexIDs := r.idx.IDs() + debug.Log("prepare cache with %d index files", len(indexIDs)) + + // clear old index files + err := r.Cache.Clear(restic.IndexFile, indexIDs) + if err != nil { + fmt.Fprintf(os.Stderr, "error clearing index files in cache: %v\n", err) + } + + packs := r.idx.Packs(restic.NewIDSet()) + + // clear old packs + err = r.Cache.Clear(restic.PackFile, packs) + if err != nil { + fmt.Fprintf(os.Stderr, "error clearing pack files in cache: %v\n", err) + } + + return nil +} + // SearchKey finds a key with the supplied password, afterwards the config is // read and parsed. It tries at most maxKeys key files in the repo. func (r *Repository) SearchKey(ctx context.Context, password string, maxKeys int, keyHint string) error { diff --git a/internal/restic/repository.go b/internal/restic/repository.go index ce8401b37..b18b036a7 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -22,7 +22,7 @@ type Repository interface { Key() *crypto.Key LoadIndex(ctx context.Context, p *progress.Counter) error - SetIndex(mi MasterIndex) + SetIndex(mi MasterIndex) error LookupBlob(t BlobType, id ID) []PackedBlob LookupBlobSize(t BlobType, id ID) (size uint, exists bool)