aboutsummaryrefslogtreecommitdiff
path: root/plugin/pkg/cache
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2017-10-23 17:24:48 +0100
committerGravatar GitHub <noreply@github.com> 2017-10-23 17:24:48 +0100
commit5aa0d55e72cda8ac4cf95b67b051959b91d8f183 (patch)
tree33872379ce4b4153487a074d5b8f25170a938c0c /plugin/pkg/cache
parentcb5e82b82eb85b49be8bb8747f3475b8d76d57e1 (diff)
downloadcoredns-5aa0d55e72cda8ac4cf95b67b051959b91d8f183.tar.gz
coredns-5aa0d55e72cda8ac4cf95b67b051959b91d8f183.tar.zst
coredns-5aa0d55e72cda8ac4cf95b67b051959b91d8f183.zip
plugin/pkg/cache: smarter locking (#1164)
Make the locking slightly smarter in Evict and add benchmark function. Seems a bit faster (there was some variance while performing these benchmarks) Master: BenchmarkCache-2 1000000 2317 ns/op 0 B/op 0 allocs/op BenchmarkCache-2 1000000 2032 ns/op 0 B/op 0 allocs/op This branch: BenchmarkCache-2 1000000 1806 ns/op 0 B/op 0 allocs/op BenchmarkCache-2 1000000 1809 ns/op 0 B/op 0 allocs/op
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)
+ }
+}