Comments (6)
I think @bluele must be very busy at the moment. I'm not clear on whether he plans to keep maintaining this project going further.
FTR: I thought this issue was introduced by b9993a9 but it seems to have been present for much longer. We need way better testing coverage to prevent this from happening in the future.
@skurfuerst I will fix that this week. I need some time to draft a correct implementation and then implement the expirable entries features, write more extensive tests etc.
from gcache.
Looks like the ARC cache completely falls apart when expirable entries are enabled.
https://github.com/bluele/gcache/blob/master/arc.go#L122
if elt := c.b2.Lookup(key); elt != nil {
c.part = maxInt(0, c.part-maxInt(c.b1.Len()/c.b2.Len(), 1))
c.replace(key)
c.b2.Remove(key, elt)
c.t2.PushFront(key)
return item, nil
}
Zooming on c.replace(key)
(https://github.com/bluele/gcache/blob/master/arc.go#L40):
func (c *ARC) replace(key interface{}) {
var old interface{}
if (c.t1.Len() > 0 && c.b2.Has(key) && c.t1.Len() == c.part) || (c.t1.Len() > c.part) {
old = c.t1.RemoveTail()
c.b1.PushFront(old)
} else if c.t2.l.Len() > 0 {
old = c.t2.RemoveTail()
c.b2.PushFront(old)
} else {
return
}
// old = "test1" <----- Here
item, ok := c.items[old]
if ok {
delete(c.items, old)
if c.evictedFunc != nil {
c.evictedFunc(item.key, item.value)
}
}
}
Zooming further down that execution path:
else if c.t2.l.Len() > 0 {
old = c.t2.RemoveTail()
c.b2.PushFront(old)
}
I'm not clear on whether the t2
sub-ARC cache should be filled up at all (before entries become eligible for eviction) in which case the logic fails in the way data is balanced/distributed among the sub-caches or if (c.t1.Len() > 0 && c.b2.Has(key) && c.t1.Len() == c.part) || (c.t1.Len() > c.part)
should evaluate to true.
@bluele can you look into this or give me a high-level overview of the right behavior for ARC internals? thanks!
from gcache.
I believe we are also hit by this. Anything we can do to have this fixed? :)
from gcache.
Thanks for reporting, I was able to reproduce it on my machine. I will investigate this.
from gcache.
Thanks @aaronwinter @bluele for looking into this.
from gcache.
Sorry for very late response.
This issue is solved by #58.
from gcache.
Related Issues (20)
- example have some wrong HOT 1
- Support context? HOT 1
- any idea to support window based lfu ?
- Size unit HOT 2
- Please, evict expired objects preferentially
- increment method in lfu.go cause memory leak HOT 1
- Batch operations are very common. Do you consider supporting batch read and batch load interfaces?
- Do you support go mod? HOT 1
- how to share between multiple processes? HOT 2
- Memory Leak in LFU Cache Implementation HOT 4
- Use github action instead of wercker
- 问下啊,初始化的size参数单位是缓存个数还是容量啊 HOT 4
- Can getValue use RLock? HOT 2
- panic happens in v0.0.2 HOT 4
- Is it necessary to dispose the cache instance when it's useless?
- Allow to change cache size
- i think it need a optimize HOT 1
- I make a generic version
- Project Status
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gcache.