From 1ec628ddf5885ef0f2c4bfe645f0e36d0725827e Mon Sep 17 00:00:00 2001 From: Alexander Weiss Date: Sun, 18 Oct 2020 09:24:34 +0200 Subject: [PATCH] Add extraObsolete to MasterIndex.Save --- cmd/restic/cmd_prune.go | 6 +++--- internal/repository/master_index.go | 25 ++++++++++++------------ internal/repository/master_index_test.go | 2 +- internal/repository/repack_test.go | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/cmd/restic/cmd_prune.go b/cmd/restic/cmd_prune.go index d4073107c..f85a9a672 100644 --- a/cmd/restic/cmd_prune.go +++ b/cmd/restic/cmd_prune.go @@ -498,7 +498,7 @@ func prune(opts PruneOptions, gopts GlobalOptions, repo restic.Repository, usedB if len(removePacks) != 0 { totalpacks := int(stats.packs.used+stats.packs.partlyUsed+stats.packs.unused) - len(removePacks) + packsAddedByRepack - err = rebuildIndexFiles(gopts, repo, removePacks, uint64(totalpacks)) + err = rebuildIndexFiles(gopts, repo, removePacks, nil, uint64(totalpacks)) if err != nil { return err } @@ -511,12 +511,12 @@ func prune(opts PruneOptions, gopts GlobalOptions, repo restic.Repository, usedB return nil } -func rebuildIndexFiles(gopts GlobalOptions, repo restic.Repository, removePacks restic.IDSet, packcount uint64) error { +func rebuildIndexFiles(gopts GlobalOptions, repo restic.Repository, removePacks restic.IDSet, extraObsolete restic.IDs, packcount uint64) error { Verbosef("rebuilding index\n") bar := newProgressMax(!gopts.Quiet, packcount, "packs processed") obsoleteIndexes, err := (repo.Index()).(*repository.MasterIndex). - Save(gopts.ctx, repo, removePacks, bar) + Save(gopts.ctx, repo, removePacks, extraObsolete, bar) bar.Done() if err != nil { return err diff --git a/internal/repository/master_index.go b/internal/repository/master_index.go index 3cbcad0a1..e7f01de7e 100644 --- a/internal/repository/master_index.go +++ b/internal/repository/master_index.go @@ -266,7 +266,7 @@ func (mi *MasterIndex) MergeFinalIndexes() { // 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, p *progress.Counter) (obsolete restic.IDSet, err error) { +func (mi *MasterIndex) Save(ctx context.Context, repo restic.Repository, packBlacklist restic.IDSet, extraObsolete restic.IDs, p *progress.Counter) (obsolete restic.IDSet, err error) { mi.idxMutex.Lock() defer mi.idxMutex.Unlock() @@ -275,15 +275,6 @@ func (mi *MasterIndex) Save(ctx context.Context, repo restic.Repository, packBla newIndex := NewIndex() obsolete = restic.NewIDSet() - finalize := func() error { - newIndex.Finalize() - if _, err := SaveIndex(ctx, repo, newIndex); err != nil { - return err - } - newIndex = NewIndex() - return nil - } - for i, idx := range mi.idx { if idx.Final() { ids, err := idx.IDs() @@ -309,13 +300,23 @@ func (mi *MasterIndex) Save(ctx context.Context, repo restic.Repository, packBla newIndex.StorePack(pbs.packID, pbs.blobs) p.Add(1) if IndexFull(newIndex) { - if err := finalize(); err != nil { + newIndex.Finalize() + if _, err := SaveIndex(ctx, repo, newIndex); err != nil { return nil, err } + newIndex = NewIndex() } } } - if err := finalize(); err != nil { + + err = newIndex.AddToSupersedes(extraObsolete...) + if err != nil { + return nil, err + } + obsolete.Merge(restic.NewIDSet(extraObsolete...)) + + newIndex.Finalize() + if _, err := SaveIndex(ctx, repo, newIndex); err != nil { return nil, err } diff --git a/internal/repository/master_index_test.go b/internal/repository/master_index_test.go index aa9905321..729f088ac 100644 --- a/internal/repository/master_index_test.go +++ b/internal/repository/master_index_test.go @@ -346,7 +346,7 @@ func TestIndexSave(t *testing.T) { repo.LoadIndex(context.TODO()) - obsoletes, err := repo.Index().(*repository.MasterIndex).Save(context.TODO(), repo, nil, nil) + obsoletes, err := repo.Index().(*repository.MasterIndex).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 0def34f09..a1dffbecf 100644 --- a/internal/repository/repack_test.go +++ b/internal/repository/repack_test.go @@ -193,7 +193,7 @@ func rebuildIndex(t *testing.T, repo restic.Repository) { } _, err = (repo.Index()).(*repository.MasterIndex). - Save(context.TODO(), repo, restic.NewIDSet(), nil) + Save(context.TODO(), repo, restic.NewIDSet(), nil, nil) if err != nil { t.Fatal(err)