forked from TrueCloudLab/frostfs-sdk-go
[#282] client: Close connection on non-nil error in Dial
A particular status code does not imply that a connection has not been
established. However, `Dial()` requires user to call `Close()` only if
the error was nil. Thus, it is `Dial()` responsibility to close
everything if it returns an error.
Introduced after the gRPC update in #270 (6009d089fc
).
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
4c310ae1c7
commit
99c5c58365
1 changed files with 12 additions and 7 deletions
|
@ -106,16 +106,21 @@ func (c *Client) Dial(ctx context.Context, prm PrmDial) error {
|
|||
client.WithContext(ctx),
|
||||
)
|
||||
if err != nil {
|
||||
var ctxErr error
|
||||
|
||||
// return context errors since they signal about dial problem
|
||||
if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
|
||||
return err
|
||||
ctxErr = err
|
||||
} else if st, ok := status.FromError(err); ok && st.Code() == codes.Canceled {
|
||||
ctxErr = context.Canceled
|
||||
} else if ok && st.Code() == codes.DeadlineExceeded {
|
||||
ctxErr = context.DeadlineExceeded
|
||||
}
|
||||
st, ok := status.FromError(err)
|
||||
if ok && st.Code() == codes.Canceled {
|
||||
return context.Canceled
|
||||
}
|
||||
if ok && st.Code() == codes.DeadlineExceeded {
|
||||
return context.DeadlineExceeded
|
||||
if ctxErr != nil {
|
||||
if conn := c.c.Conn(); conn != nil {
|
||||
_ = conn.Close()
|
||||
}
|
||||
return ctxErr
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue