2023-12-22 09:58:20 +00:00
|
|
|
package writecache
|
2021-04-06 10:56:06 +00:00
|
|
|
|
|
|
|
import (
|
2024-10-21 13:27:28 +00:00
|
|
|
"context"
|
|
|
|
|
2023-03-07 13:38:26 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
|
2021-04-06 10:56:06 +00:00
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Option represents write-cache configuration option.
|
|
|
|
type Option func(*options)
|
|
|
|
|
|
|
|
type options struct {
|
2022-09-28 07:41:01 +00:00
|
|
|
log *logger.Logger
|
2021-04-06 10:56:06 +00:00
|
|
|
// path is a path to a directory for write-cache.
|
|
|
|
path string
|
|
|
|
// blobstor is the main persistent storage.
|
2023-12-22 09:58:20 +00:00
|
|
|
blobstor MainStorage
|
2021-04-06 10:56:06 +00:00
|
|
|
// metabase is the metabase instance.
|
2023-12-22 09:58:20 +00:00
|
|
|
metabase Metabase
|
2021-04-06 10:56:06 +00:00
|
|
|
// 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
|
2021-09-08 09:32:20 +00:00
|
|
|
// maxCacheSize is the maximum total size of all objects saved in cache (DB + FS).
|
|
|
|
// 1 GiB by default.
|
|
|
|
maxCacheSize uint64
|
2024-08-06 12:09:12 +00:00
|
|
|
// maxCacheCount is the maximum total count of all object saved in cache.
|
|
|
|
// 0 (no limit) by default.
|
|
|
|
maxCacheCount uint64
|
2022-10-28 10:09:38 +00:00
|
|
|
// noSync is true iff FSTree allows unsynchronized writes.
|
|
|
|
noSync bool
|
2022-10-20 10:40:25 +00:00
|
|
|
// reportError is the function called when encountering disk errors in background workers.
|
2024-10-21 13:27:28 +00:00
|
|
|
reportError func(context.Context, string, error)
|
2023-05-18 14:19:41 +00:00
|
|
|
// metrics is metrics implementation
|
2023-12-22 09:58:20 +00:00
|
|
|
metrics Metrics
|
2023-11-17 14:41:13 +00:00
|
|
|
// disableBackgroundFlush is for testing purposes only.
|
|
|
|
disableBackgroundFlush bool
|
2024-09-10 09:56:29 +00:00
|
|
|
// flushSizeLimit is total size of flushing objects.
|
|
|
|
flushSizeLimit uint64
|
2021-04-06 10:56:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// WithLogger sets logger.
|
2022-09-28 07:41:01 +00:00
|
|
|
func WithLogger(log *logger.Logger) Option {
|
2021-04-06 10:56:06 +00:00
|
|
|
return func(o *options) {
|
2024-10-21 07:22:54 +00:00
|
|
|
o.log = log.With(zap.String("component", "WriteCache"))
|
2021-04-06 10:56:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithPath sets path to writecache db.
|
|
|
|
func WithPath(path string) Option {
|
|
|
|
return func(o *options) {
|
|
|
|
o.path = path
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithBlobstor sets main object storage.
|
2023-12-22 09:58:20 +00:00
|
|
|
func WithBlobstor(bs MainStorage) Option {
|
2021-04-06 10:56:06 +00:00
|
|
|
return func(o *options) {
|
|
|
|
o.blobstor = bs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithMetabase sets metabase.
|
2023-12-22 09:58:20 +00:00
|
|
|
func WithMetabase(db Metabase) Option {
|
2021-04-06 10:56:06 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-08 09:32:20 +00:00
|
|
|
|
|
|
|
// WithMaxCacheSize sets maximum write-cache size in bytes.
|
|
|
|
func WithMaxCacheSize(sz uint64) Option {
|
|
|
|
return func(o *options) {
|
|
|
|
o.maxCacheSize = sz
|
|
|
|
}
|
|
|
|
}
|
2022-06-16 15:21:10 +00:00
|
|
|
|
2024-08-06 12:09:12 +00:00
|
|
|
// WithMaxCacheCount sets maximum write-cache objects count.
|
|
|
|
func WithMaxCacheCount(v uint64) Option {
|
|
|
|
return func(o *options) {
|
|
|
|
o.maxCacheCount = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-28 10:09:38 +00:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
}
|
2022-10-20 10:40:25 +00:00
|
|
|
|
|
|
|
// WithReportErrorFunc sets error reporting function.
|
2024-10-21 13:27:28 +00:00
|
|
|
func WithReportErrorFunc(f func(context.Context, string, error)) Option {
|
2022-10-20 10:40:25 +00:00
|
|
|
return func(o *options) {
|
|
|
|
o.reportError = f
|
|
|
|
}
|
|
|
|
}
|
2023-03-21 10:38:44 +00:00
|
|
|
|
2023-05-18 14:19:41 +00:00
|
|
|
// WithMetrics sets metrics implementation.
|
2023-12-22 09:58:20 +00:00
|
|
|
func WithMetrics(metrics Metrics) Option {
|
2023-05-18 14:19:41 +00:00
|
|
|
return func(o *options) {
|
|
|
|
o.metrics = metrics
|
|
|
|
}
|
|
|
|
}
|
2023-11-17 14:41:13 +00:00
|
|
|
|
|
|
|
// WithDisableBackgroundFlush disables background flush, for testing purposes only.
|
|
|
|
func WithDisableBackgroundFlush() Option {
|
|
|
|
return func(o *options) {
|
|
|
|
o.disableBackgroundFlush = true
|
|
|
|
}
|
|
|
|
}
|
2024-08-08 10:32:18 +00:00
|
|
|
|
2024-09-10 09:56:29 +00:00
|
|
|
// WithFlushSizeLimit sets flush size limit.
|
|
|
|
func WithFlushSizeLimit(v uint64) Option {
|
|
|
|
return func(o *options) {
|
|
|
|
o.flushSizeLimit = v
|
|
|
|
}
|
|
|
|
}
|