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 cd30969ef7..2fb0887c7d 100644 Binary files a/go.sum and b/go.sum differ 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) }