forked from TrueCloudLab/frostfs-sdk-go
[#343] client: Accept context parameter in Dial
In previous implementation of `Client.Dial` there was no ability to specify parent context (e.g. global application context). Add `PrmDial.SetContext` method which accepts optional base dial context. Use the context to open client connection or fall back to using `context.Background()`. Upgraded version of `github.com/nspcc-dev/neofs-api-go/v2` module also fixes the problem when dial timeout didn't work properly. Signed-off-by: Leonard Lyubich <ctulhurider@gmail.com>
This commit is contained in:
parent
1325b4f272
commit
452a50e9d5
4 changed files with 55 additions and 4 deletions
|
@ -1,8 +1,10 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
||||||
|
@ -63,6 +65,10 @@ func (c *Client) Init(prm PrmInit) {
|
||||||
// Returns an error describing failure reason. If failed, the Client
|
// Returns an error describing failure reason. If failed, the Client
|
||||||
// SHOULD NOT be used.
|
// SHOULD NOT be used.
|
||||||
//
|
//
|
||||||
|
// Uses the context specified by SetContext if it was called with non-nil
|
||||||
|
// argument, otherwise context.Background() is used. Dial returns context
|
||||||
|
// errors, see context package docs for details.
|
||||||
|
//
|
||||||
// Panics if required parameters are set incorrectly, look carefully
|
// Panics if required parameters are set incorrectly, look carefully
|
||||||
// at the method documentation.
|
// at the method documentation.
|
||||||
//
|
//
|
||||||
|
@ -100,7 +106,13 @@ func (c *Client) Dial(prm PrmDial) error {
|
||||||
c.setNeoFSAPIServer((*coreServer)(&c.c))
|
c.setNeoFSAPIServer((*coreServer)(&c.c))
|
||||||
|
|
||||||
// TODO: (neofs-api-go#382) perform generic dial stage of the client.Client
|
// TODO: (neofs-api-go#382) perform generic dial stage of the client.Client
|
||||||
_, _ = rpc.Balance(&c.c, new(v2accounting.BalanceRequest))
|
_, err := rpc.Balance(&c.c, new(v2accounting.BalanceRequest),
|
||||||
|
client.WithContext(prm.parentCtx),
|
||||||
|
)
|
||||||
|
// return context errors since they signal about dial problem
|
||||||
|
if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -174,6 +186,8 @@ type PrmDial struct {
|
||||||
|
|
||||||
streamTimeoutSet bool
|
streamTimeoutSet bool
|
||||||
streamTimeout time.Duration
|
streamTimeout time.Duration
|
||||||
|
|
||||||
|
parentCtx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetServerURI sets server URI in the NeoFS network.
|
// SetServerURI sets server URI in the NeoFS network.
|
||||||
|
@ -214,3 +228,11 @@ func (x *PrmDial) SetStreamTimeout(timeout time.Duration) {
|
||||||
x.streamTimeoutSet = true
|
x.streamTimeoutSet = true
|
||||||
x.streamTimeout = timeout
|
x.streamTimeout = timeout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetContext allows to specify optional base context within which connection
|
||||||
|
// should be established.
|
||||||
|
//
|
||||||
|
// Context SHOULD NOT be nil.
|
||||||
|
func (x *PrmDial) SetContext(ctx context.Context) {
|
||||||
|
x.parentCtx = ctx
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
@ -37,3 +38,31 @@ func newClient(server neoFSAPIServer) *Client {
|
||||||
|
|
||||||
return &c
|
return &c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestClient_DialContext(t *testing.T) {
|
||||||
|
var c Client
|
||||||
|
|
||||||
|
// try to connect to any host
|
||||||
|
var prm PrmDial
|
||||||
|
prm.SetServerURI("localhost:8080")
|
||||||
|
|
||||||
|
assert := func(ctx context.Context, errExpected error) {
|
||||||
|
// use the particular context
|
||||||
|
prm.SetContext(ctx)
|
||||||
|
|
||||||
|
// expect particular context error according to Dial docs
|
||||||
|
require.ErrorIs(t, c.Dial(prm), errExpected)
|
||||||
|
}
|
||||||
|
|
||||||
|
// create pre-abandoned context
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
assert(ctx, context.Canceled)
|
||||||
|
|
||||||
|
// create "pre-deadlined" context
|
||||||
|
ctx, cancel = context.WithTimeout(context.Background(), 0)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
assert(ctx, context.DeadlineExceeded)
|
||||||
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -9,7 +9,7 @@ require (
|
||||||
github.com/mr-tron/base58 v1.2.0
|
github.com/mr-tron/base58 v1.2.0
|
||||||
github.com/nspcc-dev/hrw v1.0.9
|
github.com/nspcc-dev/hrw v1.0.9
|
||||||
github.com/nspcc-dev/neo-go v0.99.2
|
github.com/nspcc-dev/neo-go v0.99.2
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221004142957-5fc2644c680d
|
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221005093543-3a91383f24a9
|
||||||
github.com/nspcc-dev/neofs-contract v0.15.3
|
github.com/nspcc-dev/neofs-contract v0.15.3
|
||||||
github.com/nspcc-dev/tzhash v1.6.1
|
github.com/nspcc-dev/tzhash v1.6.1
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -263,8 +263,8 @@ github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b h1:J7
|
||||||
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b/go.mod h1:23bBw0v6pBYcrWs8CBEEDIEDJNbcFoIh8pGGcf2Vv8s=
|
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b/go.mod h1:23bBw0v6pBYcrWs8CBEEDIEDJNbcFoIh8pGGcf2Vv8s=
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.11.0-pre.0.20211201134523-3604d96f3fe1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs=
|
github.com/nspcc-dev/neofs-api-go/v2 v2.11.0-pre.0.20211201134523-3604d96f3fe1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs=
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.11.1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs=
|
github.com/nspcc-dev/neofs-api-go/v2 v2.11.1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs=
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221004142957-5fc2644c680d h1:Oc15A8gDoP/TC5kdJi6TW9AnOp5dYiecZ0tJDRUV7vg=
|
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221005093543-3a91383f24a9 h1:c9ovp4KuPyIBx4dVG4bmkePlmuN0au4BBtFGXALWFBM=
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221004142957-5fc2644c680d/go.mod h1:DRIr0Ic1s+6QgdqmNFNLIqMqd7lNMJfYwkczlm1hDtM=
|
github.com/nspcc-dev/neofs-api-go/v2 v2.13.2-0.20221005093543-3a91383f24a9/go.mod h1:DRIr0Ic1s+6QgdqmNFNLIqMqd7lNMJfYwkczlm1hDtM=
|
||||||
github.com/nspcc-dev/neofs-contract v0.15.3 h1:7+NwyTtxFAnIevz0hR/XxQf6R2Ej2scjVR2bnnJnhBM=
|
github.com/nspcc-dev/neofs-contract v0.15.3 h1:7+NwyTtxFAnIevz0hR/XxQf6R2Ej2scjVR2bnnJnhBM=
|
||||||
github.com/nspcc-dev/neofs-contract v0.15.3/go.mod h1:BXVZUZUJxrmmDETglXHI8+5DSgn84B9y5DoSWqEjYCs=
|
github.com/nspcc-dev/neofs-contract v0.15.3/go.mod h1:BXVZUZUJxrmmDETglXHI8+5DSgn84B9y5DoSWqEjYCs=
|
||||||
github.com/nspcc-dev/neofs-crypto v0.2.0/go.mod h1:F/96fUzPM3wR+UGsPi3faVNmFlA9KAEAUQR7dMxZmNA=
|
github.com/nspcc-dev/neofs-crypto v0.2.0/go.mod h1:F/96fUzPM3wR+UGsPi3faVNmFlA9KAEAUQR7dMxZmNA=
|
||||||
|
|
Loading…
Reference in a new issue