forked from TrueCloudLab/restic
prune: Shrink keepBlobs set if possible
As long as only a small fraction of the data in a repository is rewritten, the keepBlobs set will be rather small after cleaning it up. As golang maps do not shrink their memory usage, just copy the contents over to a new map. However, only copy the map if the cleanup removed at least half the entries.
This commit is contained in:
parent
c4fc5c97f9
commit
68c9cb9c6a
3 changed files with 23 additions and 0 deletions
|
@ -277,6 +277,7 @@ func planPrune(ctx context.Context, opts PruneOptions, gopts GlobalOptions, repo
|
|||
}
|
||||
|
||||
if len(plan.repackPacks) != 0 {
|
||||
blobCount := keepBlobs.Len()
|
||||
// when repacking, we do not want to keep blobs which are
|
||||
// already contained in kept packs, so delete them from keepBlobs
|
||||
repo.Index().Each(ctx, func(blob restic.PackedBlob) {
|
||||
|
@ -285,6 +286,11 @@ func planPrune(ctx context.Context, opts PruneOptions, gopts GlobalOptions, repo
|
|||
}
|
||||
keepBlobs.Delete(blob.BlobHandle)
|
||||
})
|
||||
|
||||
if keepBlobs.Len() < blobCount/2 {
|
||||
// replace with copy to shrink map to necessary size if there's a chance to benefit
|
||||
keepBlobs = keepBlobs.Copy()
|
||||
}
|
||||
} else {
|
||||
// keepBlobs is only needed if packs are repacked
|
||||
keepBlobs = nil
|
||||
|
|
|
@ -57,3 +57,12 @@ func (s CountedBlobSet) String() string {
|
|||
|
||||
return "{" + str[1:len(str)-1] + "}"
|
||||
}
|
||||
|
||||
// Copy returns a copy of the CountedBlobSet.
|
||||
func (s CountedBlobSet) Copy() CountedBlobSet {
|
||||
cp := make(CountedBlobSet, len(s))
|
||||
for k, v := range s {
|
||||
cp[k] = v
|
||||
}
|
||||
return cp
|
||||
}
|
||||
|
|
|
@ -35,3 +35,11 @@ func TestCountedBlobSet(t *testing.T) {
|
|||
s := bs.String()
|
||||
test.Assert(t, len(s) > 10, "invalid string: %v", s)
|
||||
}
|
||||
|
||||
func TestCountedBlobSetCopy(t *testing.T) {
|
||||
bs := restic.NewCountedBlobSet(restic.NewRandomBlobHandle(), restic.NewRandomBlobHandle(), restic.NewRandomBlobHandle())
|
||||
test.Equals(t, bs.Len(), 3)
|
||||
cp := bs.Copy()
|
||||
test.Equals(t, cp.Len(), 3)
|
||||
test.Equals(t, bs.List(), cp.List())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue