forked from TrueCloudLab/frostfs-node
[#1764] neofs-node: Allow to return error from IterateShards
Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
parent
898689ec14
commit
9113793688
3 changed files with 26 additions and 14 deletions
|
@ -409,7 +409,7 @@ func initShardOptions(c *cfg) {
|
||||||
|
|
||||||
require := !nodeconfig.Relay(c.appCfg) // relay node does not require shards
|
require := !nodeconfig.Relay(c.appCfg) // relay node does not require shards
|
||||||
|
|
||||||
engineconfig.IterateShards(c.appCfg, require, func(sc *shardconfig.Config) {
|
err := engineconfig.IterateShards(c.appCfg, require, func(sc *shardconfig.Config) error {
|
||||||
var writeCacheOpts []writecache.Option
|
var writeCacheOpts []writecache.Option
|
||||||
|
|
||||||
writeCacheCfg := sc.WriteCache()
|
writeCacheCfg := sc.WriteCache()
|
||||||
|
@ -474,7 +474,7 @@ func initShardOptions(c *cfg) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("invalid storage type: %s", storages[i].Type()))
|
return fmt.Errorf("invalid storage type: %s", storages[i].Type())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,7 +521,11 @@ func initShardOptions(c *cfg) {
|
||||||
}),
|
}),
|
||||||
shard.WithGCEventChannel(gcEventChannel),
|
shard.WithGCEventChannel(gcEventChannel),
|
||||||
})
|
})
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
c.cfgObject.cfgLocalStorage.shardOpts = opts
|
c.cfgObject.cfgLocalStorage.shardOpts = opts
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package engineconfig
|
package engineconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-node/cmd/neofs-node/config"
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-node/config"
|
||||||
|
@ -15,13 +16,16 @@ const (
|
||||||
ShardPoolSizeDefault = 20
|
ShardPoolSizeDefault = 20
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrNoShardConfigured is returned when at least 1 shard is required but none are found.
|
||||||
|
var ErrNoShardConfigured = errors.New("no shard configured")
|
||||||
|
|
||||||
// IterateShards iterates over subsections of "shard" subsection of "storage" section of c,
|
// IterateShards iterates over subsections of "shard" subsection of "storage" section of c,
|
||||||
// wrap them into shardconfig.Config and passes to f.
|
// wrap them into shardconfig.Config and passes to f.
|
||||||
//
|
//
|
||||||
// Section names are expected to be consecutive integer numbers, starting from 0.
|
// Section names are expected to be consecutive integer numbers, starting from 0.
|
||||||
//
|
//
|
||||||
// Panics if N is not a positive number while shards are required.
|
// Panics if N is not a positive number while shards are required.
|
||||||
func IterateShards(c *config.Config, required bool, f func(*shardconfig.Config)) {
|
func IterateShards(c *config.Config, required bool, f func(*shardconfig.Config) error) error {
|
||||||
c = c.Sub(subsection)
|
c = c.Sub(subsection)
|
||||||
|
|
||||||
c = c.Sub("shard")
|
c = c.Sub("shard")
|
||||||
|
@ -44,11 +48,14 @@ func IterateShards(c *config.Config, required bool, f func(*shardconfig.Config))
|
||||||
}
|
}
|
||||||
(*config.Config)(sc).SetDefault(def)
|
(*config.Config)(sc).SetDefault(def)
|
||||||
|
|
||||||
f(sc)
|
if err := f(sc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if i == 0 && required {
|
if i == 0 && required {
|
||||||
panic("no shard configured")
|
return ErrNoShardConfigured
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShardPoolSize returns the value of "shard_pool_size" config parameter from "storage" section.
|
// ShardPoolSize returns the value of "shard_pool_size" config parameter from "storage" section.
|
||||||
|
|
|
@ -20,17 +20,17 @@ func TestEngineSection(t *testing.T) {
|
||||||
t.Run("defaults", func(t *testing.T) {
|
t.Run("defaults", func(t *testing.T) {
|
||||||
empty := configtest.EmptyConfig()
|
empty := configtest.EmptyConfig()
|
||||||
|
|
||||||
require.Panics(t, func() {
|
require.ErrorIs(t,
|
||||||
engineconfig.IterateShards(empty, true, nil)
|
engineconfig.IterateShards(empty, true, nil),
|
||||||
})
|
engineconfig.ErrNoShardConfigured)
|
||||||
|
|
||||||
handlerCalled := false
|
handlerCalled := false
|
||||||
|
|
||||||
require.NotPanics(t, func() {
|
require.NoError(t,
|
||||||
engineconfig.IterateShards(empty, false, func(_ *shardconfig.Config) {
|
engineconfig.IterateShards(empty, false, func(_ *shardconfig.Config) error {
|
||||||
handlerCalled = true
|
handlerCalled = true
|
||||||
})
|
return nil
|
||||||
})
|
}))
|
||||||
|
|
||||||
require.False(t, handlerCalled)
|
require.False(t, handlerCalled)
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.EqualValues(t, 100, engineconfig.ShardErrorThreshold(c))
|
require.EqualValues(t, 100, engineconfig.ShardErrorThreshold(c))
|
||||||
require.EqualValues(t, 15, engineconfig.ShardPoolSize(c))
|
require.EqualValues(t, 15, engineconfig.ShardPoolSize(c))
|
||||||
|
|
||||||
engineconfig.IterateShards(c, true, func(sc *shardconfig.Config) {
|
err := engineconfig.IterateShards(c, true, func(sc *shardconfig.Config) error {
|
||||||
defer func() {
|
defer func() {
|
||||||
num++
|
num++
|
||||||
}()
|
}()
|
||||||
|
@ -145,8 +145,9 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.Equal(t, true, sc.RefillMetabase())
|
require.Equal(t, true, sc.RefillMetabase())
|
||||||
require.Equal(t, mode.ReadWrite, sc.Mode())
|
require.Equal(t, mode.ReadWrite, sc.Mode())
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
require.Equal(t, 2, num)
|
require.Equal(t, 2, num)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue