From fb89d295744545cb7f67f6ac7d19fb40c0cfc074 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Fri, 12 Nov 2021 13:15:14 +0300 Subject: [PATCH] [#969] node: Do not require shard config in relay mode Relay storage node doesn't exec local object operations, so it doesn't need shard configuration. Add `required` bool parameter to `engineconfig.IterateShards`. Make it to panic if it is `true`, and immediately return otherwise. Pass `false` if node is configured as relay in app (it also prevents panic). Signed-off-by: Leonard Lyubich --- cmd/neofs-node/config.go | 4 +++- cmd/neofs-node/config/engine/config.go | 10 +++++++--- cmd/neofs-node/config/engine/config_test.go | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index 50a9d8bb..d71ef9ac 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -367,7 +367,9 @@ func initLocalStorage(c *cfg) { func initShardOptions(c *cfg) { var opts [][]shard.Option - engineconfig.IterateShards(c.appCfg, func(sc *shardconfig.Config) { + require := !nodeconfig.Relay(c.appCfg) // relay node does not require shards + + engineconfig.IterateShards(c.appCfg, require, func(sc *shardconfig.Config) { var writeCacheOpts []writecache.Option useWriteCache := sc.UseWriteCache() diff --git a/cmd/neofs-node/config/engine/config.go b/cmd/neofs-node/config/engine/config.go index d8860cdf..2dd03a7b 100644 --- a/cmd/neofs-node/config/engine/config.go +++ b/cmd/neofs-node/config/engine/config.go @@ -19,13 +19,17 @@ const ( // of "shard" subsection of "storage" section of c, wrap them into // shardconfig.Config and passes to f. // -// Panics if N is not a positive number. -func IterateShards(c *config.Config, f func(*shardconfig.Config)) { +// Panics if N is not a positive number while shards are required. +func IterateShards(c *config.Config, required bool, f func(*shardconfig.Config)) { c = c.Sub(subsection) num := config.Uint(c, "shard_num") if num == 0 { - panic("no shard configured") + if required { + panic("no shard configured") + } + + return } def := c.Sub("default") diff --git a/cmd/neofs-node/config/engine/config_test.go b/cmd/neofs-node/config/engine/config_test.go index 3d77eb4c..7853c094 100644 --- a/cmd/neofs-node/config/engine/config_test.go +++ b/cmd/neofs-node/config/engine/config_test.go @@ -17,9 +17,19 @@ func TestEngineSection(t *testing.T) { empty := configtest.EmptyConfig() require.Panics(t, func() { - engineconfig.IterateShards(empty, nil) + engineconfig.IterateShards(empty, true, nil) }) + handlerCalled := false + + require.NotPanics(t, func() { + engineconfig.IterateShards(empty, false, func(_ *shardconfig.Config) { + handlerCalled = true + }) + }) + + require.False(t, handlerCalled) + require.EqualValues(t, engineconfig.ShardPoolSizeDefault, engineconfig.ShardPoolSize(empty)) }) @@ -30,7 +40,7 @@ func TestEngineSection(t *testing.T) { require.EqualValues(t, 15, engineconfig.ShardPoolSize(c)) - engineconfig.IterateShards(c, func(sc *shardconfig.Config) { + engineconfig.IterateShards(c, true, func(sc *shardconfig.Config) { defer func() { num++ }()