@@ -30,15 +30,20 @@ const (
3030 tmpExt = ".tmp"
3131)
3232
33- const defaultMaintenanceInterval = 30 * time .Second
33+ const (
34+ defaultMaintenanceInterval = 30 * time .Second
35+ defaultCacheCleanInterval = 10 * time .Millisecond
36+ defaultCacheGCDelay = 1 * time .Second
37+ )
3438
3539type MappingProvider interface {
3640 GetMapping () seq.Mapping
3741}
3842
3943type Config struct {
40- DataDir string
41- Workers int
44+ DataDir string
45+ Workers int
46+ CacheSizeLimit uint64
4247}
4348
4449type DocsFilter struct {
@@ -56,8 +61,11 @@ type DocsFilter struct {
5661 createDirOnce * sync.Once
5762
5863 maintenanceInterval time.Duration
64+ cacheCleanInterval time.Duration
65+ cacheGCDelay time.Duration
5966
60- headersCache * cache.Cache [[]lidsBlockHeader ]
67+ headersCache * cache.Cache [[]lidsBlockHeader ]
68+ headersCacheCleaner * cache.Cleaner
6169}
6270
6371func New (
@@ -78,6 +86,8 @@ func New(
7886 filtersMap [string (f .Hash ())] = f
7987 }
8088
89+ cacheCleaner := cache .NewCleaner (cfg .CacheSizeLimit , nil )
90+
8191 return & DocsFilter {
8292 ctx : ctx ,
8393 config : cfg ,
@@ -88,8 +98,10 @@ func New(
8898 rateLimit : make (chan struct {}, workers ),
8999 createDirOnce : & sync.Once {},
90100 maintenanceInterval : defaultMaintenanceInterval ,
91- // TODO: create cache properly (cleaner, metrics) (use cacheMaintainer ???)
92- headersCache : cache .NewCache [[]lidsBlockHeader ](nil , nil ),
101+ cacheCleanInterval : defaultCacheCleanInterval ,
102+ cacheGCDelay : defaultCacheGCDelay ,
103+ headersCache : cache .NewCache [[]lidsBlockHeader ](cacheCleaner , nil ),
104+ headersCacheCleaner : cacheCleaner ,
93105 }
94106}
95107
@@ -107,6 +119,7 @@ func (df *DocsFilter) Start(fracs fracmanager.List) {
107119 }
108120
109121 go df .maintenance ()
122+ go df .cacheCleanLoop ()
110123
111124 mapping := df .mp .GetMapping ()
112125
@@ -382,6 +395,25 @@ func (df *DocsFilter) maintenance() {
382395 }
383396}
384397
398+ func (df * DocsFilter ) cacheCleanLoop () {
399+ runs := 0
400+ gcRunsCount := int (df .cacheGCDelay / df .cacheCleanInterval )
401+
402+ for {
403+ runs ++
404+ df .headersCacheCleaner .Cleanup (& cache.CleanStat {})
405+ df .headersCacheCleaner .Rotate ()
406+
407+ if runs >= gcRunsCount {
408+ runs = 0
409+ df .headersCacheCleaner .CleanEmptyGenerations ()
410+ df .headersCacheCleaner .ReleaseBuckets ()
411+ }
412+
413+ time .Sleep (df .cacheCleanInterval )
414+ }
415+ }
416+
385417func (df * DocsFilter ) checkDiskUsage () {
386418 du := int64 (0 )
387419
0 commit comments