[#1869] shard: Allow to reload metabase on SIGHUP

Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
Evgenii Stratonikov 2022-10-16 14:39:47 +03:00 committed by fyrchik
parent f769fc83fc
commit c785e11b20
7 changed files with 252 additions and 13 deletions

View file

@ -1,14 +1,19 @@
package meta
import (
"errors"
"fmt"
"path/filepath"
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/shard/mode"
"github.com/nspcc-dev/neofs-node/pkg/util"
"go.etcd.io/bbolt"
"go.uber.org/zap"
)
// ErrDegradedMode is returned when metabase is in a degraded mode.
var ErrDegradedMode = errors.New("metabase is in a degraded mode")
// Open boltDB instance for metabase.
func (db *DB) Open(readOnly bool) error {
err := util.MkdirAllX(filepath.Dir(db.info.Path), db.info.Permission)
@ -24,6 +29,12 @@ func (db *DB) Open(readOnly bool) error {
}
db.boltOptions.ReadOnly = readOnly
return db.openBolt()
}
func (db *DB) openBolt() error {
var err error
db.boltDB, err = bbolt.Open(db.info.Path, db.info.Permission, db.boltOptions)
if err != nil {
return fmt.Errorf("can't open boltDB database: %w", err)
@ -144,3 +155,36 @@ func (db *DB) Close() error {
}
return nil
}
// Reload reloads part of the configuration.
// It returns true iff database was reopened.
// If a config option is invalid, it logs an error and returns nil.
// If there was a problem with applying new configuration, an error is returned.
//
// If a metabase was couldn't be reopened because of an error, ErrDegradedMode is returned.
func (db *DB) Reload(opts ...Option) (bool, error) {
var c cfg
for i := range opts {
opts[i](&c)
}
db.modeMtx.Lock()
defer db.modeMtx.Unlock()
if c.info.Path != "" && filepath.Clean(db.info.Path) != filepath.Clean(c.info.Path) {
if err := db.Close(); err != nil {
return false, err
}
db.mode = mode.Degraded
db.info.Path = c.info.Path
if err := db.openBolt(); err != nil {
return false, fmt.Errorf("%w: %v", ErrDegradedMode, err)
}
db.mode = mode.ReadWrite
return true, nil
}
return false, nil
}