forked from TrueCloudLab/frostfs-node
a1696a81b6
There is a need to limit disk space used by write-cache. It is almost impossible to calculate the value exactly. It is proposed to estimate the size of the cache by the number of objects stored in it. Track amounts of objects saved in DB and FSTree separately. To do this, `ObjectCounters` interface is defined. It is generalized to a store of numbers that can be made persistent (new option `WithObjectCounters`). By default DB number is calculated as key number in default bucket, and FS number is set same to DB since it is currently hard to read the actual value from `FSTree` instance. Each PUT/DELETE operation to DB or FS increases/decreases corresponding counter. Before each PUT op an overflow check is performed with the following formula for evaluating the occupied space: `NumDB * MaxDBSize + NumFS * MaxFSSize`. If next PUT can cause write-cache overflow, object is written to the main storage. By default maximum write-cache size is set to 1GB. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
package writecache
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor"
|
|
meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Option represents write-cache configuration option.
|
|
type Option func(*options)
|
|
|
|
type options struct {
|
|
log *zap.Logger
|
|
// path is a path to a directory for write-cache.
|
|
path string
|
|
// blobstor is the main persistent storage.
|
|
blobstor *blobstor.BlobStor
|
|
// metabase is the metabase instance.
|
|
metabase *meta.DB
|
|
// maxMemSize is the maximum total size of all objects cached in memory.
|
|
// 1 GiB by default.
|
|
maxMemSize uint64
|
|
// 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
|
|
// objCounters is an ObjectCounters instance needed for cache size estimation.
|
|
objCounters ObjectCounters
|
|
}
|
|
|
|
// WithLogger sets logger.
|
|
func WithLogger(log *zap.Logger) Option {
|
|
return func(o *options) {
|
|
o.log = 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
|
|
}
|
|
}
|
|
|
|
// WithMaxMemSize sets maximum size for in-memory DB.
|
|
func WithMaxMemSize(sz uint64) Option {
|
|
return func(o *options) {
|
|
o.maxMemSize = sz
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithObjectCounters sets ObjectCounters instance needed for cache write-cache size estimation.
|
|
func WithObjectCounters(v ObjectCounters) Option {
|
|
return func(o *options) {
|
|
o.objCounters = v
|
|
}
|
|
}
|
|
|
|
// WithMaxCacheSize sets maximum write-cache size in bytes.
|
|
func WithMaxCacheSize(sz uint64) Option {
|
|
return func(o *options) {
|
|
o.maxCacheSize = sz
|
|
}
|
|
}
|