frostfs-node/pkg/local_object_storage/writecache/writecachebitcask/control.go
Alejandro Lopez 42e74d6aab [#610] Add bitcask-inspired writecache implementation
Signed-off-by: Alejandro Lopez <a.lopez@yadro.com>
2023-08-31 14:17:10 +03:00

81 lines
1.7 KiB
Go

package writecachebitcask
import (
"errors"
"fmt"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard/mode"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
)
// SetLogger sets logger. It is used after the shard ID was generated to use it in logs.
func (c *cache) SetLogger(l *logger.Logger) {
c.log = l
}
func (c *cache) DumpInfo() writecache.Info {
return writecache.Info{
Path: c.path,
}
}
func (c *cache) Open(readOnly bool) error {
// Validate
if c.bucketCount&(c.bucketCount-1) != 0 {
return fmt.Errorf("numBuckets must be a power of 2: got %d", c.bucketCount)
}
if c.regionCount&(c.regionCount-1) != 0 {
return fmt.Errorf("numRegions must be a power of 2: got %d", c.regionCount)
}
if c.regionCount >= c.bucketCount {
return errors.New("numBuckets must be greater than numRegions")
}
// Create regions
c.regions = make([]*region, c.regionCount)
for i := 0; i < c.regionCount; i++ {
c.regions[i] = &region{
opts: &c.options,
index: i,
keyDir: make([][]*entry, c.bucketCount/c.regionCount),
flushCh: make(chan uint32, c.maxPendingLogFileFlush),
}
}
if readOnly {
_ = c.SetMode(mode.ReadOnly)
} else {
_ = c.SetMode(mode.ReadWrite)
}
return nil
}
func (c *cache) Init() error {
for _, r := range c.regions {
go r.flushWorker()
if err := r.init(); err != nil {
r.close()
return err
}
}
return nil
}
func (c *cache) Close() error {
var lastErr error
if !c.closed.Swap(true) {
for _, r := range c.regions {
if err := r.close(); err != nil {
lastErr = err
}
}
}
return lastErr
}
func (c *cache) SetMode(m mode.Mode) error {
c.mode.Store(uint32(m))
return nil
}