Skip to content

Commit ece93bf

Browse files
committed
On delete, always set promotions == -2 and node == nil
Also, item.promotions doesn't need to be loaded/stored using atomic. Once upon a time it did. Cache was updated long ago to not use atomic operations on it, but LayeredCache wasn't. They are both consistent now (they don't use atomic operations). Fixes: #76
1 parent 3452e4e commit ece93bf

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

cache.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,8 @@ func (c *Cache[T]) doDelete(item *Item[T]) {
394394
c.onDelete(item)
395395
}
396396
c.list.Remove(item.node)
397+
item.node = nil
398+
item.promotions = -2
397399
}
398400
}
399401

cache_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ func Test_CachePrune(t *testing.T) {
332332
cache.Set(key, key, 5*time.Minute)
333333
}
334334
if epoch%500 == 0 {
335-
assert.True(t, cache.GetSize() < 500)
335+
assert.True(t, cache.GetSize() <= 500)
336336
}
337337
}
338338
}

layeredcache.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,15 @@ func (c *LayeredCache[T]) worker() {
266266
}
267267
deleteItem := func(item *Item[T]) {
268268
if item.node == nil {
269-
atomic.StoreInt32(&item.promotions, -2)
269+
item.promotions = -2
270270
} else {
271271
c.size -= item.size
272272
if c.onDelete != nil {
273273
c.onDelete(item)
274274
}
275275
c.list.Remove(item.node)
276+
item.node = nil
277+
item.promotions = -2
276278
}
277279
}
278280
for {
@@ -318,13 +320,13 @@ func (c *LayeredCache[T]) worker() {
318320

319321
func (c *LayeredCache[T]) doPromote(item *Item[T]) bool {
320322
// deleted before it ever got promoted
321-
if atomic.LoadInt32(&item.promotions) == -2 {
323+
if item.promotions == -2 {
322324
return false
323325
}
324326
if item.node != nil { //not a new item
325327
if item.shouldPromote(c.getsPerPromote) {
326328
c.list.MoveToFront(item.node)
327-
atomic.StoreInt32(&item.promotions, 0)
329+
item.promotions = 0
328330
}
329331
return false
330332
}

layeredcache_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ func Test_LayeredCachePrune(t *testing.T) {
391391
cache.Set(key, key, key, 5*time.Minute)
392392
}
393393
if epoch%500 == 0 {
394-
assert.True(t, cache.GetSize() < 500)
394+
assert.True(t, cache.GetSize() <= 500)
395395
}
396396
}
397397
}

0 commit comments

Comments
 (0)