diff --git a/internal/repository/index.go b/internal/repository/index.go index 28863436b..22528f296 100644 --- a/internal/repository/index.go +++ b/internal/repository/index.go @@ -294,6 +294,8 @@ func (idx *Index) EachByPack(ctx context.Context, packBlacklist restic.IDSet) <- result.Blobs = append(result.Blobs, idx.toPackedBlob(e, restic.BlobType(typ)).Blob) } } + // allow GC once entry is no longer necessary + byPack[packID] = nil select { case <-ctx.Done(): return diff --git a/internal/repository/index_parallel.go b/internal/repository/index_parallel.go index dcf33113e..4fe0797af 100644 --- a/internal/repository/index_parallel.go +++ b/internal/repository/index_parallel.go @@ -52,6 +52,10 @@ func ForAllIndexes(ctx context.Context, repo restic.Repository, var idx *Index oldFormat := false + if cap(buf) < int(fi.Size) { + // overallocate a bit + buf = make([]byte, fi.Size+128*1024) + } buf, err = repo.LoadUnpacked(ctx, restic.IndexFile, fi.ID, buf[:0]) if err == nil { idx, oldFormat, err = DecodeIndex(buf, fi.ID) diff --git a/internal/repository/master_index.go b/internal/repository/master_index.go index 955080e82..05d0fdce2 100644 --- a/internal/repository/master_index.go +++ b/internal/repository/master_index.go @@ -150,7 +150,7 @@ func (mi *MasterIndex) Packs(packBlacklist restic.IDSet) restic.IDSet { packs := restic.NewIDSet() for _, idx := range mi.idx { idxPacks := idx.Packs() - if idx.final { + if idx.final && len(packBlacklist) > 0 { idxPacks = idxPacks.Sub(packBlacklist) } packs.Merge(idxPacks) @@ -458,6 +458,8 @@ func (mi *MasterIndex) ListPacks(ctx context.Context, packs restic.IDSet) <-chan // pass on packs for packID, pbs := range packBlob { + // allow GC + packBlob[packID] = nil select { case out <- restic.PackBlobs{PackID: packID, Blobs: pbs}: case <-ctx.Done():