Always copy the Cache values for query
parent
3227951069
commit
6e91679fab
|
@ -180,25 +180,6 @@ func (c *Cache) Keys() []string {
|
||||||
|
|
||||||
// Values returns a copy of all values, deduped and sorted, for the given key.
|
// Values returns a copy of all values, deduped and sorted, for the given key.
|
||||||
func (c *Cache) Values(key string) Values {
|
func (c *Cache) Values(key string) Values {
|
||||||
values, needSort := func() (Values, bool) {
|
|
||||||
c.mu.RLock()
|
|
||||||
defer c.mu.RUnlock()
|
|
||||||
e := c.store[key]
|
|
||||||
if e == nil {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
if e.needSort {
|
|
||||||
return nil, true
|
|
||||||
}
|
|
||||||
|
|
||||||
return e.values[0:len(e.values)], false
|
|
||||||
}()
|
|
||||||
|
|
||||||
// the values in the entry require a sort, do so with a write lock so
|
|
||||||
// we can sort once and set everything in order
|
|
||||||
if needSort {
|
|
||||||
values = func() Values {
|
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
|
@ -206,13 +187,14 @@ func (c *Cache) Values(key string) Values {
|
||||||
if e == nil {
|
if e == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if e.needSort {
|
||||||
e.values = e.values.Deduplicate()
|
e.values = e.values.Deduplicate()
|
||||||
e.needSort = false
|
e.needSort = false
|
||||||
|
|
||||||
return e.values[0:len(e.values)]
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
values := make(Values, len(e.values))
|
||||||
|
copy(values, e.values)
|
||||||
|
|
||||||
return values
|
return values
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue