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 // 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 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 } } // 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 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 } }