Skip to content

Commit 8cecea9

Browse files
committed
refactoring of xsql.conn.checkClosed + add TestRegressionCloud109307
1 parent 05173fa commit 8cecea9

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

internal/xsql/badconn/badconn_go1.18.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func (e Error) As(target interface{}) bool {
4141

4242
func Map(err error) error {
4343
switch {
44+
case err == nil:
45+
return nil
4446
case xerrors.Is(err, driver.ErrBadConn):
4547
return err
4648
case retry.MustDeleteSession(err):

internal/xsql/conn.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,6 @@ func newConn(c *Connector, s table.ClosableSession, opts ...connOption) *conn {
9595
}
9696

9797
func (c *conn) checkClosed(err error) error {
98-
if c.isClosed() {
99-
return errClosedConn
100-
}
101-
if err == nil {
102-
return nil
103-
}
10498
if err = badconn.Map(err); xerrors.Is(err, driver.ErrBadConn) {
10599
c.setClosed()
106100
}

sql_e2e_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,20 @@ import (
77
"bytes"
88
"context"
99
"database/sql"
10+
"errors"
1011
"fmt"
12+
"math/rand"
1113
"os"
1214
"path"
1315
"testing"
1416
"text/template"
1517
"time"
1618

19+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
20+
1721
"github.com/ydb-platform/ydb-go-sdk/v3"
22+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
23+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/badconn"
1824
"github.com/ydb-platform/ydb-go-sdk/v3/retry"
1925
"github.com/ydb-platform/ydb-go-sdk/v3/sugar"
2026
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
@@ -555,3 +561,56 @@ func render(t *template.Template, data interface{}) string {
555561
}
556562
return buf.String()
557563
}
564+
565+
func TestRegressionCloud109307(t *testing.T) {
566+
db, err := sql.Open("ydb", os.Getenv("YDB_CONNECTION_STRING"))
567+
if err != nil {
568+
t.Fatal(err)
569+
}
570+
571+
ctx, cancel := context.WithTimeout(context.Background(), 42*time.Second)
572+
defer cancel()
573+
574+
for i := int64(1); ; i++ {
575+
if ctx.Err() != nil {
576+
break
577+
}
578+
579+
if err = retry.DoTx(ctx, db, func(ctx context.Context, tx *sql.Tx) error {
580+
//nolint:gosec
581+
if rand.Int31n(3) == 0 {
582+
return badconn.Map(xerrors.Operation(xerrors.WithStatusCode(Ydb.StatusIds_BAD_SESSION)))
583+
}
584+
var rows *sql.Rows
585+
rows, err = tx.QueryContext(ctx, `
586+
DECLARE $i AS Int64;
587+
588+
SELECT $i;
589+
`, sql.Named("i", i))
590+
if err != nil {
591+
return err
592+
}
593+
defer rows.Close()
594+
if !rows.Next() {
595+
return errors.New("no rows")
596+
}
597+
var result interface{}
598+
if err = rows.Scan(&result); err != nil {
599+
return err
600+
}
601+
if result.(int64)%100 == 0 {
602+
t.Logf("result: %+v\n", result)
603+
}
604+
return rows.Err()
605+
}, retry.WithTxOptions(&sql.TxOptions{
606+
Isolation: sql.LevelSnapshot,
607+
ReadOnly: true,
608+
}), retry.WithDoTxRetryOptions(
609+
retry.WithIdempotent(true),
610+
)); err != nil {
611+
if ctx.Err() == nil {
612+
t.Fatalf("error: %+v\n", err)
613+
}
614+
}
615+
}
616+
}

0 commit comments

Comments
 (0)