forked from TrueCloudLab/frostfs-node
67 lines
2.6 KiB
Go
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{}) {}
|