-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathiMemTable.go
50 lines (43 loc) · 1003 Bytes
/
iMemTable.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
package lsm
import (
"github.com/huiming23344/lsm/kv"
"sync"
)
type ReadOnlyMemTables struct {
// 只读内存表
readonlyTable []*MemTable
lock *sync.RWMutex
}
func (r *ReadOnlyMemTables) Init() {
r.readonlyTable = make([]*MemTable, 0)
r.lock = &sync.RWMutex{}
}
func (r *ReadOnlyMemTables) Getlen() int {
r.lock.Lock()
r.lock.Unlock()
return len(r.readonlyTable)
}
func (r *ReadOnlyMemTables) AddTable(table *MemTable) {
r.lock.Lock()
r.readonlyTable = append(r.readonlyTable, table)
r.lock.Unlock()
}
func (r *ReadOnlyMemTables) GetTable() *MemTable {
r.lock.Lock()
defer r.lock.Unlock()
table := r.readonlyTable[0]
r.readonlyTable = r.readonlyTable[1:]
return table
}
func (r *ReadOnlyMemTables) Search(key string) (kv.Value, kv.SearchResult) {
r.lock.RLock()
defer r.lock.RUnlock()
for _, table := range r.readonlyTable {
value, result := table.Search(key)
if result == kv.Success {
return value, result
}
}
var nilV kv.Value
return nilV, kv.None
}