-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnvm.go
126 lines (107 loc) · 3.09 KB
/
nvm.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package nvm
import (
"encoding/json"
"github.com/Yiling-J/theine-nvm/internal"
)
type Serializer[T any] interface {
Marshal(v T) ([]byte, error)
Unmarshal(raw []byte, v *T) error
}
type JsonSerializer[T any] struct{}
func (s *JsonSerializer[T]) Marshal(v T) ([]byte, error) {
return json.Marshal(v)
}
func (s *JsonSerializer[T]) Unmarshal(raw []byte, v *T) error {
return json.Unmarshal(raw, v)
}
type NvmBuilder[K comparable, V any] struct {
file string
cacheSize int
blockSize int
bucketSize int
regionSize int
maxItemSize int
cleanRegionSize int
bhPct int
bfSize int
errorHandler func(err error)
keySerializer Serializer[K]
valueSerializer Serializer[V]
}
func NewNvmBuilder[K comparable, V any](file string, cacheSize int) *NvmBuilder[K, V] {
return &NvmBuilder[K, V]{
file: file,
cacheSize: cacheSize,
blockSize: 4096,
regionSize: 16 << 20, // 16mb
cleanRegionSize: 3,
bucketSize: 4 << 10, // 4kb
bhPct: 10, // 10%
bfSize: 8, // 8 bytes bloomfilter
errorHandler: func(err error) {},
}
}
// Device block size in bytes (minimum IO granularity).
func (b *NvmBuilder[K, V]) BlockSize(size int) *NvmBuilder[K, V] {
b.blockSize = size
return b
}
// Block cache Region size in bytes.
func (b *NvmBuilder[K, V]) RegionSize(size int) *NvmBuilder[K, V] {
b.regionSize = size
return b
}
// Big hash bucket size in bytes.
func (b *NvmBuilder[K, V]) BucketSize(size int) *NvmBuilder[K, V] {
b.bucketSize = size
return b
}
// Percentage of space to reserve for BigHash. Set the percentage > 0 to enable BigHash.
// Set percentage to 100 to disable block cache.
func (b *NvmBuilder[K, V]) BigHashPct(pct int) *NvmBuilder[K, V] {
b.bhPct = pct
return b
}
// Maximum size of a small item to be stored in BigHash. Must be less than the bucket size.
func (b *NvmBuilder[K, V]) BigHashMaxItemSize(size int) *NvmBuilder[K, V] {
b.maxItemSize = size
return b
}
// Block cache clean region size.
func (b *NvmBuilder[K, V]) CleanRegionSize(size int) *NvmBuilder[K, V] {
b.cleanRegionSize = size
return b
}
// Nvm cache error handler.
func (b *NvmBuilder[K, V]) ErrorHandler(fn func(err error)) *NvmBuilder[K, V] {
b.errorHandler = fn
return b
}
// Nvm cache key serializer.
func (b *NvmBuilder[K, V]) KeySerializer(s Serializer[K]) *NvmBuilder[K, V] {
b.keySerializer = s
return b
}
// Nvm cache value serializer.
func (b *NvmBuilder[K, V]) ValueSerializer(s Serializer[V]) *NvmBuilder[K, V] {
b.valueSerializer = s
return b
}
func (b *NvmBuilder[K, V]) BucketBfSize(size int) *NvmBuilder[K, V] {
b.bfSize = size
return b
}
// Build cache.
func (b *NvmBuilder[K, V]) Build() (*internal.NvmStore[K, V], error) {
if b.keySerializer == nil {
b.keySerializer = &JsonSerializer[K]{}
}
if b.valueSerializer == nil {
b.valueSerializer = &JsonSerializer[V]{}
}
return internal.NewNvmStore[K, V](
b.file, b.blockSize, b.cacheSize, b.bucketSize,
b.regionSize, b.cleanRegionSize, uint8(b.bhPct), b.maxItemSize, b.bfSize, b.errorHandler,
b.keySerializer, b.valueSerializer,
)
}