Skip to content

Commit 70fd60b

Browse files
Fix unreadable context error in ydb.Open (#1929)
Co-authored-by: Aleksey Myasnikov <[email protected]>
1 parent c7826e3 commit 70fd60b

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Fixed `context` checking in `ydb.Open`
2+
13
## v3.118.2
24
* Fixed checking GRPC transport error in `discovery`
35

driver.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ func (d *Driver) Topic() topic.Client {
280280
//
281281
//nolint:nonamedreturns
282282
func Open(ctx context.Context, dsn string, opts ...Option) (_ *Driver, _ error) {
283+
if ctx.Err() != nil {
284+
return nil, xerrors.WithStackTrace(ctx.Err())
285+
}
286+
283287
opts = append(append(make([]Option, 0, len(opts)+1), WithConnectionString(dsn)), opts...)
284288

285289
for parserIdx := range dsnParsers {
@@ -438,6 +442,10 @@ func (d *Driver) connect(ctx context.Context) error {
438442
return xerrors.WithStackTrace(errors.New("configuration: empty database")) //nolint:err113
439443
}
440444

445+
if ctx.Err() != nil {
446+
return xerrors.WithStackTrace(ctx.Err())
447+
}
448+
441449
if d.userInfo != nil {
442450
d.config = d.config.With(config.WithCredentials(
443451
credentials.NewStaticCredentials(

driver_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ydb_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
10+
"github.com/ydb-platform/ydb-go-sdk/v3"
11+
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
12+
)
13+
14+
func TestOpen(t *testing.T) {
15+
t.Run("context already canceled", func(t *testing.T) {
16+
ctx, cancel := context.WithCancel(context.Background())
17+
cancel()
18+
19+
_, err := ydb.Open(ctx, "grpc://localhost:2136/local")
20+
require.ErrorIs(t, err, context.Canceled)
21+
assert.Regexp(t, "^context canceled at", err.Error())
22+
})
23+
24+
t.Run("context canceled at internal connect()", func(t *testing.T) {
25+
ctx, cancel := context.WithCancel(context.Background())
26+
27+
_, err := ydb.Open(ctx, "grpc://localhost:2136/local", ydb.WithTraceDriver(trace.Driver{
28+
OnInit: func(disi trace.DriverInitStartInfo) func(trace.DriverInitDoneInfo) {
29+
cancel()
30+
31+
return func(didi trace.DriverInitDoneInfo) {}
32+
},
33+
}))
34+
require.ErrorIs(t, err, context.Canceled)
35+
assert.Regexp(t, "^context canceled at", err.Error())
36+
})
37+
}

internal/balancer/balancer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,10 @@ func makeDiscoveryFunc(
282282
func New(ctx context.Context, driverConfig *config.Config, pool *conn.Pool, opts ...discoveryConfig.Option) (
283283
b *Balancer, finalErr error,
284284
) {
285+
if ctx.Err() != nil {
286+
return nil, xerrors.WithStackTrace(ctx.Err())
287+
}
288+
285289
onDone := trace.DriverOnBalancerInit(driverConfig.Trace(), &ctx,
286290
stack.FunctionID("github.com/ydb-platform/ydb-go-sdk/v3/internal/balancer.New"),
287291
driverConfig.Balancer().String(),

internal/balancer/balancer_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/stretchr/testify/assert"
1112
"github.com/stretchr/testify/require"
1213
"google.golang.org/grpc"
1314
"google.golang.org/grpc/resolver"
@@ -143,3 +144,14 @@ type mockResolver struct{}
143144

144145
func (r *mockResolver) ResolveNow(resolver.ResolveNowOptions) {}
145146
func (r *mockResolver) Close() {}
147+
148+
func TestNew(t *testing.T) {
149+
t.Run("context already canceled", func(t *testing.T) {
150+
ctx, cancel := context.WithCancel(context.Background())
151+
cancel()
152+
153+
_, err := New(ctx, config.New(), nil)
154+
require.ErrorIs(t, err, context.Canceled)
155+
assert.Regexp(t, "^context canceled at", err.Error())
156+
})
157+
}

0 commit comments

Comments
 (0)