diff --git a/data/store/memory/memory.go b/data/store/memory/memory.go index 0e06eefa..bb7892e8 100644 --- a/data/store/memory/memory.go +++ b/data/store/memory/memory.go @@ -32,10 +32,16 @@ func (m *memoryStore) Dump() ([]*store.Record, error) { d := v.r.Expiry t := time.Since(v.c) - // expired - if d > time.Duration(0) && t > d { - continue + if d > time.Duration(0) { + // expired + if t > d { + continue + } + // update expiry + v.r.Expiry -= t + v.c = time.Now() } + values = append(values, v.r) } @@ -56,8 +62,13 @@ func (m *memoryStore) Read(key string) (*store.Record, error) { t := time.Since(v.c) // expired - if d > time.Duration(0) && t > d { - return nil, store.ErrNotFound + if d > time.Duration(0) { + if t > d { + return nil, store.ErrNotFound + } + // update expiry + v.r.Expiry -= t + v.c = time.Now() } return v.r, nil diff --git a/data/store/memory/memory_test.go b/data/store/memory/memory_test.go new file mode 100644 index 00000000..44483869 --- /dev/null +++ b/data/store/memory/memory_test.go @@ -0,0 +1,37 @@ +package memory + +import ( + "testing" + "time" + + "github.com/micro/go-micro/data/store" +) + +func TestReadRecordExpire(t *testing.T) { + s := NewStore() + + var ( + key = "foo" + expire = 100 * time.Millisecond + ) + rec := &store.Record{ + Key: key, + Value: nil, + Expiry: expire, + } + s.Write(rec) + + rrec, err := s.Read(key) + if err != nil { + t.Fatal(err) + } + if rrec.Expiry >= expire { + t.Fatal("expiry of read record is not changed") + } + + time.Sleep(expire) + + if _, err := s.Read(key); err != store.ErrNotFound { + t.Fatal("expire elapsed, but key still accessable") + } +}