From 4354359aed86b050ff1138e05ec9e782a3c21363 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 6 Sep 2022 18:23:59 +0300 Subject: [PATCH] [#1746] network: Set timeout for streaming operations Signed-off-by: Evgenii Stratonikov --- cmd/neofs-node/config.go | 5 +++-- cmd/neofs-node/config/apiclient/config.go | 16 ++++++++++++++++ .../config/apiclient/config_test.go | 2 ++ config/example/node.env | 1 + config/example/node.json | 3 ++- config/example/node.yaml | 1 + docs/storage-node-configuration.md | 8 +++++--- go.mod | 2 +- go.sum | Bin 116790 -> 116569 bytes pkg/network/cache/client.go | 1 + pkg/network/cache/multi.go | 4 ++++ 11 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index a95a1a5515..087de9a557 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -323,8 +323,9 @@ func initCfg(path string) *cfg { workerPool: reputationWorkerPool, }, clientCache: cache.NewSDKClientCache(cache.ClientCacheOpts{ - DialTimeout: apiclientconfig.DialTimeout(appCfg), - Key: &key.PrivateKey, + DialTimeout: apiclientconfig.DialTimeout(appCfg), + StreamTimeout: apiclientconfig.StreamTimeout(appCfg), + Key: &key.PrivateKey, }), persistate: persistate, } diff --git a/cmd/neofs-node/config/apiclient/config.go b/cmd/neofs-node/config/apiclient/config.go index 70c36652b2..eedad94305 100644 --- a/cmd/neofs-node/config/apiclient/config.go +++ b/cmd/neofs-node/config/apiclient/config.go @@ -11,6 +11,9 @@ const ( // DialTimeoutDefault is a default dial timeout of NeoFS API client connection. DialTimeoutDefault = 5 * time.Second + + // StreamTimeoutDefault is a default timeout of NeoFS API streaming operation. + StreamTimeoutDefault = 15 * time.Second ) // DialTimeout returns the value of "dial_timeout" config parameter @@ -25,3 +28,16 @@ func DialTimeout(c *config.Config) time.Duration { return DialTimeoutDefault } + +// StreamTimeout returns the value of "stream_timeout" config parameter +// from "apiclient" section. +// +// Returns DialTimeoutDefault if the value is not positive duration. +func StreamTimeout(c *config.Config) time.Duration { + v := config.DurationSafe(c.Sub(subsection), "stream_timeout") + if v > 0 { + return v + } + + return StreamTimeoutDefault +} diff --git a/cmd/neofs-node/config/apiclient/config_test.go b/cmd/neofs-node/config/apiclient/config_test.go index 85644cb1fb..ca77447edc 100644 --- a/cmd/neofs-node/config/apiclient/config_test.go +++ b/cmd/neofs-node/config/apiclient/config_test.go @@ -15,12 +15,14 @@ func TestApiclientSection(t *testing.T) { empty := configtest.EmptyConfig() require.Equal(t, apiclientconfig.DialTimeoutDefault, apiclientconfig.DialTimeout(empty)) + require.Equal(t, apiclientconfig.StreamTimeoutDefault, apiclientconfig.StreamTimeout(empty)) }) const path = "../../../../config/example/node" var fileConfigTest = func(c *config.Config) { require.Equal(t, 15*time.Second, apiclientconfig.DialTimeout(c)) + require.Equal(t, 20*time.Second, apiclientconfig.StreamTimeout(c)) } configtest.ForEachFileType(path, fileConfigTest) diff --git a/config/example/node.env b/config/example/node.env index f93519493f..89116388da 100644 --- a/config/example/node.env +++ b/config/example/node.env @@ -69,6 +69,7 @@ NEOFS_MORPH_RPC_ENDPOINT_1_PRIORITY=2 # API Client section NEOFS_APICLIENT_DIAL_TIMEOUT=15s +NEOFS_APICLIENT_STREAM_TIMEOUT=20s # Policer section NEOFS_POLICER_HEAD_TIMEOUT=15s diff --git a/config/example/node.json b/config/example/node.json index b53db4397b..34a6836505 100644 --- a/config/example/node.json +++ b/config/example/node.json @@ -112,7 +112,8 @@ ] }, "apiclient": { - "dial_timeout": "15s" + "dial_timeout": "15s", + "stream_timeout": "20s" }, "policer": { "head_timeout": "15s" diff --git a/config/example/node.yaml b/config/example/node.yaml index c7b3b1e764..e6bc7ec308 100644 --- a/config/example/node.yaml +++ b/config/example/node.yaml @@ -91,6 +91,7 @@ morph: apiclient: dial_timeout: 15s # timeout for NEOFS API client connection + stream_timeout: 20s # timeout for individual operations in a streaming RPC policer: head_timeout: 15s # timeout for the Policer HEAD remote operation diff --git a/docs/storage-node-configuration.md b/docs/storage-node-configuration.md index 1139e83a2f..10d0451567 100644 --- a/docs/storage-node-configuration.md +++ b/docs/storage-node-configuration.md @@ -366,10 +366,12 @@ Configuration for the NeoFS API client used for communication with other NeoFS n ```yaml apiclient: dial_timeout: 15s + stream_timeout: 20s ``` -| Parameter | Type | Default value | Description | -|--------------|----------|---------------|-----------------------------------------------------------------------| -| dial_timeout | duration | `5s` | Timeout for dialing connections to other storage or inner ring nodes. | +| Parameter | Type | Default value | Description | +|----------------|----------|---------------|-----------------------------------------------------------------------| +| dial_timeout | duration | `5s` | Timeout for dialing connections to other storage or inner ring nodes. | +| stream_timeout | duration | `15s` | Timeout for individual operations in a streaming RPC. | # `policer` section diff --git a/go.mod b/go.mod index fd755252e7..7aa131e8d0 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b // indirect github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20220827080658-9e17cdfc7647 github.com/nspcc-dev/neofs-contract v0.15.5 - github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.6.0.20220829114550-ee92df32032e + github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.6.0.20220907075128-43a57d42dd50 github.com/nspcc-dev/tzhash v1.6.1 github.com/panjf2000/ants/v2 v2.4.0 github.com/paulmach/orb v0.2.2 diff --git a/go.sum b/go.sum index cd30969ef738e4830d7c152a445e56c9a4b31e9b..2fb0887c7ded79e728b775fe76974a0c3d723cd3 100644 GIT binary patch delta 194 zcmdlsf&FG5`-WXBHjA!wX54&h)eSZmO9OKQb5lbj3tbcAL{sw=6Qh(AQv-zzL#s5` zN^id$%L0QE@8qxwb6=O@;BDzrd=rP~$Rv(*hr}Qdh&I$qQD?O`-WXB%nkL^^YwD`Qxq}`t;);1eFGzMT=jj8QwvM{47@!v4Sln+UBg1k zB0ar=iu`@^yh;jPvz;r7Cp#`z+`N5-8>5)Hk-3q9k(rT+u355qqKScFnz^}I;^v7f zUD#bMj4TZeO-xM9;jZ)H#jSP&9QbAUkB$aFDC7K7iXSsUhMWy<=XM`IYYUk+t z2AcVq`b8P~R5&N)q(mA7rRM{!lA3&AJ@;h$jY8hoO+@lTm7||yp-GgpqhX|5gtkj? wRe*kFic^`scTtvUaZ0wgX?{^bh-YwaRM2F_4HA?2H*q)b-?)AMM#fp903*0s-T(jq diff --git a/pkg/network/cache/client.go b/pkg/network/cache/client.go index 598f435282..027e90a4bb 100644 --- a/pkg/network/cache/client.go +++ b/pkg/network/cache/client.go @@ -20,6 +20,7 @@ type ( ClientCacheOpts struct { DialTimeout time.Duration + StreamTimeout time.Duration Key *ecdsa.PrivateKey ResponseCallback func(client.ResponseMetaInfo) error } diff --git a/pkg/network/cache/multi.go b/pkg/network/cache/multi.go index 10c579810a..2bb824796f 100644 --- a/pkg/network/cache/multi.go +++ b/pkg/network/cache/multi.go @@ -47,6 +47,10 @@ func (x *multiClient) createForAddress(addr network.Address) clientcore.Client { prmDial.SetTimeout(x.opts.DialTimeout) } + if x.opts.StreamTimeout > 0 { + prmDial.SetStreamTimeout(x.opts.StreamTimeout) + } + if x.opts.ResponseCallback != nil { prmInit.SetResponseInfoCallback(x.opts.ResponseCallback) }