1
0
Fork 0
mirror of https://github.com/restic/restic.git synced 2024-12-23 16:26:11 +00:00

Merge pull request #3537 from greatroar/dump-lru

Check cap instead of len in bloblru
This commit is contained in:
MichaelEischer 2021-10-09 20:00:27 +02:00 committed by GitHub
commit f2a3b3b4a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 7 deletions

View file

@ -47,7 +47,7 @@ func New(size int) *Cache {
func (c *Cache) Add(id restic.ID, blob []byte) (old []byte) { func (c *Cache) Add(id restic.ID, blob []byte) (old []byte) {
debug.Log("bloblru.Cache: add %v", id) debug.Log("bloblru.Cache: add %v", id)
size := len(blob) + overhead size := cap(blob) + overhead
if size > c.size { if size > c.size {
return return
} }
@ -66,7 +66,7 @@ func (c *Cache) Add(id restic.ID, blob []byte) (old []byte) {
for size > c.free { for size > c.free {
_, val, _ := c.c.RemoveOldest() _, val, _ := c.c.RemoveOldest()
b := val.([]byte) b := val.([]byte)
if len(b) > len(old) { if cap(b) > cap(old) {
// We can only return one buffer, so pick the largest. // We can only return one buffer, so pick the largest.
old = b old = b
} }
@ -91,6 +91,6 @@ func (c *Cache) Get(id restic.ID) ([]byte, bool) {
func (c *Cache) evict(key, value interface{}) { func (c *Cache) evict(key, value interface{}) {
blob := value.([]byte) blob := value.([]byte)
debug.Log("bloblru.Cache: evict %v, %d bytes", key, len(blob)) debug.Log("bloblru.Cache: evict %v, %d bytes", key, cap(blob))
c.free += len(blob) + overhead c.free += cap(blob) + overhead
} }

View file

@ -28,9 +28,11 @@ func TestCache(t *testing.T) {
rtest.Equals(t, exp, blob) rtest.Equals(t, exp, blob)
} }
addAndCheck(id1, make([]byte, 32*kiB)) // Our blobs have len 1 but larger cap. The cache should check the cap,
addAndCheck(id2, make([]byte, 30*kiB)) // since it more reliably indicates the amount of memory kept alive.
addAndCheck(id3, make([]byte, 10*kiB)) addAndCheck(id1, make([]byte, 1, 32*kiB))
addAndCheck(id2, make([]byte, 1, 30*kiB))
addAndCheck(id3, make([]byte, 1, 10*kiB))
_, ok := c.Get(id2) _, ok := c.Get(id2)
rtest.Assert(t, ok, "blob %v not present", id2) rtest.Assert(t, ok, "blob %v not present", id2)