forked from TrueCloudLab/frostfs-node
154 lines
3.6 KiB
Go
154 lines
3.6 KiB
Go
package blobovniczatree
|
|
|
|
import (
|
|
"io/fs"
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/compression"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type cfg struct {
|
|
log *logger.Logger
|
|
perm fs.FileMode
|
|
readOnly bool
|
|
rootPath string
|
|
openedCacheSize int
|
|
blzShallowDepth uint64
|
|
blzShallowWidth uint64
|
|
compression *compression.Config
|
|
blzOpts []blobovnicza.Option
|
|
reportError func(string, error) // reportError is the function called when encountering disk errors.
|
|
metrics Metrics
|
|
waitBeforeDropDB time.Duration
|
|
blzInitWorkerCount int
|
|
blzMoveBatchSize int
|
|
// TTL for blobovnicza's cache
|
|
openedCacheTTL time.Duration
|
|
// Interval for deletion expired blobovnicza's
|
|
openedCacheExpInterval time.Duration
|
|
}
|
|
|
|
type Option func(*cfg)
|
|
|
|
const (
|
|
defaultPerm = 0o700
|
|
defaultOpenedCacheSize = 50
|
|
defaultOpenedCacheTTL = 0 // means expiring is off
|
|
defaultOpenedCacheInterval = 15 * time.Second
|
|
defaultBlzShallowDepth = 2
|
|
defaultBlzShallowWidth = 16
|
|
defaultWaitBeforeDropDB = 10 * time.Second
|
|
defaultBlzInitWorkerCount = 5
|
|
defaulBlzMoveBatchSize = 10000
|
|
)
|
|
|
|
func initConfig(c *cfg) {
|
|
*c = cfg{
|
|
log: &logger.Logger{Logger: zap.L()},
|
|
perm: defaultPerm,
|
|
openedCacheSize: defaultOpenedCacheSize,
|
|
openedCacheTTL: defaultOpenedCacheTTL,
|
|
openedCacheExpInterval: defaultOpenedCacheInterval,
|
|
blzShallowDepth: defaultBlzShallowDepth,
|
|
blzShallowWidth: defaultBlzShallowWidth,
|
|
reportError: func(string, error) {},
|
|
metrics: &noopMetrics{},
|
|
waitBeforeDropDB: defaultWaitBeforeDropDB,
|
|
blzInitWorkerCount: defaultBlzInitWorkerCount,
|
|
blzMoveBatchSize: defaulBlzMoveBatchSize,
|
|
}
|
|
}
|
|
|
|
func WithLogger(l *logger.Logger) Option {
|
|
return func(c *cfg) {
|
|
c.log = l
|
|
c.blzOpts = append(c.blzOpts, blobovnicza.WithLogger(l))
|
|
}
|
|
}
|
|
|
|
func WithPermissions(perm fs.FileMode) Option {
|
|
return func(c *cfg) {
|
|
c.perm = perm
|
|
}
|
|
}
|
|
|
|
func WithBlobovniczaShallowWidth(width uint64) Option {
|
|
return func(c *cfg) {
|
|
c.blzShallowWidth = width
|
|
}
|
|
}
|
|
|
|
func WithBlobovniczaShallowDepth(depth uint64) Option {
|
|
return func(c *cfg) {
|
|
c.blzShallowDepth = depth
|
|
}
|
|
}
|
|
|
|
func WithRootPath(p string) Option {
|
|
return func(c *cfg) {
|
|
c.rootPath = p
|
|
}
|
|
}
|
|
|
|
func WithBlobovniczaSize(sz uint64) Option {
|
|
return func(c *cfg) {
|
|
c.blzOpts = append(c.blzOpts, blobovnicza.WithFullSizeLimit(sz))
|
|
}
|
|
}
|
|
|
|
func WithOpenedCacheSize(sz int) Option {
|
|
return func(c *cfg) {
|
|
c.openedCacheSize = sz
|
|
}
|
|
}
|
|
|
|
func WithOpenedCacheTTL(ttl time.Duration) Option {
|
|
return func(c *cfg) {
|
|
c.openedCacheTTL = ttl
|
|
}
|
|
}
|
|
|
|
func WithOpenedCacheExpInterval(expInterval time.Duration) Option {
|
|
return func(c *cfg) {
|
|
c.openedCacheExpInterval = expInterval
|
|
}
|
|
}
|
|
|
|
func WithObjectSizeLimit(sz uint64) Option {
|
|
return func(c *cfg) {
|
|
c.blzOpts = append(c.blzOpts, blobovnicza.WithObjectSizeLimit(sz))
|
|
}
|
|
}
|
|
|
|
func WithMetrics(m Metrics) Option {
|
|
return func(c *cfg) {
|
|
c.metrics = m
|
|
}
|
|
}
|
|
|
|
func WithWaitBeforeDropDB(t time.Duration) Option {
|
|
return func(c *cfg) {
|
|
c.waitBeforeDropDB = t
|
|
}
|
|
}
|
|
|
|
func WithMoveBatchSize(v int) Option {
|
|
return func(c *cfg) {
|
|
c.blzMoveBatchSize = v
|
|
}
|
|
}
|
|
|
|
// WithInitWorkerCount sets maximum workers count to init blobovnicza tree.
|
|
//
|
|
// Negative or zero value means no limit.
|
|
func WithInitWorkerCount(v int) Option {
|
|
if v <= 0 {
|
|
v = -1
|
|
}
|
|
return func(c *cfg) {
|
|
c.blzInitWorkerCount = v
|
|
}
|
|
}
|