diff --git a/cmd/restic/cmd_prune.go b/cmd/restic/cmd_prune.go index 76801dea4..ad306858b 100644 --- a/cmd/restic/cmd_prune.go +++ b/cmd/restic/cmd_prune.go @@ -596,10 +596,8 @@ func prune(opts PruneOptions, gopts GlobalOptions, repo restic.Repository, usedB func writeIndexFiles(gopts GlobalOptions, repo restic.Repository, removePacks restic.IDSet, extraObsolete restic.IDs) (restic.IDSet, error) { Verbosef("rebuilding index\n") - idx := (repo.Index()).(*repository.MasterIndex) - packcount := uint64(len(idx.Packs(removePacks))) - bar := newProgressMax(!gopts.Quiet, packcount, "packs processed") - obsoleteIndexes, err := idx.Save(gopts.ctx, repo, removePacks, extraObsolete, bar) + bar := newProgressMax(!gopts.Quiet, 0, "packs processed") + obsoleteIndexes, err := repo.Index().Save(gopts.ctx, repo, removePacks, extraObsolete, bar) bar.Done() return obsoleteIndexes, err } diff --git a/internal/repository/master_index.go b/internal/repository/master_index.go index f52060d51..171411bf4 100644 --- a/internal/repository/master_index.go +++ b/internal/repository/master_index.go @@ -321,7 +321,9 @@ const saveIndexParallelism = 4 // The new index contains the IDs of all known indexes in the "supersedes" // field. The IDs are also returned in the IDSet obsolete. // After calling this function, you should remove the obsolete index files. -func (mi *MasterIndex) Save(ctx context.Context, repo restic.Repository, packBlacklist restic.IDSet, extraObsolete restic.IDs, p *progress.Counter) (obsolete restic.IDSet, err error) { +func (mi *MasterIndex) Save(ctx context.Context, repo restic.SaverUnpacked, packBlacklist restic.IDSet, extraObsolete restic.IDs, p *progress.Counter) (obsolete restic.IDSet, err error) { + p.SetMax(uint64(len(mi.Packs(packBlacklist)))) + mi.idxMutex.Lock() defer mi.idxMutex.Unlock() diff --git a/internal/repository/master_index_test.go b/internal/repository/master_index_test.go index 79932af07..c393382c3 100644 --- a/internal/repository/master_index_test.go +++ b/internal/repository/master_index_test.go @@ -291,14 +291,12 @@ func BenchmarkMasterIndexLookupMultipleIndexUnknown(b *testing.B) { } func BenchmarkMasterIndexLookupParallel(b *testing.B) { - mIdx := repository.NewMasterIndex() - for _, numindices := range []int{25, 50, 100} { var lookupBh restic.BlobHandle b.StopTimer() rng := rand.New(rand.NewSource(0)) - mIdx, lookupBh = createRandomMasterIndex(b, rng, numindices, 10000) + mIdx, lookupBh := createRandomMasterIndex(b, rng, numindices, 10000) b.StartTimer() name := fmt.Sprintf("known,indices=%d", numindices) @@ -361,7 +359,7 @@ func testIndexSave(t *testing.T, version uint) { t.Fatal(err) } - obsoletes, err := repo.Index().(*repository.MasterIndex).Save(context.TODO(), repo, nil, nil, nil) + obsoletes, err := repo.Index().Save(context.TODO(), repo, nil, nil, nil) if err != nil { t.Fatalf("unable to save new index: %v", err) } diff --git a/internal/repository/repack_test.go b/internal/repository/repack_test.go index 8106a2f0c..f8e375a52 100644 --- a/internal/repository/repack_test.go +++ b/internal/repository/repack_test.go @@ -192,9 +192,7 @@ func rebuildIndex(t *testing.T, repo restic.Repository) { t.Fatal(err) } - _, err = (repo.Index()).(*repository.MasterIndex). - Save(context.TODO(), repo, restic.NewIDSet(), nil, nil) - + _, err = repo.Index().Save(context.TODO(), repo, restic.NewIDSet(), nil, nil) if err != nil { t.Fatal(err) } diff --git a/internal/restic/repository.go b/internal/restic/repository.go index 0d608e9bf..0e388bb5d 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -4,6 +4,7 @@ import ( "context" "github.com/restic/restic/internal/crypto" + "github.com/restic/restic/internal/ui/progress" ) // Repository stores data in a backend. It provides high-level functions and @@ -82,4 +83,6 @@ type MasterIndex interface { // blocks any modification of the index. Each(ctx context.Context) <-chan PackedBlob ListPacks(ctx context.Context, packs IDSet) <-chan PackBlobs + + Save(ctx context.Context, repo SaverUnpacked, packBlacklist IDSet, extraObsolete IDs, p *progress.Counter) (obsolete IDSet, err error) }