[#1869] shard: Restore shard mode on failed reloads

Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
Evgenii Stratonikov 2022-10-16 16:11:29 +03:00 committed by fyrchik
parent c785e11b20
commit 87be4f1629
3 changed files with 22 additions and 4 deletions

View file

@ -171,7 +171,7 @@ func (db *DB) Reload(opts ...Option) (bool, error) {
db.modeMtx.Lock() db.modeMtx.Lock()
defer db.modeMtx.Unlock() defer db.modeMtx.Unlock()
if c.info.Path != "" && filepath.Clean(db.info.Path) != filepath.Clean(c.info.Path) { if db.mode.NoMetabase() || c.info.Path != "" && filepath.Clean(db.info.Path) != filepath.Clean(c.info.Path) {
if err := db.Close(); err != nil { if err := db.Close(); err != nil {
return false, err return false, err
} }

View file

@ -287,12 +287,20 @@ func (s *Shard) Reload(opts ...Option) error {
return err return err
} }
if ok { if ok {
var err error
if c.refillMetabase { if c.refillMetabase {
return s.refillMetabase() // Here we refill metabase only if a new instance was opened. This is a feature,
// we don't want to hang for some time just because we forgot to change
// config after the node was updated.
err = s.refillMetabase()
} else { } else {
return s.metaBase.Init() err = s.metaBase.Init()
}
if err != nil {
_ = s.setMode(mode.DegradedReadOnly)
return err
} }
} }
return nil return s.setMode(mode.ReadWrite)
} }

View file

@ -113,6 +113,16 @@ func TestShardReload(t *testing.T) {
// Old objects are still accessible. // Old objects are still accessible.
checkHasObjects(t, true) checkHasObjects(t, true)
// Successive reload produces no undesired effects.
require.NoError(t, os.RemoveAll(badPath))
require.NoError(t, sh.Reload(newOpts...))
obj = newObject()
require.NoError(t, putObject(sh, obj))
objects = append(objects, objAddr{obj: obj, addr: objectCore.AddressOf(obj)})
checkHasObjects(t, true)
}) })
}) })
} }