ydb-platform / ydb-go-sdk

Pure Go native and database/sql driver for YDB
https://ydb.tech
Apache License 2.0
133 stars 69 forks source link

bug: table.Client.Do doesn't retries BAD_SESSION error #1227

Closed Nyoroon closed 2 months ago

Nyoroon commented 2 months ago

Bug Report

YDB GO SDK version: v3.62.0

Environment

Current behavior: table.Client.Do fails on BAD_SESSION error

Expected behavior: SDK transparently establish new session and retries query

Steps to reproduce:

Related code:

insert short code snippets here

Other information: Stacktrace:

non-retryable error occurred on attempt No.1 (idempotent=false):
connError{node_id:51256,address:'xxx:31001'}:
operation/BAD_SESSION (code = 400100, address = xxx:31001, issues = [{'Session not found: ydb://session/3?node_id=51256&id=ZGVjZTczMWMtOTgzNzVkYmYtZGY0ODZjOTktOTAyZDU0NzE='}])
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/conn.(*conn).Invoke(conn.go:375)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/balancer.(*Balancer).wrapCall(balancer.go:357)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/table.(*session).executeDataQuery(session.go:808)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/table.(*session).Execute(session.go:760)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/table.do.func1(retry.go:54)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/table.do.retryBackoff.func2(retry.go:85)`
at `github.com/ydb-platform/ydb-go-sdk/v3/retry.Retry(retry.go:314)`
at `github.com/ydb-platform/ydb-go-sdk/v3/internal/table.(*Client).Do(client.go:667)`
asmyasnikov commented 2 months ago

I added tests for retry status of BAD_SESSION https://github.com/ydb-platform/ydb-go-sdk/commit/e409e01a17b78336d5977b2684fd62271ceff147 Tests do not confirm the behavior on v3.62.0 and on master branches Please check - maybe you wrap a source error inside lambda such as

   err := db.Table().Do(ctx, func(ctx, s) error {
      err := s.Execute(ctx, ...)
      if err != nil {
        return myError{orig: err}
      }

      return nil
   })

?

Nyoroon commented 2 months ago

I added tests for retry status of BAD_SESSION e409e01 Tests do not confirm the behavior on v3.62.0 and on master branches Please check - maybe you wrap a source error inside lambda such as

   err := db.Table().Do(ctx, func(ctx, s) error {
      err := s.Execute(ctx, ...)
      if err != nil {
        return myError{orig: err}
      }

      return nil
   })

?

Thanks! There was indeed an error in our code.