Skip to content

Commit

Permalink
[nspcc-dev#419] rpc/client: Use provided context for client dial
Browse files Browse the repository at this point in the history
In previous implementation `Client` passed `context.Background()` to
`grpc.DialContext` function. This didn't allow to abort dial stage by
the given context.

Base dial context on the one provided with `WithContext` option. Fall
back to using `context.Background` if context is not specified.

Signed-off-by: Leonard Lyubich <ctulhurider@gmail.com>
  • Loading branch information
Leonard Lyubich committed Oct 3, 2022
1 parent 1288cf9 commit 3bdb3a4
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 14 deletions.
16 changes: 8 additions & 8 deletions rpc/client/call_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@ package client

import (
"context"

"github.com/nspcc-dev/neofs-api-go/v2/rpc/grpc"
)

// CallOption is a messaging session option within Protobuf RPC.
type CallOption func(*callParameters)

type callParameters struct {
callOpts []grpc.CallOption
ctx context.Context
}

func defaultCallParameters() *callParameters {
return &callParameters{
callOpts: make([]grpc.CallOption, 0, 1),
}
return &callParameters{}
}

// WithContext return options to specify call context.
// WithContext returns option to specify call context. If provided, all network
// communications will be based on this context. Otherwise, context.Background()
// is used.
//
// Context SHOULD NOT be nil.
func WithContext(ctx context.Context) CallOption {
return func(prm *callParameters) {
prm.callOpts = append(prm.callOpts, grpc.WithContext(ctx))
prm.ctx = ctx
}
}
15 changes: 11 additions & 4 deletions rpc/client/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import (
"google.golang.org/grpc/credentials/insecure"
)

func (c *Client) createGRPCClient() (err error) {
func (c *Client) createGRPCClient(ctx context.Context) (err error) {
c.gRPCClientOnce.Do(func() {
if err = c.openGRPCConn(); err != nil {
if err = c.openGRPCConn(ctx); err != nil {
return
}

Expand All @@ -30,7 +30,7 @@ func (c *Client) createGRPCClient() (err error) {

var errInvalidEndpoint = errors.New("invalid endpoint options")

func (c *Client) openGRPCConn() error {
func (c *Client) openGRPCConn(ctx context.Context) error {
if c.conn != nil {
return nil
}
Expand All @@ -47,13 +47,20 @@ func (c *Client) openGRPCConn() error {
creds = insecure.NewCredentials()
}

dialCtx, cancel := context.WithTimeout(context.Background(), c.dialTimeout)
if ctx == nil {
ctx = context.Background()
}

dialCtx, cancel := context.WithTimeout(ctx, c.dialTimeout)
var err error

c.conn, err = grpcstd.DialContext(dialCtx, c.addr,
grpcstd.WithTransportCredentials(creds),
grpcstd.WithBlock(),
)

cancel()

if err != nil {
return fmt.Errorf("open gRPC client connection: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions rpc/client/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,11 @@ func (g rwGRPC) WriteMessage(m message.Message) error {
}

func (c *Client) initGRPC(info common.CallMethodInfo, prm *callParameters) (MessageReadWriter, error) {
if err := c.createGRPCClient(); err != nil {
if err := c.createGRPCClient(prm.ctx); err != nil {
return nil, err
}

rw, err := c.gRPCClient.Init(info, prm.callOpts...)
rw, err := c.gRPCClient.Init(info, grpc.WithContext(prm.ctx))
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 3bdb3a4

Please sign in to comment.