ccache icon indicating copy to clipboard operation
ccache copied to clipboard

Bug report: TrackingGet goroutine unsafe with onDelete func

Open chenqiuhao1997 opened this issue 3 years ago • 1 comments

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.

chenqiuhao1997 avatar Jun 03 '21 09:06 chenqiuhao1997

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'.

Maybe I'm misunderstanding?

karlseguin avatar Jun 13 '21 02:06 karlseguin