diff --git a/cache/cache.go b/cache/cache.go index c327c3fa..cc9d37b4 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -30,6 +30,7 @@ const ( SET DELETE EXPIRE + COPY ) type ( @@ -52,15 +53,16 @@ type ( } response struct { error - value interface{} + mapCopy map[interface{}]interface{} + value interface{} } ) func (c *Cache) IsOld(v *Value) bool { - if c.expiryTime == 0 { + if c.expiryTime == time.Duration(0) { return false } - if time.Now().Sub(v.atime) > c.expiryTime { + if time.Now().Sub(v.ctime) > c.expiryTime { return true } return false @@ -118,6 +120,12 @@ func (c *Cache) service() { } } // no response + case COPY: + resp.mapCopy = make(map[interface{}]interface{}) + for k, v := range c.cache { + resp.mapCopy[k] = v + } + req.responseChannel <- resp default: resp.error = fission.MakeError(fission.ErrorInvalidArgument, fmt.Sprintf("invalid request type: %v", req.requestType)) @@ -160,6 +168,16 @@ func (c *Cache) Delete(key interface{}) 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() { for { time.Sleep(time.Minute) diff --git a/cache/cache_test.go b/cache/cache_test.go index fc4baa36..e307feed 100644 --- a/cache/cache_test.go +++ b/cache/cache_test.go @@ -31,6 +31,8 @@ func TestCache(t *testing.T) { err := c.Set("a", "b") checkErr(err) + err = c.Set("p", "q") + checkErr(err) val, err := c.Get("a") checkErr(err) @@ -38,6 +40,11 @@ func TestCache(t *testing.T) { log.Panicf("value %v", val) } + cc := c.Copy() + if len(cc) != 2 { + log.Panicf("expected 2 items") + } + err = c.Delete("a") checkErr(err)