From eef6f45e09312afd3243e02836452139de34a69f Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sat, 29 Jun 2013 13:48:13 -0700 Subject: [PATCH] add ttl to response --- store/store.go | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/store/store.go b/store/store.go index 120adb4f4..de922c95e 100644 --- a/store/store.go +++ b/store/store.go @@ -46,8 +46,8 @@ type Node struct { type Response struct { Action int `json:"action"` Key string `json:"key"` - OldValue string `json:"oldValue"` - NewValue string `json:"newValue"` + PrevValue string `json:"prevValue"` + Value string `json:"Value"` // if the key existed before the action, this field should be true // if the key did not exist before the action, this field should be false @@ -55,6 +55,9 @@ type Response struct { Expiration time.Time `json:"expiration"` + // countdown until expiration in seconds + TTL int64 `json:"TTL"` + Index uint64 `json:"index"` } @@ -99,9 +102,19 @@ func Set(key string, value string, expireTime time.Time, index uint64) ([]byte, return Delete(key, index) } + var TTL int64 + // update ttl + if isExpire { + TTL = int64(expireTime.Sub(time.Now()) / time.Second) + } else { + TTL = -1 + } + // get the node node, ok := s.Nodes[key] + + if ok { // if node is not permanent before // update its expireTime @@ -116,12 +129,13 @@ func Set(key string, value string, expireTime time.Time, index uint64) ([]byte, node.update = make(chan time.Time) go expire(key, node.update, expireTime) } + } // update the information of the node s.Nodes[key] = Node{value, expireTime, node.update} - resp := Response{SET, key, node.Value, value, true, expireTime, index} + resp := Response{SET, key, node.Value, value, true, expireTime, TTL, index} msg, err := json.Marshal(resp) @@ -135,7 +149,7 @@ func Set(key string, value string, expireTime time.Time, index uint64) ([]byte, return msg, err - // add new node + // add new node } else { update := make(chan time.Time) @@ -146,7 +160,7 @@ func Set(key string, value string, expireTime time.Time, index uint64) ([]byte, go expire(key, update, expireTime) } - resp := Response{SET, key, "", value, false, expireTime, index} + resp := Response{SET, key, "", value, false, expireTime, TTL, index} msg, err := json.Marshal(resp) @@ -178,7 +192,7 @@ func expire(key string, update chan time.Time, expireTime time.Time) { delete(s.Nodes, key) - resp := Response{DELETE, key, node.Value, "", true, node.ExpireTime, s.index} + resp := Response{DELETE, key, node.Value, "", true, node.ExpireTime, 0, s.index} msg, err := json.Marshal(resp) @@ -215,9 +229,21 @@ func Get(key string) Response { node, ok := s.Nodes[key] if ok { - return Response{GET, key, node.Value, node.Value, true, node.ExpireTime, s.index} + var TTL int64 + var isExpire bool = false + + isExpire = !node.ExpireTime.Equal(PERMANENT) + + // update ttl + if isExpire { + TTL = int64(node.ExpireTime.Sub(time.Now()) / time.Second) + } else { + TTL = -1 + } + + return Response{GET, key, node.Value, node.Value, true, node.ExpireTime, TTL, s.index} } else { - return Response{GET, key, "", "", false, time.Unix(0, 0), s.index} + return Response{GET, key, "", "", false, time.Unix(0, 0), 0, s.index} } } @@ -244,7 +270,7 @@ func Delete(key string, index uint64) ([]byte, error) { } - resp := Response{DELETE, key, node.Value, "", true, node.ExpireTime, index} + resp := Response{DELETE, key, node.Value, "", true, node.ExpireTime, 0, index} msg, err := json.Marshal(resp) @@ -260,7 +286,7 @@ func Delete(key string, index uint64) ([]byte, error) { } else { - return json.Marshal(Response{DELETE, key, "", "", false, time.Unix(0, 0), index}) + return json.Marshal(Response{DELETE, key, "", "", false, time.Unix(0, 0), 0, index}) } }