From a8354d565170ad0583a92852e01489b19a63cf87 Mon Sep 17 00:00:00 2001 From: Konstantin Prokopenko Date: Fri, 7 Nov 2025 16:52:01 +0300 Subject: [PATCH 1/3] add context checking --- driver.go | 8 +++++++ driver_test.go | 36 ++++++++++++++++++++++++++++++ internal/balancer/balancer.go | 4 ++++ internal/balancer/balancer_test.go | 12 ++++++++++ 4 files changed, 60 insertions(+) create mode 100644 driver_test.go diff --git a/driver.go b/driver.go index 574624217..e838f53aa 100644 --- a/driver.go +++ b/driver.go @@ -280,6 +280,10 @@ func (d *Driver) Topic() topic.Client { // //nolint:nonamedreturns func Open(ctx context.Context, dsn string, opts ...Option) (_ *Driver, _ error) { + if ctx.Err() != nil { + return nil, xerrors.WithStackTrace(ctx.Err()) + } + opts = append(append(make([]Option, 0, len(opts)+1), WithConnectionString(dsn)), opts...) for parserIdx := range dsnParsers { @@ -438,6 +442,10 @@ func (d *Driver) connect(ctx context.Context) error { return xerrors.WithStackTrace(errors.New("configuration: empty database")) //nolint:err113 } + if ctx.Err() != nil { + return xerrors.WithStackTrace(ctx.Err()) + } + if d.userInfo != nil { d.config = d.config.With(config.WithCredentials( credentials.NewStaticCredentials( diff --git a/driver_test.go b/driver_test.go new file mode 100644 index 000000000..762a7544d --- /dev/null +++ b/driver_test.go @@ -0,0 +1,36 @@ +package ydb_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/trace" +) + +func TestOpen(t *testing.T) { + t.Run("context already canceled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + _, err := ydb.Open(ctx, "grpc://localhost:2136/local") + require.ErrorIs(t, err, context.Canceled) + assert.Regexp(t, "^context canceled at", err.Error()) + }) + + t.Run("context canceled at internal connect()", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + + _, err := ydb.Open(ctx, "grpc://localhost:2136/local", ydb.WithTraceDriver(trace.Driver{ + OnInit: func(disi trace.DriverInitStartInfo) func(trace.DriverInitDoneInfo) { + cancel() + + return func(didi trace.DriverInitDoneInfo) {} + }, + })) + require.ErrorIs(t, err, context.Canceled) + assert.Regexp(t, "^context canceled at", err.Error()) + }) +} diff --git a/internal/balancer/balancer.go b/internal/balancer/balancer.go index 1e3414389..fd9883c3e 100644 --- a/internal/balancer/balancer.go +++ b/internal/balancer/balancer.go @@ -282,6 +282,10 @@ func makeDiscoveryFunc( func New(ctx context.Context, driverConfig *config.Config, pool *conn.Pool, opts ...discoveryConfig.Option) ( b *Balancer, finalErr error, ) { + if ctx.Err() != nil { + return nil, xerrors.WithStackTrace(ctx.Err()) + } + onDone := trace.DriverOnBalancerInit(driverConfig.Trace(), &ctx, stack.FunctionID("github.com/ydb-platform/ydb-go-sdk/v3/internal/balancer.New"), driverConfig.Balancer().String(), diff --git a/internal/balancer/balancer_test.go b/internal/balancer/balancer_test.go index a6afcae55..5f335dc9a 100644 --- a/internal/balancer/balancer_test.go +++ b/internal/balancer/balancer_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/resolver" @@ -143,3 +144,14 @@ type mockResolver struct{} func (r *mockResolver) ResolveNow(resolver.ResolveNowOptions) {} func (r *mockResolver) Close() {} + +func TestNew(t *testing.T) { + t.Run("context already canceled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + _, err := New(ctx, config.New(), nil) + require.ErrorIs(t, err, context.Canceled) + assert.Regexp(t, "^context canceled at", err.Error()) + }) +} From c6c59ad8dedca53d87ecb9083962dd30c8117fb9 Mon Sep 17 00:00:00 2001 From: Konstantin Prokopenko Date: Fri, 7 Nov 2025 16:54:41 +0300 Subject: [PATCH 2/3] add Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c6305768..476353285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Fixed `context` checking in `ydb.Open` + ## v3.118.1 * Fixed connection timeout issue in topics writer * Supported `sql.Null*` from `database/sql` as query params in `toValue` func From 7663332fd07824e4384515399f757ceb71e024bc Mon Sep 17 00:00:00 2001 From: Konstantin Prokopenko Date: Fri, 7 Nov 2025 19:33:11 +0300 Subject: [PATCH 3/3] fix lint --- driver_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/driver_test.go b/driver_test.go index 762a7544d..5215e8e31 100644 --- a/driver_test.go +++ b/driver_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/trace" )