aboutsummaryrefslogtreecommitdiff
path: root/plugin/pkg/cache
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/pkg/cache')
-rw-r--r--plugin/pkg/cache/cache.go11
-rw-r--r--plugin/pkg/cache/cache_test.go10
2 files changed, 17 insertions, 4 deletions
diff --git a/plugin/pkg/cache/cache.go b/plugin/pkg/cache/cache.go
index 56cae2180..25faf93ea 100644
--- a/plugin/pkg/cache/cache.go
+++ b/plugin/pkg/cache/cache.go
@@ -95,19 +95,22 @@ func (s *shard) Remove(key uint32) {
// Evict removes a random element from the cache.
func (s *shard) Evict() {
- s.Lock()
- defer s.Unlock()
-
key := -1
+
+ s.RLock()
for k := range s.items {
key = int(k)
break
}
+ s.RUnlock()
+
if key == -1 {
// empty cache
return
}
- delete(s.items, uint32(key))
+
+ // If this item is gone between the RUnlock and Lock race we don't care.
+ s.Remove(uint32(key))
}
// Get looks up the element indexed under key.
diff --git a/plugin/pkg/cache/cache_test.go b/plugin/pkg/cache/cache_test.go
index 2c92bf438..0c56bb9b3 100644
--- a/plugin/pkg/cache/cache_test.go
+++ b/plugin/pkg/cache/cache_test.go
@@ -29,3 +29,13 @@ func TestCacheLen(t *testing.T) {
t.Fatalf("Cache size should %d, got %d", 2, l)
}
}
+
+func BenchmarkCache(b *testing.B) {
+ b.ReportAllocs()
+
+ c := New(4)
+ for n := 0; n < b.N; n++ {
+ c.Add(1, 1)
+ c.Get(1)
+ }
+}