Skip to content

Commit ae910a5

Browse files
authored
feat(chunk): trigger eviction by freeratio in cache add path (#5970)
Signed-off-by: myron369 <[email protected]>
1 parent b539da1 commit ae910a5

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

pkg/chunk/disk_cache.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ func newCacheStore(m *cacheManagerMetrics, dir string, cacheSize, maxItems int64
146146
}
147147
logger.Infof("Disk cache (%s): used ratio - [space %s%%, inode %s%%]",
148148
c.dir, humanize.FtoaWithDigits(float64((1-usage.br)*100), 1), humanize.FtoaWithDigits(float64((1-usage.fr)*100), 1))
149+
150+
c.setlimitByFreeRatio(usage, c.freeRatio)
151+
149152
c.createLockFile()
150153
go c.checkLockFile()
151154
go c.flush()
@@ -159,6 +162,21 @@ func newCacheStore(m *cacheManagerMetrics, dir string, cacheSize, maxItems int64
159162
return c
160163
}
161164

165+
func (cache *cacheStore) setlimitByFreeRatio(usage DiskFreeRatio, freeRatio float32) {
166+
sizeLimit := int64(float64(1-freeRatio) * float64(usage.spaceCap))
167+
inodeLimit := int64(float64(1-freeRatio) * float64(usage.inodeCap))
168+
if sizeLimit < cache.capacity {
169+
limit := cache.capacity
170+
cache.capacity = sizeLimit
171+
logger.Infof("Adjusted cache capacity based on freeratio: from %d to %d bytes", limit, cache.capacity)
172+
}
173+
if inodeLimit < cache.maxItems || cache.maxItems == 0 {
174+
limit := cache.maxItems
175+
cache.maxItems = inodeLimit
176+
logger.Infof("Adjusted max items based on freeratio: from %d to %d items", limit, cache.maxItems)
177+
}
178+
}
179+
162180
func (cache *cacheStore) lockFilePath() string {
163181
return filepath.Join(cache.dir, ".lock")
164182
}

pkg/chunk/disk_cache_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,3 +407,23 @@ func TestAtimeNotLost(t *testing.T) {
407407
t.Fatalf("CacheStore key %s atime lost after scan, before: %d, after: %d", key, atimeMem, atimeAfterScan)
408408
}
409409
}
410+
func TestSetlimitByFreeRatio(t *testing.T) {
411+
dir := t.TempDir()
412+
cache := newCacheStore(nil, dir, 1<<30, 1000, 1, &defaultConf, nil)
413+
414+
usage := DiskFreeRatio{
415+
spaceCap: 1 << 30,
416+
inodeCap: 1000,
417+
}
418+
freeRatio := float32(0.2)
419+
cache.setlimitByFreeRatio(usage, 0.2)
420+
421+
expectedSizeLimit := int64((1 - freeRatio + 0.05) * float32(usage.spaceCap))
422+
if cache.capacity > expectedSizeLimit {
423+
t.Fatalf("Expected capacity <= %d, but got %d", expectedSizeLimit, cache.capacity)
424+
}
425+
expectedInodeLimit := int64((1 - freeRatio + 0.05) * float32(usage.inodeCap))
426+
if cache.maxItems > expectedInodeLimit && cache.maxItems != 0 {
427+
t.Fatalf("Expected maxItems <= %d, but got %d", expectedInodeLimit, cache.maxItems)
428+
}
429+
}

0 commit comments

Comments
 (0)