|
1 | 1 | package cache
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "github.com/drone/ff-golang-server-sdk/logger" |
| 4 | + "github.com/drone/ff-golang-server-sdk.v1/logger" |
5 | 5 | lru "github.com/hashicorp/golang-lru"
|
| 6 | + |
6 | 7 | "reflect"
|
7 | 8 | "time"
|
8 | 9 | )
|
9 | 10 |
|
10 |
| -type lruCache struct { |
| 11 | +// LRUCache is thread-safe LAST READ USED Cache |
| 12 | +type LRUCache struct { |
11 | 13 | *lru.Cache
|
12 | 14 | logger logger.Logger
|
13 | 15 | lastUpdate time.Time
|
14 | 16 | }
|
15 | 17 |
|
16 |
| -func NewLruCache(size int, logger logger.Logger) (*lruCache, error) { |
| 18 | +//NewLruCache creates a new LRU instance |
| 19 | +func NewLruCache(size int, logger logger.Logger) (*LRUCache, error) { |
17 | 20 | cache, err := lru.New(size)
|
18 | 21 | if err != nil {
|
19 | 22 | logger.Errorf("Error initializing LRU cache, err: %v", err)
|
20 | 23 | return nil, err
|
21 | 24 | }
|
22 | 25 | logger.Infof("Cache successfully initialized with size: %d", size)
|
23 |
| - return &lruCache{ |
| 26 | + return &LRUCache{ |
24 | 27 | Cache: cache,
|
25 | 28 | logger: logger,
|
26 | 29 | }, nil
|
27 | 30 | }
|
28 | 31 |
|
29 |
| -func (lru *lruCache) getTime() time.Time { |
| 32 | +func (lru *LRUCache) getTime() time.Time { |
30 | 33 | return time.Now()
|
31 | 34 | }
|
32 | 35 |
|
33 |
| -func (lru *lruCache) Set(key interface{}, value interface{}) (evicted bool) { |
| 36 | +// Set a new value if it is different from the previous one. |
| 37 | +// Returns true if an eviction occurred. |
| 38 | +func (lru *LRUCache) Set(key interface{}, value interface{}) (evicted bool) { |
34 | 39 | prev, _ := lru.Get(key)
|
35 | 40 | if !reflect.DeepEqual(prev, value) {
|
36 | 41 | add := lru.Cache.Add(key, value)
|
37 | 42 | lru.lastUpdate = lru.getTime()
|
38 |
| - lru.logger.Infof("cache value changed for key %s with value %v", key, value) |
| 43 | + lru.logger.Debugf("cache value changed for key %s with value %v", key, value) |
39 | 44 | return add
|
40 | 45 | }
|
41 | 46 | return false
|
42 | 47 | }
|
43 | 48 |
|
44 |
| -func (lru *lruCache) Contains(key interface{}) bool { |
| 49 | +// Contains checks if a key is in the cache |
| 50 | +func (lru *LRUCache) Contains(key interface{}) bool { |
45 | 51 | return lru.Cache.Contains(key)
|
46 | 52 | }
|
47 | 53 |
|
48 |
| -func (lru *lruCache) ContainsOrAdd(key interface{}, value interface{}) (ok bool, evicted bool) { |
49 |
| - ok, evicted = lru.Cache.ContainsOrAdd(key, value) |
50 |
| - lru.lastUpdate = lru.getTime() |
51 |
| - return |
52 |
| -} |
53 |
| - |
54 |
| -func (lru *lruCache) Get(key interface{}) (value interface{}, ok bool) { |
| 54 | +// Get looks up a key's value from the cache. |
| 55 | +func (lru *LRUCache) Get(key interface{}) (value interface{}, ok bool) { |
55 | 56 | return lru.Cache.Get(key)
|
56 | 57 | }
|
57 | 58 |
|
58 |
| -func (lru *lruCache) GetOldest() (key interface{}, value interface{}, ok bool) { |
59 |
| - return lru.Cache.GetOldest() |
60 |
| -} |
61 |
| - |
62 |
| -func (lru *lruCache) Keys() []interface{} { |
| 59 | +// Keys returns a slice of the keys in the cache, from oldest to newest. |
| 60 | +func (lru *LRUCache) Keys() []interface{} { |
63 | 61 | return lru.Cache.Keys()
|
64 | 62 | }
|
65 | 63 |
|
66 |
| -func (lru *lruCache) Len() int { |
| 64 | +// Len returns the number of items in the cache. |
| 65 | +func (lru *LRUCache) Len() int { |
67 | 66 | return lru.Cache.Len()
|
68 | 67 | }
|
69 | 68 |
|
70 |
| -func (lru *lruCache) Peek(key interface{}) (value interface{}, ok bool) { |
71 |
| - return lru.Cache.Peek(key) |
72 |
| -} |
73 |
| - |
74 |
| -func (lru *lruCache) PeekOrAdd(key interface{}, value interface{}) (previous interface{}, ok bool, evicted bool) { |
75 |
| - previous, ok, evicted = lru.Cache.PeekOrAdd(key, value) |
76 |
| - lru.lastUpdate = lru.getTime() |
77 |
| - return |
78 |
| -} |
79 |
| - |
80 |
| -func (lru *lruCache) Purge() { |
| 69 | +// Purge is used to completely clear the cache. |
| 70 | +func (lru *LRUCache) Purge() { |
81 | 71 | lru.Cache.Purge()
|
82 | 72 | lru.lastUpdate = lru.getTime()
|
83 | 73 | }
|
84 | 74 |
|
85 |
| -func (lru *lruCache) Remove(key interface{}) (present bool) { |
| 75 | +// Remove removes the provided key from the cache. |
| 76 | +func (lru *LRUCache) Remove(key interface{}) (present bool) { |
86 | 77 | present = lru.Cache.Remove(key)
|
87 | 78 | lru.lastUpdate = lru.getTime()
|
88 | 79 | if present {
|
89 |
| - lru.logger.Infof("Cache item successfully removed %v", key) |
90 |
| - } |
91 |
| - return |
92 |
| -} |
93 |
| - |
94 |
| -func (lru *lruCache) RemoveOldest() (key interface{}, value interface{}, ok bool) { |
95 |
| - key, value, ok = lru.Cache.RemoveOldest() |
96 |
| - lru.lastUpdate = lru.getTime() |
97 |
| - if ok { |
98 |
| - lru.logger.Infof("Cache oldest item successfully removed %v with value %v", key, value) |
| 80 | + lru.logger.Debugf("Cache item successfully removed %v", key) |
99 | 81 | }
|
100 | 82 | return
|
101 | 83 | }
|
102 | 84 |
|
103 |
| -func (lru *lruCache) Resize(size int) (evicted int) { |
| 85 | +// Resize changes the cache size. |
| 86 | +func (lru *LRUCache) Resize(size int) (evicted int) { |
104 | 87 | return lru.Cache.Resize(size)
|
105 | 88 | }
|
106 | 89 |
|
107 |
| -func (lru *lruCache) Updated() time.Time { |
| 90 | +// Updated lastUpdate information |
| 91 | +func (lru *LRUCache) Updated() time.Time { |
108 | 92 | return lru.lastUpdate
|
109 | 93 | }
|
110 | 94 |
|
111 |
| -func (lru lruCache) SetLogger(logger logger.Logger) { |
| 95 | +// SetLogger set logger |
| 96 | +func (lru LRUCache) SetLogger(logger logger.Logger) { |
112 | 97 | lru.logger = logger
|
113 | 98 | }
|
0 commit comments