mirror of
https://github.com/octoleo/restic.git
synced 2024-11-22 21:05:10 +00:00
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
@ -277,6 +277,7 @@ func planPrune(ctx context.Context, opts PruneOptions, gopts GlobalOptions, repo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(plan.repackPacks) != 0 {
|
if len(plan.repackPacks) != 0 {
|
||||||
|
blobCount := keepBlobs.Len()
|
||||||
// when repacking, we do not want to keep blobs which are
|
// when repacking, we do not want to keep blobs which are
|
||||||
// already contained in kept packs, so delete them from keepBlobs
|
// already contained in kept packs, so delete them from keepBlobs
|
||||||
repo.Index().Each(ctx, func(blob restic.PackedBlob) {
|
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)
|
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 {
|
} else {
|
||||||
// keepBlobs is only needed if packs are repacked
|
// keepBlobs is only needed if packs are repacked
|
||||||
keepBlobs = nil
|
keepBlobs = nil
|
||||||
|
@ -57,3 +57,12 @@ func (s CountedBlobSet) String() string {
|
|||||||
|
|
||||||
return "{" + str[1:len(str)-1] + "}"
|
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()
|
s := bs.String()
|
||||||
test.Assert(t, len(s) > 10, "invalid string: %v", s)
|
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 New Issue
Block a user