From 9ad8c853434b9ea8a11e34b33caf4e547633e3fd Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sun, 16 Jun 2013 15:51:00 -0700 Subject: [PATCH] recovery check experiation --- store.go | 30 ++++++++++++++++++++++++++---- store_test.go | 14 +++++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/store.go b/store.go index bb553df0c..e81743df2 100644 --- a/store.go +++ b/store.go @@ -20,9 +20,9 @@ type Store struct { } type Node struct { - Value string - ExpireTime time.Time - update chan time.Time + Value string `json:"value"` + ExpireTime time.Time `json:"expireTime"` + update chan time.Time `json:"-"` } type Response struct { @@ -151,6 +151,7 @@ func (s *Store) Delete(key string) Response { func (s *Store) Save() ([]byte, error) { b, err := json.Marshal(s) if err != nil { + fmt.Println(err) return nil, err } return b, nil @@ -159,5 +160,26 @@ func (s *Store) Save() ([]byte, error) { // recovery the state of the stroage system from a previous state func (s *Store) Recovery(state []byte) error { err := json.Unmarshal(state, s) + s.clean() return err -} \ No newline at end of file +} + +// clean all expired keys +func (s *Store) clean() { + for key, node := range s.Nodes{ + // stable node + if node.ExpireTime.Equal(time.Unix(0,0)) { + continue + } else { + if node.ExpireTime.Sub(time.Now()) >= time.Second { + node.update = make(chan time.Time) + go s.expire(key, node.update, node.ExpireTime) + } else { + // we should delete this node + delete(s.Nodes, key) + } + } + + } +} + diff --git a/store_test.go b/store_test.go index 6d1f77e10..1655e0024 100644 --- a/store_test.go +++ b/store_test.go @@ -27,7 +27,7 @@ func TestStoreGet(t *testing.T) { func TestSaveAndRecovery(t *testing.T) { s.Set("foo", "bar", time.Unix(0, 0)) - + s.Set("foo2", "bar2", time.Now().Add(time.Second * 5)) state, err := s.Save() if err != nil { @@ -35,6 +35,10 @@ func TestSaveAndRecovery(t *testing.T) { } newStore := createStore() + + // wait for foo2 expires + time.Sleep(time.Second * 6) + newStore.Recovery(state) res := newStore.Get("foo") @@ -42,6 +46,14 @@ func TestSaveAndRecovery(t *testing.T) { if res.OldValue != "bar" { t.Fatalf("Cannot recovery") } + + res = newStore.Get("foo2") + + if res.Exist { + t.Fatalf("Get expired value") + } + + s.Delete("foo") }