Skip to content

Commit 73b7ff3

Browse files
committed
fix
1 parent 18c4b4b commit 73b7ff3

File tree

5 files changed

+16
-51
lines changed

5 files changed

+16
-51
lines changed

driver.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"google.golang.org/grpc"
87
"os"
98
"sync"
109
"sync/atomic"
1110

11+
"google.golang.org/grpc"
12+
1213
"github.com/ydb-platform/ydb-go-sdk/v3/config"
1314
"github.com/ydb-platform/ydb-go-sdk/v3/coordination"
1415
"github.com/ydb-platform/ydb-go-sdk/v3/discovery"
@@ -102,7 +103,7 @@ type (
102103

103104
children map[uint64]*Driver
104105
childrenMtx xsync.Mutex
105-
onClose xsync.Map[uint64, func(c *Driver)]
106+
onClose []func(c *Driver)
106107
closed atomic.Bool
107108

108109
panicCallback func(e interface{})
@@ -163,11 +164,9 @@ func (d *Driver) Close(ctx context.Context) (finalErr error) {
163164
d.ctxCancel()
164165

165166
defer func() {
166-
d.onClose.Range(func(_ uint64, f func(c *Driver)) bool {
167-
f(d)
168-
169-
return true
170-
})
167+
for _, onClose := range d.onClose {
168+
onClose(d)
169+
}
171170
}()
172171

173172
closes := make([]func(context.Context) error, 0)

internal/xsql/connector.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ var (
3535
type (
3636
Engine uint8
3737
Connector struct {
38-
ID uint64
3938
parent ydbDriver
4039
balancer grpc.ClientConnInterface
4140

options.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,7 @@ func WithTraceDatabaseSQL(t trace.DatabaseSQL, opts ...trace.DatabaseSQLComposeO
832832

833833
func withOnClose(onClose func(c *Driver)) Option {
834834
return func(ctx context.Context, d *Driver) error {
835-
d.onClose.Append(onClose)
835+
d.onClose = append(d.onClose, onClose)
836836

837837
return nil
838838
}

sql.go

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import (
55
"database/sql"
66
"database/sql/driver"
77
"fmt"
8-
"sync/atomic"
98

109
"github.com/ydb-platform/ydb-go-sdk/v3/internal/bind"
1110
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1211
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql"
1312
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/legacy"
1413
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/propose"
15-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
1614
"github.com/ydb-platform/ydb-go-sdk/v3/table"
1715
"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
1816
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
@@ -33,9 +31,7 @@ func withConnectorOptions(opts ...ConnectorOption) Option {
3331
}
3432
}
3533

36-
type sqlDriver struct {
37-
connectors xsync.Map[*xsql.Connector, *Driver]
38-
}
34+
type sqlDriver struct{}
3935

4036
var (
4137
_ driver.Driver = &sqlDriver{}
@@ -53,45 +49,18 @@ func (d *sqlDriver) OpenConnector(dataSourceName string) (driver.Connector, erro
5349
return nil, xerrors.WithStackTrace(fmt.Errorf("failed to connect by data source name '%s': %w", dataSourceName, err))
5450
}
5551

56-
c, err := Connector(db, db.databaseSQLOptions...)
52+
c, err := Connector(db, append(db.databaseSQLOptions,
53+
xsql.WithOnClose(func(connector *xsql.Connector) {
54+
_ = db.Close(context.Background())
55+
}),
56+
)...)
5757
if err != nil {
5858
return nil, xerrors.WithStackTrace(fmt.Errorf("failed to create connector: %w", err))
5959
}
6060

6161
return c, nil
6262
}
6363

64-
var globalConnectorCounter atomic.Uint64
65-
66-
func (d *sqlDriver) attach(c *xsql.Connector, parent *Driver) {
67-
c.ID = globalConnectorCounter.Add(1)
68-
69-
if parent != nil {
70-
parent.onClose.Append(func(_ *Driver) {
71-
_ = c.Close()
72-
})
73-
}
74-
75-
d.connectors.Set(c, parent)
76-
}
77-
78-
func (d *sqlDriver) detach(c *xsql.Connector) {
79-
var countConnectorsPerDriver int
80-
parent, _ := d.connectors.Extract(c)
81-
if parent != nil {
82-
d.connectors.Range(func(key *xsql.Connector, value *Driver) bool {
83-
if value == parent {
84-
countConnectorsPerDriver++
85-
}
86-
87-
return true
88-
})
89-
if countConnectorsPerDriver == 0 {
90-
_ = parent.Close(context.Background())
91-
}
92-
}
93-
}
94-
9564
type QueryMode int
9665

9766
const (
@@ -255,7 +224,6 @@ func Connector(parent *Driver, opts ...ConnectorOption) (SQLConnector, error) {
255224
parent.databaseSQLOptions,
256225
opts...,
257226
),
258-
xsql.WithOnClose(d.detach),
259227
xsql.WithTraceRetry(parent.config.TraceRetry()),
260228
xsql.WithRetryBudget(parent.config.RetryBudget()),
261229
)...,
@@ -264,8 +232,6 @@ func Connector(parent *Driver, opts ...ConnectorOption) (SQLConnector, error) {
264232
return nil, xerrors.WithStackTrace(err)
265233
}
266234

267-
d.attach(c, parent)
268-
269235
return c, nil
270236
}
271237

tests/integration/helpers_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,11 +473,12 @@ func driverEngine(db *sql.DB) (engine xsql.Engine) {
473473
func simpleDetectGoroutineLeak(t *testing.T) {
474474
// 1) testing.go => main.main()
475475
// 2) current test
476-
const expectedGoroutinesCount = 2
476+
var expectedGoroutinesCount = 2
477477
if num := runtime.NumGoroutine(); num > expectedGoroutinesCount {
478478
bb := make([]byte, 2<<32)
479479
if n := runtime.Stack(bb, true); n < len(bb) {
480-
t.Error(fmt.Sprintf("unexpected goroutines:\n%s\n", string(bb[:n])))
480+
bb = bb[:n]
481481
}
482+
t.Error(fmt.Sprintf("unexpected goroutines:\n%s\n", string(bb[runtime.Stack(bb, false)+1:])))
482483
}
483484
}

0 commit comments

Comments
 (0)