traverse also record the key and add sorted traverse

This commit is contained in:
Xiang Li 2013-07-04 13:50:37 -07:00
parent 547ad6ee3b
commit b02a7d8bb4
3 changed files with 67 additions and 32 deletions

View File

@ -375,30 +375,14 @@ func (s *Store) Recovery(state []byte) error {
// clean all expired keys
func clean() {
for key, node := range s.Nodes {
if node.ExpireTime.Equal(PERMANENT) {
continue
} else {
if node.ExpireTime.Sub(time.Now()) >= time.Second {
node.update = make(chan time.Time)
go expire(key, node.update, node.ExpireTime)
} else {
// we should delete this node
delete(s.Nodes, key)
}
}
}
s.Tree.traverse(cleanNode, false)
}
func delteOldNode(t *TreeNode) {
func cleanNode(key string, node *Node) {
if node.ExpireTime.Equal(PERMANENT) {
continue
return
} else {
if node.ExpireTime.Sub(time.Now()) >= time.Second {
@ -406,8 +390,8 @@ func delteOldNode(t *TreeNode) {
go expire(key, node.update, node.ExpireTime)
} else {
// we should delete this node
delete(s.Nodes, key)
// we should delete this node
s.Tree.delete(key)
}
}
}

View File

@ -3,6 +3,7 @@ package store
import (
"path"
"strings"
"sort"
)
type tree struct {
@ -19,6 +20,19 @@ type treeNode struct {
}
type tnWithKey struct{
key string
tn *treeNode
}
type tnWithKeySlice []tnWithKey
func (s tnWithKeySlice) Len() int { return len(s) }
func (s tnWithKeySlice) Less(i, j int) bool { return s[i].key < s[j].key }
func (s tnWithKeySlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
var emptyNode = Node{".", PERMANENT, nil}
// set the key to value, return the old value if the key exists
@ -141,16 +155,52 @@ func (s *tree) delete(key string) bool {
return false
}
func (t *tree) traverse(f func(*treeNode)) {
dfs(t.Root, f)
func (t *tree) traverse(f func(string, *Node), sort bool) {
if sort {
sortDfs("", t.Root, f)
} else {
dfs("", t.Root, f)
}
}
func dfs(t *treeNode, f func(*treeNode)) {
func dfs(key string, t *treeNode, f func(string, *Node)) {
// base case
if len(t.NodeMap) == 0{
f(t)
f(key, &t.Value)
// recursion
} else {
for _, _treeNode := range t.NodeMap {
dfs(_treeNode, f)
for nodeKey, _treeNode := range t.NodeMap {
newKey := key + "/" + nodeKey
dfs(newKey, _treeNode, f)
}
}
}
func sortDfs(key string, t *treeNode, f func(string, *Node)) {
// base case
if len(t.NodeMap) == 0{
f(key, &t.Value)
// recursion
} else {
s := make(tnWithKeySlice, len(t.NodeMap))
i := 0
// copy
for nodeKey, _treeNode := range t.NodeMap {
newKey := key + "/" + nodeKey
s[i] = tnWithKey{newKey, _treeNode}
i++
}
// sort
sort.Sort(s)
// traverse
for i = 0; i < len(t.NodeMap); i++ {
sortDfs(s[i].key, s[i].tn, f)
}
}
}

View File

@ -66,25 +66,26 @@ func TestStoreGet(t *testing.T) {
key := "/"
depth := rand.Intn(10)
for j := 0; j < depth; j++ {
key += "/" + strconv.Itoa(rand.Int())
key += "/" + strconv.Itoa(rand.Int()%10)
}
value := strconv.Itoa(rand.Int())
ts.set(key, CreateTestNode(value))
treeNode, ok := ts.get(key)
if !ok {
t.Fatalf("Expect to get node, but not")
continue
//t.Fatalf("Expect to get node, but not")
}
if treeNode.Value != value {
t.Fatalf("Expect value %s, but got %s", value, treeNode.Value)
}
}
ts.traverse(f)
ts.traverse(f, true)
}
func f (t *treeNode) {
fmt.Println(t.Value.Value)
func f (key string, n *Node) {
fmt.Println(key, "=", n.Value)
}
func CreateTestNode(value string) Node{