forked from TrueCloudLab/frostfs-node
129 lines
3.5 KiB
Go
129 lines
3.5 KiB
Go
package writecachebadger
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common"
|
|
meta "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
|
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Option represents write-cache configuration option.
|
|
type Option func(*options)
|
|
|
|
// meta is an interface for a metabase.
|
|
type metabase interface {
|
|
Exists(context.Context, meta.ExistsPrm) (meta.ExistsRes, error)
|
|
StorageID(context.Context, meta.StorageIDPrm) (meta.StorageIDRes, error)
|
|
UpdateStorageID(meta.UpdateStorageIDPrm) (meta.UpdateStorageIDRes, error)
|
|
}
|
|
|
|
// blob is an interface for the blobstor.
|
|
type blob interface {
|
|
Put(context.Context, common.PutPrm) (common.PutRes, error)
|
|
NeedsCompression(obj *objectSDK.Object) bool
|
|
Exists(ctx context.Context, res common.ExistsPrm) (common.ExistsRes, error)
|
|
}
|
|
|
|
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 blob
|
|
// metabase is the metabase instance.
|
|
metabase metabase
|
|
// maxObjectSize is the maximum size of the object stored in the write-cache.
|
|
maxObjectSize 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
|
|
// objCounters contains atomic counters for the number of objects stored in cache.
|
|
objCounters counters
|
|
// reportError is the function called when encountering disk errors in background workers.
|
|
reportError func(string, error)
|
|
// metrics is metrics implementation
|
|
metrics writecache.Metrics
|
|
// gcInterval is the interval duration to run the GC cycle.
|
|
gcInterval time.Duration
|
|
}
|
|
|
|
// 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 *blobstor.BlobStor) Option {
|
|
return func(o *options) {
|
|
o.blobstor = bs
|
|
}
|
|
}
|
|
|
|
// WithMetabase sets metabase.
|
|
func WithMetabase(db *meta.DB) 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
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|
|
|
|
// 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 writecache.Metrics) Option {
|
|
return func(o *options) {
|
|
o.metrics = metrics
|
|
}
|
|
}
|
|
|
|
// WithGCInterval sets the duration of the interval to run GC cycles.
|
|
func WithGCInterval(d time.Duration) Option {
|
|
return func(o *options) {
|
|
o.gcInterval = d
|
|
}
|
|
}
|