aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-09-07 22:40:06 +0200
committerMartin Polden <mpolden@mpolden.no>2020-09-07 22:40:06 +0200
commitbd8b1c7b97ebb39f9d3b010504bdee5ff351be56 (patch)
tree2a278f5b5e1c94a667ff576c5a02b930582205d1
parent971c0e11f4023ad2c9b1e080e34d28e5276cb89b (diff)
cache: Fix memory leak
Slices never shrink.
-rw-r--r--http/cache.go16
1 files changed, 10 insertions, 6 deletions
diff --git a/http/cache.go b/http/cache.go
index b21dcb7..647c1dc 100644
--- a/http/cache.go
+++ b/http/cache.go
@@ -1,6 +1,7 @@
package http
import (
+ "container/list"
"hash/fnv"
"net"
"sync"
@@ -10,17 +11,18 @@ type Cache struct {
capacity int
mu sync.RWMutex
entries map[uint64]Response
- keys []uint64
+ keys *list.List
}
func NewCache(capacity int) *Cache {
if capacity < 0 {
capacity = 0
}
+ keys := list.New()
return &Cache{
capacity: capacity,
entries: make(map[uint64]Response),
- keys: make([]uint64, 0, capacity),
+ keys: keys,
}
}
@@ -37,12 +39,14 @@ func (c *Cache) Set(ip net.IP, resp Response) {
k := key(ip)
c.mu.Lock()
defer c.mu.Unlock()
- if len(c.entries) == c.capacity && c.capacity > 0 {
- delete(c.entries, c.keys[0])
- c.keys = c.keys[1:]
+ if len(c.entries) == c.capacity {
+ // At capacity. Remove the oldest entry
+ oldest := c.keys.Front()
+ delete(c.entries, oldest.Value.(uint64))
+ c.keys.Remove(oldest)
}
c.entries[k] = resp
- c.keys = append(c.keys, k)
+ c.keys.PushBack(k)
}
func (c *Cache) Get(ip net.IP) (Response, bool) {