-
Notifications
You must be signed in to change notification settings - Fork 1
/
kv.go
80 lines (61 loc) · 1.29 KB
/
kv.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package bitcask
import "sync"
// keyDirsLock for HashMap
var keyDirsLock *sync.RWMutex
var keyDirs *KeyDirs
var keyDirsOnce sync.Once
func init() {
keyDirsLock = &sync.RWMutex{}
}
type KeyDirs struct {
entrys map[string]*entry
dirName string
}
func NewKeyDir(dirName string) *KeyDirs {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
keyDirsOnce.Do(func() {
if keyDirs == nil {
keyDirs = &KeyDirs{
entrys: map[string]*entry{},
dirName: dirName,
}
}
})
return keyDirs
}
func (k *KeyDirs) get(key string) (*entry, bool) {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
e, ex := k.entrys[key]
return e, ex
}
func (k *KeyDirs) del(key string) {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
delete(k.entrys, key)
}
func (k *KeyDirs) set(key string, e *entry) {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
k.entrys[key] = e
}
func (k *KeyDirs) setCompare(key string, e *entry) bool {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
old, ex := k.entrys[key]
if !ex || e.isNewerThan1(old) { // 如果是旧的 或者不存在 就更新
k.entrys[key] = e
return true
}
return false
}
func (k *KeyDirs) updateFileID(oldID, newID uint32) {
keyDirsLock.Lock()
defer keyDirsLock.Unlock()
for _, e := range k.entrys {
if e.fileID == oldID {
e.fileID = newID
}
}
}