You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When Running TrackingGet, func gc could insert like this:
// Used when the cache was created with the Track() configuration option.
// Avoid otherwise
func (c *Cache) TrackingGet(key string) TrackedItem {
item := c.Get(key)
if item == nil {
return NilTracked
}
// switch to gc goroutine
...
if c.tracking == false || atomic.LoadInt32(&item.refCount) == 0 {
c.bucket(item.key).delete(item.key)
c.size -= item.size
c.list.Remove(element)
if c.onDelete != nil {
c.onDelete(item)
}
dropped += 1
item.promotions = -2
}
...
// switch back
item.track()
return item
}
That would cause getting items which have been processed onDelete func.
The text was updated successfully, but these errors were encountered:
chenqiuhao1997
changed the title
TrackingGet goroutine unsafe with onDelete func
Bug report: TrackingGet goroutine unsafe with onDelete func
Jun 3, 2021
I'm not sure I understand the problem. TrackingGet and onDelete will get the same item, but tonDelete could be called at any point that 1 (or many) copies of item are out in user-code.
Sure, the refcount of item will be brought back up to 1, but I don't see that as being 'unsafe'.
When Running
TrackingGet
, funcgc
could insert like this:That would cause getting items which have been processed onDelete func.
The text was updated successfully, but these errors were encountered: