From 4426dfe6a9417c26cec3deb62d10d5cd3502b370 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 28 Sep 2025 15:10:57 +0200 Subject: [PATCH] repository: replace SetIndex method with internal loadIndexWithCallback method --- internal/repository/checker.go | 17 +++-------------- internal/repository/repair_index.go | 14 +------------- internal/repository/repository.go | 13 ++++++------- internal/restic/repository.go | 12 ------------ 4 files changed, 10 insertions(+), 46 deletions(-) diff --git a/internal/repository/checker.go b/internal/repository/checker.go index efe295b7c..328317302 100644 --- a/internal/repository/checker.go +++ b/internal/repository/checker.go @@ -80,15 +80,10 @@ func computePackTypes(ctx context.Context, idx restic.ListBlobser) (map[restic.I // LoadIndex loads all index files. func (c *Checker) LoadIndex(ctx context.Context, p restic.TerminalCounterFactory) (hints []error, errs []error) { debug.Log("Start") - - var bar *progress.Counter - if p != nil { - bar = p.NewCounterTerminalOnly("index files loaded") - } - packToIndex := make(map[restic.ID]restic.IDSet) - masterIndex := index.NewMasterIndex() - err := masterIndex.Load(ctx, c.repo, bar, func(id restic.ID, idx *index.Index, err error) error { + + // Use the repository's internal loadIndexWithCallback to handle per-index errors + err := c.repo.loadIndexWithCallback(ctx, p, func(id restic.ID, idx *index.Index, err error) error { debug.Log("process index %v, err %v", id, err) err = errors.Wrapf(err, "error loading index %v", id) @@ -116,12 +111,6 @@ func (c *Checker) LoadIndex(ctx context.Context, p restic.TerminalCounterFactory return hints, append(errs, err) } - err = c.repo.SetIndex(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) if err != nil { diff --git a/internal/repository/repair_index.go b/internal/repository/repair_index.go index cc08206d5..929de3db2 100644 --- a/internal/repository/repair_index.go +++ b/internal/repository/repair_index.go @@ -32,30 +32,18 @@ func RepairIndex(ctx context.Context, repo *Repository, opts RepairIndexOptions, } else { printer.P("loading indexes...\n") - mi := index.NewMasterIndex() - err := index.ForAllIndexes(ctx, repo, repo, func(id restic.ID, idx *index.Index, err error) error { + err := repo.loadIndexWithCallback(ctx, nil, func(id restic.ID, _ *index.Index, err error) error { if err != nil { printer.E("removing invalid index %v: %v\n", id, err) obsoleteIndexes = append(obsoleteIndexes, id) return nil } - - mi.Insert(idx) return nil }) if err != nil { return err } - err = mi.MergeFinalIndexes() - if err != nil { - return err - } - - 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 413538c11..897724414 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -632,18 +632,17 @@ func (r *Repository) ListPacksFromIndex(ctx context.Context, packs restic.IDSet) return r.idx.ListPacks(ctx, packs) } -// SetIndex instructs the repository to use the given index. -func (r *Repository) SetIndex(i restic.MasterIndex) error { - r.idx = i.(*index.MasterIndex) - return r.prepareCache() -} - func (r *Repository) clearIndex() { r.idx = index.NewMasterIndex() } // LoadIndex loads all index files from the backend in parallel and stores them func (r *Repository) LoadIndex(ctx context.Context, p restic.TerminalCounterFactory) error { + return r.loadIndexWithCallback(ctx, p, nil) +} + +// loadIndexWithCallback loads all index files from the backend in parallel and stores them +func (r *Repository) loadIndexWithCallback(ctx context.Context, p restic.TerminalCounterFactory, cb func(id restic.ID, idx *index.Index, err error) error) error { debug.Log("Loading index") // reset in-memory index before loading it from the repository @@ -654,7 +653,7 @@ func (r *Repository) LoadIndex(ctx context.Context, p restic.TerminalCounterFact bar = p.NewCounterTerminalOnly("index files loaded") } - err := r.idx.Load(ctx, r, bar, nil) + err := r.idx.Load(ctx, r, bar, cb) if err != nil { return err } diff --git a/internal/restic/repository.go b/internal/restic/repository.go index f2354b088..509a0db8a 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -22,7 +22,6 @@ type Repository interface { Key() *crypto.Key LoadIndex(ctx context.Context, p TerminalCounterFactory) error - SetIndex(mi MasterIndex) error LookupBlob(t BlobType, id ID) []PackedBlob LookupBlobSize(t BlobType, id ID) (size uint, exists bool) @@ -137,17 +136,6 @@ type TerminalCounterFactory interface { NewCounterTerminalOnly(description string) *progress.Counter } -// MasterIndex keeps track of the blobs are stored within files. -type MasterIndex interface { - Has(bh BlobHandle) bool - Lookup(bh BlobHandle) []PackedBlob - - // Each runs fn on all blobs known to the index. When the context is cancelled, - // the index iteration returns immediately with ctx.Err(). This blocks any modification of the index. - Each(ctx context.Context, fn func(PackedBlob)) error - ListPacks(ctx context.Context, packs IDSet) <-chan PackBlobs -} - // Lister allows listing files in a backend. type Lister interface { List(ctx context.Context, t FileType, fn func(ID, int64) error) error