Cache: add method to get a copy of the map
This commit is contained in:
Vendored
+21
-3
@@ -30,6 +30,7 @@ const (
|
|||||||
SET
|
SET
|
||||||
DELETE
|
DELETE
|
||||||
EXPIRE
|
EXPIRE
|
||||||
|
COPY
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -52,15 +53,16 @@ type (
|
|||||||
}
|
}
|
||||||
response struct {
|
response struct {
|
||||||
error
|
error
|
||||||
value interface{}
|
mapCopy map[interface{}]interface{}
|
||||||
|
value interface{}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Cache) IsOld(v *Value) bool {
|
func (c *Cache) IsOld(v *Value) bool {
|
||||||
if c.expiryTime == 0 {
|
if c.expiryTime == time.Duration(0) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if time.Now().Sub(v.atime) > c.expiryTime {
|
if time.Now().Sub(v.ctime) > c.expiryTime {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -118,6 +120,12 @@ func (c *Cache) service() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// no response
|
// no response
|
||||||
|
case COPY:
|
||||||
|
resp.mapCopy = make(map[interface{}]interface{})
|
||||||
|
for k, v := range c.cache {
|
||||||
|
resp.mapCopy[k] = v
|
||||||
|
}
|
||||||
|
req.responseChannel <- resp
|
||||||
default:
|
default:
|
||||||
resp.error = fission.MakeError(fission.ErrorInvalidArgument,
|
resp.error = fission.MakeError(fission.ErrorInvalidArgument,
|
||||||
fmt.Sprintf("invalid request type: %v", req.requestType))
|
fmt.Sprintf("invalid request type: %v", req.requestType))
|
||||||
@@ -160,6 +168,16 @@ func (c *Cache) Delete(key interface{}) error {
|
|||||||
return resp.error
|
return resp.error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Cache) Copy() map[interface{}]interface{} {
|
||||||
|
respChannel := make(chan *response)
|
||||||
|
c.requestChannel <- &request{
|
||||||
|
requestType: COPY,
|
||||||
|
responseChannel: respChannel,
|
||||||
|
}
|
||||||
|
resp := <-respChannel
|
||||||
|
return resp.mapCopy
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Cache) expiryService() {
|
func (c *Cache) expiryService() {
|
||||||
for {
|
for {
|
||||||
time.Sleep(time.Minute)
|
time.Sleep(time.Minute)
|
||||||
|
|||||||
Vendored
+7
@@ -31,6 +31,8 @@ func TestCache(t *testing.T) {
|
|||||||
|
|
||||||
err := c.Set("a", "b")
|
err := c.Set("a", "b")
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
|
err = c.Set("p", "q")
|
||||||
|
checkErr(err)
|
||||||
|
|
||||||
val, err := c.Get("a")
|
val, err := c.Get("a")
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
@@ -38,6 +40,11 @@ func TestCache(t *testing.T) {
|
|||||||
log.Panicf("value %v", val)
|
log.Panicf("value %v", val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc := c.Copy()
|
||||||
|
if len(cc) != 2 {
|
||||||
|
log.Panicf("expected 2 items")
|
||||||
|
}
|
||||||
|
|
||||||
err = c.Delete("a")
|
err = c.Delete("a")
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user