-
Notifications
You must be signed in to change notification settings - Fork 336
/
options.go
258 lines (204 loc) · 6.35 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
// Copyright 2019 The nutsdb Author. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package nutsdb
import "time"
// EntryIdxMode represents entry index mode.
type EntryIdxMode int
const (
// HintKeyValAndRAMIdxMode represents ram index (key and value) mode.
HintKeyValAndRAMIdxMode EntryIdxMode = iota
// HintKeyAndRAMIdxMode represents ram index (only key) mode.
HintKeyAndRAMIdxMode
)
type ExpiredDeleteType uint8
const (
// TimeWheel represents use time wheel to do expired deletion
TimeWheel ExpiredDeleteType = iota
// TimeHeap represents use time heap to do expired deletion
TimeHeap
)
// An ErrorHandler handles an error occurred during transaction.
type ErrorHandler interface {
HandleError(err error)
}
// The ErrorHandlerFunc type is an adapter to ErrorHandler.
type ErrorHandlerFunc func(err error)
func (fn ErrorHandlerFunc) HandleError(err error) {
fn(err)
}
type LessFunc func(l, r string) bool
// Options records params for creating DB object.
type Options struct {
// Dir represents Open the database located in which dir.
Dir string
// EntryIdxMode represents using which mode to index the entries.
EntryIdxMode EntryIdxMode
// RWMode represents the read and write mode.
// RWMode includes two options: FileIO and MMap.
// FileIO represents the read and write mode using standard I/O.
// MMap represents the read and write mode using mmap.
RWMode RWMode
SegmentSize int64
// NodeNum represents the node number.
// Default NodeNum is 1. NodeNum range [1,1023].
NodeNum int64
// SyncEnable represents if call Sync() function.
// if SyncEnable is false, high write performance but potential data loss likely.
// if SyncEnable is true, slower but persistent.
SyncEnable bool
// MaxFdNumsInCache represents the max numbers of fd in cache.
MaxFdNumsInCache int
// CleanFdsCacheThreshold represents the maximum threshold for recycling fd, it should be between 0 and 1.
CleanFdsCacheThreshold float64
// BufferSizeOfRecovery represents the buffer size of recoveryReader buffer Size
BufferSizeOfRecovery int
// CcWhenClose represent initiative GC when calling db.Close()
GCWhenClose bool
// CommitBufferSize represent allocated memory for tx
CommitBufferSize int64
// ErrorHandler handles an error occurred during transaction.
// Example:
// func triggerAlertError(err error) {
// if errors.Is(err, targetErr) {
// alertManager.TriggerAlert()
// }
// })
ErrorHandler ErrorHandler
// LessFunc is a function that sorts keys.
LessFunc LessFunc
// MergeInterval represent the interval for automatic merges, with 0 meaning automatic merging is disabled.
MergeInterval time.Duration
// MaxBatchCount represents max entries in batch
MaxBatchCount int64
// MaxBatchSize represents max batch size in bytes
MaxBatchSize int64
// ExpiredDeleteType represents the data structure used for expired deletion
// TimeWheel means use the time wheel, You can use it when you need high performance or low memory usage
// TimeHeap means use the time heap, You can use it when you need to delete precisely or memory usage will be high
ExpiredDeleteType ExpiredDeleteType
// max write record num
MaxWriteRecordCount int64
// cache size for HintKeyAndRAMIdxMode
HintKeyAndRAMIdxCacheSize int
}
const (
B = 1
KB = 1024 * B
MB = 1024 * KB
GB = 1024 * MB
)
// defaultSegmentSize is default data file size.
var defaultSegmentSize int64 = 256 * MB
// DefaultOptions represents the default options.
var DefaultOptions = func() Options {
return Options{
EntryIdxMode: HintKeyValAndRAMIdxMode,
SegmentSize: defaultSegmentSize,
NodeNum: 1,
RWMode: FileIO,
SyncEnable: true,
CommitBufferSize: 4 * MB,
MergeInterval: 2 * time.Hour,
MaxBatchSize: (15 * defaultSegmentSize / 4) / 100,
MaxBatchCount: (15 * defaultSegmentSize / 4) / 100 / 100,
HintKeyAndRAMIdxCacheSize: 0,
ExpiredDeleteType: TimeWheel,
}
}()
type Option func(*Options)
func WithDir(dir string) Option {
return func(opt *Options) {
opt.Dir = dir
}
}
func WithEntryIdxMode(entryIdxMode EntryIdxMode) Option {
return func(opt *Options) {
opt.EntryIdxMode = entryIdxMode
}
}
func WithRWMode(rwMode RWMode) Option {
return func(opt *Options) {
opt.RWMode = rwMode
}
}
func WithSegmentSize(size int64) Option {
return func(opt *Options) {
opt.SegmentSize = size
}
}
func WithMaxBatchCount(count int64) Option {
return func(opt *Options) {
opt.MaxBatchCount = count
}
}
func WithHintKeyAndRAMIdxCacheSize(size int) Option {
return func(opt *Options) {
opt.HintKeyAndRAMIdxCacheSize = size
}
}
func WithMaxBatchSize(size int64) Option {
return func(opt *Options) {
opt.MaxBatchSize = size
}
}
func WithNodeNum(num int64) Option {
return func(opt *Options) {
opt.NodeNum = num
}
}
func WithSyncEnable(enable bool) Option {
return func(opt *Options) {
opt.SyncEnable = enable
}
}
func WithMaxFdNumsInCache(num int) Option {
return func(opt *Options) {
opt.MaxFdNumsInCache = num
}
}
func WithCleanFdsCacheThreshold(threshold float64) Option {
return func(opt *Options) {
opt.CleanFdsCacheThreshold = threshold
}
}
func WithBufferSizeOfRecovery(size int) Option {
return func(opt *Options) {
opt.BufferSizeOfRecovery = size
}
}
func WithGCWhenClose(enable bool) Option {
return func(opt *Options) {
opt.GCWhenClose = enable
}
}
func WithErrorHandler(errorHandler ErrorHandler) Option {
return func(opt *Options) {
opt.ErrorHandler = errorHandler
}
}
func WithCommitBufferSize(commitBufferSize int64) Option {
return func(opt *Options) {
opt.CommitBufferSize = commitBufferSize
}
}
func WithLessFunc(lessFunc LessFunc) Option {
return func(opt *Options) {
opt.LessFunc = lessFunc
}
}
func WithMaxWriteRecordCount(maxWriteRecordCount int64) Option {
return func(opt *Options) {
opt.MaxWriteRecordCount = maxWriteRecordCount
}
}