From defd7ae729f3832e566ec618868112d615207b4a Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 14 Apr 2024 13:46:21 +0200 Subject: [PATCH] prune/repair index: reset in-memory index after command The current in-memory index becomes stale after prune or repair index have run. Thus, just drop the in-memory index altogether once these commands have finished. --- internal/repository/prune.go | 7 +++++++ internal/repository/repair_index.go | 9 ++++++++- internal/repository/repository.go | 18 +++++++++++++++--- internal/restic/repository.go | 1 + 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/internal/repository/prune.go b/internal/repository/prune.go index d34f3c88f..8900fffaa 100644 --- a/internal/repository/prune.go +++ b/internal/repository/prune.go @@ -586,6 +586,13 @@ func (plan *PrunePlan) Execute(ctx context.Context, printer progress.Printer) (e } } + if err != nil { + return err + } + + // drop outdated in-memory index + repo.ClearIndex() + printer.P("done\n") return nil } diff --git a/internal/repository/repair_index.go b/internal/repository/repair_index.go index ccf8bcdb0..63e104132 100644 --- a/internal/repository/repair_index.go +++ b/internal/repository/repair_index.go @@ -98,7 +98,14 @@ func RepairIndex(ctx context.Context, repo *Repository, opts RepairIndexOptions, } } - return rebuildIndexFiles(ctx, repo, removePacks, obsoleteIndexes, false, printer) + err = rebuildIndexFiles(ctx, repo, removePacks, obsoleteIndexes, false, printer) + if err != nil { + return err + } + + // drop outdated in-memory index + repo.ClearIndex() + return nil } func rebuildIndexFiles(ctx context.Context, repo restic.Repository, removePacks restic.IDSet, extraObsolete restic.IDs, skipDeletion bool, printer progress.Printer) error { diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 8e34c7125..f163c6a19 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -142,9 +142,6 @@ func (r *Repository) DisableAutoIndexUpdate() { // setConfig assigns the given config and updates the repository parameters accordingly func (r *Repository) setConfig(cfg restic.Config) { r.cfg = cfg - if r.cfg.Version >= 2 { - r.idx.MarkCompressed() - } } // Config returns the repository configuration. @@ -637,9 +634,21 @@ func (r *Repository) Index() restic.MasterIndex { // SetIndex instructs the repository to use the given index. func (r *Repository) SetIndex(i restic.MasterIndex) error { r.idx = i.(*index.MasterIndex) + r.configureIndex() return r.prepareCache() } +func (r *Repository) ClearIndex() { + r.idx = index.NewMasterIndex() + r.configureIndex() +} + +func (r *Repository) configureIndex() { + if r.cfg.Version >= 2 { + r.idx.MarkCompressed() + } +} + // LoadIndex loads all index files from the backend in parallel and stores them func (r *Repository) LoadIndex(ctx context.Context, p *progress.Counter) error { debug.Log("Loading index") @@ -662,6 +671,9 @@ func (r *Repository) LoadIndex(ctx context.Context, p *progress.Counter) error { defer p.Done() } + // reset in-memory index before loading it from the repository + r.ClearIndex() + err = index.ForAllIndexes(ctx, indexList, r, func(_ restic.ID, idx *index.Index, _ bool, err error) error { if err != nil { return err diff --git a/internal/restic/repository.go b/internal/restic/repository.go index 66cc22ea9..89c54ffbb 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -26,6 +26,7 @@ type Repository interface { Index() MasterIndex LoadIndex(context.Context, *progress.Counter) error + ClearIndex() SetIndex(MasterIndex) error LookupBlobSize(ID, BlobType) (uint, bool)