From cc4728d287e724512c846ede77190da77337d4ef Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 21 Aug 2022 10:38:40 +0200 Subject: [PATCH] repository: Do not report ignored packs in EachByPack Ignored packs were reported as an empty pack by EachByPack. The most immediate effect of this is that the progress bar for rebuilding the index reports processing more packs than actually exist. --- internal/repository/index.go | 6 +++--- internal/repository/index_test.go | 34 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/internal/repository/index.go b/internal/repository/index.go index 8978b60d5..28863436b 100644 --- a/internal/repository/index.go +++ b/internal/repository/index.go @@ -276,10 +276,10 @@ func (idx *Index) EachByPack(ctx context.Context, packBlacklist restic.IDSet) <- m := &idx.byType[typ] m.foreach(func(e *indexEntry) bool { packID := idx.packs[e.packIndex] - if _, ok := byPack[packID]; !ok { - byPack[packID] = make([][]*indexEntry, restic.NumBlobTypes) - } if !idx.final || !packBlacklist.Has(packID) { + if _, ok := byPack[packID]; !ok { + byPack[packID] = make([][]*indexEntry, restic.NumBlobTypes) + } byPack[packID][typ] = append(byPack[packID][typ], e) } return true diff --git a/internal/repository/index_test.go b/internal/repository/index_test.go index 233dde030..6bc7afca2 100644 --- a/internal/repository/index_test.go +++ b/internal/repository/index_test.go @@ -613,3 +613,37 @@ func TestMixedEachByPack(t *testing.T) { } rtest.Equals(t, expected, reported) } + +func TestEachByPackIgnoes(t *testing.T) { + idx := repository.NewIndex() + + ignores := restic.NewIDSet() + expected := make(map[restic.ID]int) + // create 50 packs with one blob each + for i := 0; i < 50; i++ { + packID := restic.NewRandomID() + if i < 3 { + ignores.Insert(packID) + } else { + expected[packID] = 1 + } + blobs := []restic.Blob{ + { + BlobHandle: restic.BlobHandle{Type: restic.DataBlob, ID: restic.NewRandomID()}, + Offset: 0, + Length: 42, + }, + } + idx.StorePack(packID, blobs) + } + idx.Finalize() + + reported := make(map[restic.ID]int) + for bp := range idx.EachByPack(context.TODO(), ignores) { + reported[bp.PackID]++ + rtest.Equals(t, 1, len(bp.Blobs)) // correct blob count + b0 := bp.Blobs[0] + rtest.Assert(t, b0.Type == restic.DataBlob && b0.Offset == 0 && b0.Length == 42, "wrong blob", b0) + } + rtest.Equals(t, expected, reported) +}