-
Notifications
You must be signed in to change notification settings - Fork 0
/
options.go
129 lines (105 loc) · 2.48 KB
/
options.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
127
128
129
package cqkv
import (
"github.com/cqkv/cqkv/codec"
"github.com/cqkv/cqkv/fio"
"github.com/cqkv/cqkv/keydir"
"os"
)
type options struct {
dirPath string
dataFileSize int64
// syncFre indicate the frequency to sync
syncFre int64
ioManagerCreator func(filePath string) (fio.IOManager, error)
fileLock fio.FileLocker
codec codec.Codec
keydir keydir.Keydir
keydirType string
btreeDegree int
fastOpen bool
}
func newDefaultOptions() *options {
return &options{
dirPath: os.TempDir(),
dataFileSize: 1024 * 1024 * 256, // 256mb
syncFre: 1024,
ioManagerCreator: defaultIOManagerCreator,
codec: codec.NewCodecImpl(),
keydir: keydir.NewBTree(32),
keydirType: keydir.BtreeTypeKeydir,
btreeDegree: 32,
}
}
//var defaultOptions = &options{}
type Option func(*options)
// WithIOManagerCreator should be used with file lock
func WithIOManagerCreator(fn func(filePath string) (fio.IOManager, error)) Option {
return func(o *options) {
if fn == nil {
panic(ErrNoIOManager)
}
o.ioManagerCreator = fn
}
}
func WithFileLock(lock fio.FileLocker) Option {
return func(o *options) {
o.fileLock = lock
}
}
var defaultIOManagerCreator = func(filePath string) (fio.IOManager, error) {
return fio.NewFIleIO(filePath)
}
func WithDirPath(dirPath string) Option {
return func(o *options) {
o.dirPath = dirPath
}
}
func WithDataFileSize(size int64) Option {
return func(o *options) {
o.dataFileSize = size
}
}
func WithCodec(codec codec.Codec) Option {
return func(o *options) {
o.codec = codec
}
}
func WithBTreeKeydir(degree int) Option {
return func(o *options) {
o.keydir = keydir.NewBTree(degree)
o.keydirType = keydir.BtreeTypeKeydir
o.btreeDegree = degree
}
}
func WithSkipListKeydir() Option {
return func(o *options) {
o.keydir = keydir.NewSkipList()
o.keydirType = keydir.SkipListTypeKeydir
}
}
// WithFastOpen use mmap to reduce open time
func WithFastOpen() Option {
return func(o *options) {
o.fastOpen = true
}
}
type WriteBatchOption func(*writeBatchOptions)
type writeBatchOptions struct {
maxBatchNum int
// sync indicate whether to sync after write
sync bool
}
var defaultWriteBatchOptions = &writeBatchOptions{
maxBatchNum: 1024,
sync: false,
}
func WithMaxBatchNum(num int) WriteBatchOption {
return func(o *writeBatchOptions) {
o.maxBatchNum = num
}
}
func WithSync(sync bool) WriteBatchOption {
return func(o *writeBatchOptions) {
o.sync = sync
}
}