cache: Copy values

This commit is contained in:
Martin Polden 2020-09-05 22:07:35 +02:00
parent 6878f54585
commit 971c0e11f4
3 changed files with 12 additions and 27 deletions

View File

@ -9,7 +9,7 @@ import (
type Cache struct {
capacity int
mu sync.RWMutex
entries map[uint64]*Response
entries map[uint64]Response
keys []uint64
}
@ -19,7 +19,7 @@ func NewCache(capacity int) *Cache {
}
return &Cache{
capacity: capacity,
entries: make(map[uint64]*Response),
entries: make(map[uint64]Response),
keys: make([]uint64, 0, capacity),
}
}
@ -30,7 +30,7 @@ func key(ip net.IP) uint64 {
return h.Sum64()
}
func (c *Cache) Set(ip net.IP, resp *Response) {
func (c *Cache) Set(ip net.IP, resp Response) {
if c.capacity == 0 {
return
}
@ -45,7 +45,7 @@ func (c *Cache) Set(ip net.IP, resp *Response) {
c.keys = append(c.keys, k)
}
func (c *Cache) Get(ip net.IP) (*Response, bool) {
func (c *Cache) Get(ip net.IP) (Response, bool) {
k := key(ip)
c.mu.RLock()
defer c.mu.RUnlock()

View File

@ -4,24 +4,8 @@ import (
"fmt"
"net"
"testing"
"unsafe"
)
func TestCache(t *testing.T) {
c := NewCache(10)
for i := 0; i < 100; i++ {
ip := net.ParseIP(fmt.Sprintf("192.0.2.%d", i))
r := &Response{IP: ip}
fmt.Println(unsafe.Sizeof(r))
c.Set(ip, r)
}
fmt.Println(len(c.entries))
fmt.Println(len(c.keys))
}
func TestCacheCapacity(t *testing.T) {
var tests = []struct {
addCount, capacity, size int
@ -33,10 +17,10 @@ func TestCacheCapacity(t *testing.T) {
}
for i, tt := range tests {
c := NewCache(tt.capacity)
var responses []*Response
var responses []Response
for i := 0; i < tt.addCount; i++ {
ip := net.ParseIP(fmt.Sprintf("192.0.2.%d", i))
r := &Response{IP: ip}
r := Response{IP: ip}
responses = append(responses, r)
c.Set(ip, r)
}

View File

@ -7,10 +7,11 @@ import (
"path/filepath"
"strings"
"net/http/pprof"
"github.com/mpolden/echoip/iputil"
"github.com/mpolden/echoip/iputil/geo"
"github.com/mpolden/echoip/useragent"
"net/http/pprof"
"math/big"
"net"
@ -125,9 +126,9 @@ func (s *Server) newResponse(r *http.Request) (Response, error) {
}
response, ok := s.cache.Get(ip)
if ok {
// Not Caching the userAgent as it can vary for a given IP
// Do not cache user agent
response.UserAgent = userAgentFromRequest(r)
return *response, nil
return response, nil
}
ipDecimal := iputil.ToDecimal(ip)
country, _ := s.gr.Country(ip)
@ -141,7 +142,7 @@ func (s *Server) newResponse(r *http.Request) (Response, error) {
if asn.AutonomousSystemNumber > 0 {
autonomousSystemNumber = fmt.Sprintf("AS%d", asn.AutonomousSystemNumber)
}
response = &Response{
response = Response{
IP: ip,
IPDecimal: ipDecimal,
Country: country.Name,
@ -161,7 +162,7 @@ func (s *Server) newResponse(r *http.Request) (Response, error) {
}
s.cache.Set(ip, response)
response.UserAgent = userAgentFromRequest(r)
return *response, nil
return response, nil
}
func (s *Server) newPortResponse(r *http.Request) (PortResponse, error) {