Dmitrii Stepanov
b142b6f48e
FSTree file counter used by writecache. As writecache has now only one storage, so it is required to use real object size to get writecache size more accurate than `count * max_object_size`. Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
171 lines
4.3 KiB
Go
171 lines
4.3 KiB
Go
package writecache
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Option represents write-cache configuration option.
|
|
type Option func(*options)
|
|
|
|
type options struct {
|
|
log *logger.Logger
|
|
// path is a path to a directory for write-cache.
|
|
path string
|
|
// blobstor is the main persistent storage.
|
|
blobstor MainStorage
|
|
// metabase is the metabase instance.
|
|
metabase Metabase
|
|
// maxObjectSize is the maximum size of the object stored in the write-cache.
|
|
maxObjectSize uint64
|
|
// smallObjectSize is the maximum size of the object stored in the database.
|
|
smallObjectSize uint64
|
|
// workersCount is the number of workers flushing objects in parallel.
|
|
workersCount int
|
|
// maxCacheSize is the maximum total size of all objects saved in cache (DB + FS).
|
|
// 1 GiB by default.
|
|
maxCacheSize uint64
|
|
// maxCacheCount is the maximum total count of all object saved in cache.
|
|
// 0 (no limit) by default.
|
|
maxCacheCount uint64
|
|
// maxBatchSize is the maximum batch size for the small object database.
|
|
maxBatchSize int
|
|
// maxBatchDelay is the maximum batch wait time for the small object database.
|
|
maxBatchDelay time.Duration
|
|
// noSync is true iff FSTree allows unsynchronized writes.
|
|
noSync bool
|
|
// reportError is the function called when encountering disk errors in background workers.
|
|
reportError func(string, error)
|
|
// metrics is metrics implementation
|
|
metrics Metrics
|
|
// disableBackgroundFlush is for testing purposes only.
|
|
disableBackgroundFlush bool
|
|
// pageSize is bbolt's page size config value
|
|
pageSize int
|
|
}
|
|
|
|
// WithLogger sets logger.
|
|
func WithLogger(log *logger.Logger) Option {
|
|
return func(o *options) {
|
|
o.log = &logger.Logger{Logger: log.With(zap.String("component", "WriteCache"))}
|
|
}
|
|
}
|
|
|
|
// WithPath sets path to writecache db.
|
|
func WithPath(path string) Option {
|
|
return func(o *options) {
|
|
o.path = path
|
|
}
|
|
}
|
|
|
|
// WithBlobstor sets main object storage.
|
|
func WithBlobstor(bs MainStorage) Option {
|
|
return func(o *options) {
|
|
o.blobstor = bs
|
|
}
|
|
}
|
|
|
|
// WithMetabase sets metabase.
|
|
func WithMetabase(db Metabase) Option {
|
|
return func(o *options) {
|
|
o.metabase = db
|
|
}
|
|
}
|
|
|
|
// WithMaxObjectSize sets maximum object size to be stored in write-cache.
|
|
func WithMaxObjectSize(sz uint64) Option {
|
|
return func(o *options) {
|
|
if sz > 0 {
|
|
o.maxObjectSize = sz
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithSmallObjectSize sets maximum object size to be stored in write-cache.
|
|
func WithSmallObjectSize(sz uint64) Option {
|
|
return func(o *options) {
|
|
if sz > 0 {
|
|
o.smallObjectSize = sz
|
|
}
|
|
}
|
|
}
|
|
|
|
func WithFlushWorkersCount(c int) Option {
|
|
return func(o *options) {
|
|
if c > 0 {
|
|
o.workersCount = c
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithMaxCacheSize sets maximum write-cache size in bytes.
|
|
func WithMaxCacheSize(sz uint64) Option {
|
|
return func(o *options) {
|
|
o.maxCacheSize = sz
|
|
}
|
|
}
|
|
|
|
// WithMaxCacheCount sets maximum write-cache objects count.
|
|
func WithMaxCacheCount(v uint64) Option {
|
|
return func(o *options) {
|
|
o.maxCacheCount = v
|
|
}
|
|
}
|
|
|
|
// WithMaxBatchSize sets max batch size for the small object database.
|
|
func WithMaxBatchSize(sz int) Option {
|
|
return func(o *options) {
|
|
if sz > 0 {
|
|
o.maxBatchSize = sz
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithMaxBatchDelay sets max batch delay for the small object database.
|
|
func WithMaxBatchDelay(d time.Duration) Option {
|
|
return func(o *options) {
|
|
if d > 0 {
|
|
o.maxBatchDelay = d
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithNoSync sets an option to allow returning to caller on PUT before write is persisted.
|
|
// Note, that we use this flag for FSTree only and DO NOT use it for a bolt DB because
|
|
// we cannot yet properly handle the corrupted database during the startup. This SHOULD NOT
|
|
// be relied upon and may be changed in future.
|
|
func WithNoSync(noSync bool) Option {
|
|
return func(o *options) {
|
|
o.noSync = noSync
|
|
}
|
|
}
|
|
|
|
// WithReportErrorFunc sets error reporting function.
|
|
func WithReportErrorFunc(f func(string, error)) Option {
|
|
return func(o *options) {
|
|
o.reportError = f
|
|
}
|
|
}
|
|
|
|
// WithMetrics sets metrics implementation.
|
|
func WithMetrics(metrics Metrics) Option {
|
|
return func(o *options) {
|
|
o.metrics = metrics
|
|
}
|
|
}
|
|
|
|
// WithDisableBackgroundFlush disables background flush, for testing purposes only.
|
|
func WithDisableBackgroundFlush() Option {
|
|
return func(o *options) {
|
|
o.disableBackgroundFlush = true
|
|
}
|
|
}
|
|
|
|
// WithPageSize sets bbolt's page size.
|
|
func WithPageSize(s int) Option {
|
|
return func(o *options) {
|
|
o.pageSize = s
|
|
}
|
|
}
|