frostfs-node/pkg/local_object_storage/writecache/util.go
Dmitrii Stepanov 5b9928536d [#1335] writecache: Change DB engine to Pebble
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
2024-09-05 13:31:16 +03:00

67 lines
2.6 KiB
Go

package writecache
import (
"log"
"github.com/cockroachdb/pebble"
"github.com/cockroachdb/pebble/bloom"
)
const (
defaultPebbleCacheSize = 1 << 30
defaultPebbleMemTableSize = 64 << 20
defaultMemTableStopWritesThreshold = 20
defaultPebbleBytesPerSync = 1 << 20
defaultPebbleMaxConcurrentCompactions = 5
defaultPebbleMaxOpenFiles = 1000
defaultPebbleL0CompactionThreshold = 4
defaultPebbleL0CompactionFileThreshold = 500
defaultPebbleL0StopWritesThreshold = 12
defaultPebbleLBaseMaxBytes = 128 << 20
defaultPebbleLevels = 7
defaultPebbleL0TargetFileSize = 4 << 20
defaultPebbleBlockSize = 4 << 10
defaultPebbleFilterPolicy bloom.FilterPolicy = 10
)
// OpenDB opens BoltDB instance for write-cache. Opens in read-only mode if ro is true.
func OpenDB(p string, ro bool) (*pebble.DB, error) {
opts := &pebble.Options{
ReadOnly: ro,
FormatMajorVersion: pebble.FormatNewest,
}
opts.Logger = &noopPebbleLogger{}
opts.Cache = pebble.NewCache(defaultPebbleCacheSize)
opts.MemTableSize = defaultPebbleMemTableSize
opts.MemTableStopWritesThreshold = defaultMemTableStopWritesThreshold
opts.BytesPerSync = defaultPebbleBytesPerSync
opts.MaxConcurrentCompactions = func() int { return defaultPebbleMaxConcurrentCompactions }
opts.MaxOpenFiles = defaultPebbleMaxOpenFiles
opts.L0CompactionThreshold = defaultPebbleL0CompactionThreshold
opts.L0CompactionFileThreshold = defaultPebbleL0CompactionFileThreshold
opts.L0StopWritesThreshold = defaultPebbleL0StopWritesThreshold
opts.LBaseMaxBytes = defaultPebbleLBaseMaxBytes
opts.Levels = make([]pebble.LevelOptions, defaultPebbleLevels)
opts.Levels[0].TargetFileSize = defaultPebbleL0TargetFileSize
for i := 0; i < defaultPebbleLevels; i++ {
l := &opts.Levels[i]
l.BlockSize = defaultPebbleBlockSize
l.FilterPolicy = defaultPebbleFilterPolicy
l.FilterType = pebble.TableFilter
if i > 0 {
l.TargetFileSize = opts.Levels[i-1].TargetFileSize * 2
}
l.EnsureDefaults()
}
return pebble.Open(p, opts)
}
var _ pebble.Logger = (*noopPebbleLogger)(nil)
type noopPebbleLogger struct{}
func (n *noopPebbleLogger) Fatalf(format string, args ...interface{}) {
log.Fatalf(format, args...)
}
func (n *noopPebbleLogger) Infof(string, ...interface{}) {}