From d74f9faa65cdaee123d67e6a1061321c5735d529 Mon Sep 17 00:00:00 2001 From: Artem Murashko Date: Thu, 18 Jan 2024 15:34:05 +0300 Subject: [PATCH 01/65] fix inf reconnections --- internal/topic/retriable_error.go | 4 ++ internal/topic/retriable_error_test.go | 38 +++++++++++++++++++ .../topicwriterinternal/writer_reconnector.go | 2 +- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/internal/topic/retriable_error.go b/internal/topic/retriable_error.go index c750338cb..2154bf87b 100644 --- a/internal/topic/retriable_error.go +++ b/internal/topic/retriable_error.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ydb-platform/ydb-go-sdk/v3/internal/backoff" + "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/retry" ) @@ -44,6 +45,9 @@ var ( func CheckResetReconnectionCounters(lastTry, now time.Time, connectionTimeout time.Duration) bool { const resetAttemptEmpiricalCoefficient = 10 + if connectionTimeout == value.InfiniteDuration { + return false + } return now.Sub(lastTry) > connectionTimeout*resetAttemptEmpiricalCoefficient } diff --git a/internal/topic/retriable_error_test.go b/internal/topic/retriable_error_test.go index 79e8e7128..2dc85a376 100644 --- a/internal/topic/retriable_error_test.go +++ b/internal/topic/retriable_error_test.go @@ -12,6 +12,7 @@ import ( grpcStatus "google.golang.org/grpc/status" "github.com/ydb-platform/ydb-go-sdk/v3/internal/backoff" + "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" ) @@ -232,3 +233,40 @@ func TestCheckRetryMode(t *testing.T) { }) } } + +func TestCheckResetReconnectionCounters(t *testing.T) { + now := time.Now() + fmt.Println(now.Sub(now.Add(-61 * time.Second))) + table := []struct { + name string + lastTry time.Time + connectionTimeout time.Duration + shouldReset bool + }{ + { + name: "InfiniteConnectionTimeout", + lastTry: time.Time{}, + connectionTimeout: value.InfiniteDuration, + shouldReset: false, + }, + { + name: "LastTryLessThanConnectionTimeout", + lastTry: now.Add(-30 * time.Second), + connectionTimeout: time.Minute, + shouldReset: false, + }, + { + name: "LastTryGreaterThanConnectionTimeout", + lastTry: now.Add(-time.Hour), + connectionTimeout: time.Minute, + shouldReset: true, + }, + } + + for _, test := range table { + t.Run(test.name, func(t *testing.T) { + shouldReset := CheckResetReconnectionCounters(test.lastTry, now, test.connectionTimeout) + require.Equal(t, test.shouldReset, shouldReset) + }) + } +} diff --git a/internal/topic/topicwriterinternal/writer_reconnector.go b/internal/topic/topicwriterinternal/writer_reconnector.go index c9b7ab48d..4415d21fa 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector.go +++ b/internal/topic/topicwriterinternal/writer_reconnector.go @@ -369,7 +369,7 @@ func (w *WriterReconnector) connectionLoop(ctx context.Context) { streamCtx, streamCtxCancel = createStreamContext() now := time.Now() - if topic.CheckResetReconnectionCounters(prevAttemptTime, now, w.cfg.connectTimeout) { + if startOfRetries.IsZero() || topic.CheckResetReconnectionCounters(prevAttemptTime, now, w.cfg.connectTimeout) { attempt = 0 startOfRetries = w.clock.Now() } else { From 999f7473aa74ccd8f05badf0e7ebc2300dad6ddf Mon Sep 17 00:00:00 2001 From: Artem Murashko Date: Thu, 18 Jan 2024 15:38:56 +0300 Subject: [PATCH 02/65] small refactoring --- internal/topic/retriable_error.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/topic/retriable_error.go b/internal/topic/retriable_error.go index 2154bf87b..90ab37981 100644 --- a/internal/topic/retriable_error.go +++ b/internal/topic/retriable_error.go @@ -93,9 +93,10 @@ func CheckRetryMode(err error, settings RetrySettings, retriesDuration time.Dura return nil, false } - if mode.BackoffType() == backoff.TypeFast { + switch mode.BackoffType() { + case backoff.TypeFast: return backoff.Fast, true + default: + return backoff.Slow, true } - - return backoff.Slow, true } From 00fb00231e653ba44d4b797b9ad59d2e7c6f3108 Mon Sep 17 00:00:00 2001 From: Artem Murashko Date: Thu, 18 Jan 2024 16:04:24 +0300 Subject: [PATCH 03/65] rm debug print --- internal/topic/retriable_error_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/topic/retriable_error_test.go b/internal/topic/retriable_error_test.go index 2dc85a376..6136a2bc6 100644 --- a/internal/topic/retriable_error_test.go +++ b/internal/topic/retriable_error_test.go @@ -236,7 +236,6 @@ func TestCheckRetryMode(t *testing.T) { func TestCheckResetReconnectionCounters(t *testing.T) { now := time.Now() - fmt.Println(now.Sub(now.Add(-61 * time.Second))) table := []struct { name string lastTry time.Time From efb74fae8187bfa67f4e54bb562df615cb617670 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Fri, 19 Jan 2024 18:35:16 +0300 Subject: [PATCH 04/65] init test start --- go.mod | 4 +- go.sum | 2 + tests/integration/helpers_test.go | 10 ++++ tests/mocked/scope.go | 81 +++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 tests/mocked/scope.go diff --git a/go.mod b/go.mod index db13a5944..5a9743c55 100644 --- a/go.mod +++ b/go.mod @@ -15,9 +15,9 @@ require ( // requires for tests only require ( - go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec // indirect - github.com/rekby/fixenv v0.3.2 + github.com/rekby/fixenv v0.6.1 github.com/stretchr/testify v1.7.1 + go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec // indirect ) require ( diff --git a/go.sum b/go.sum index f58f0f4f3..8d95a5bb5 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rekby/fixenv v0.3.2 h1:6AOdQ9Boaa/lOQJTY8GDmQRIhg3S3SD0mIEPkuDSkoQ= github.com/rekby/fixenv v0.3.2/go.mod h1:/b5LRc06BYJtslRtHKxsPWFT/ySpHV+rWvzTg+XWk4c= +github.com/rekby/fixenv v0.6.1 h1:jUFiSPpajT4WY2cYuc++7Y1zWrnCxnovGCIX72PZniM= +github.com/rekby/fixenv v0.6.1/go.mod h1:/b5LRc06BYJtslRtHKxsPWFT/ySpHV+rWvzTg+XWk4c= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= diff --git a/tests/integration/helpers_test.go b/tests/integration/helpers_test.go index 6a1a6afa4..730241e04 100644 --- a/tests/integration/helpers_test.go +++ b/tests/integration/helpers_test.go @@ -67,6 +67,16 @@ func (scope *scopeT) Failed() bool { return scope.t.Failed() } +// CacheWithCleanup wrap new interface as deprecated - for prevent re-write a lot of code +// in new code prefer to use generic version of cache: fixenv.CacheResult(env, ...) +func (scope *scopeT) CacheWithCleanup(cacheKey interface{}, opt *fixenv.FixtureOptions, f fixenv.FixtureCallbackWithCleanupFunc) interface{} { + fWrap := func() (*fixenv.Result, error) { + res, cleanup, err := f() + return fixenv.NewResultWithCleanup(res, cleanup), err + } + return scope.CacheResult(fWrap) +} + func (scope *scopeT) ConnectionString() string { if envString := os.Getenv("YDB_CONNECTION_STRING"); envString != "" { return envString diff --git a/tests/mocked/scope.go b/tests/mocked/scope.go new file mode 100644 index 000000000..82005e21c --- /dev/null +++ b/tests/mocked/scope.go @@ -0,0 +1,81 @@ +package mocked + +import ( + "context" + "fmt" + "net" + "testing" + + "github.com/rekby/fixenv" + "github.com/rekby/fixenv/sf" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +type scopeT struct { + Ctx context.Context + fixenv.Env + Require *require.Assertions + t testing.TB +} + +func newScope(t *testing.T) *scopeT { + at := require.New(t) + fEnv := fixenv.NewEnv(t) + ctx, ctxCancel := context.WithCancel(context.Background()) + t.Cleanup(func() { + ctxCancel() + }) + res := &scopeT{ + Ctx: ctx, + Env: fEnv, + Require: at, + t: t, + } + return res +} + +func (scope *scopeT) T() testing.TB { + return scope.t +} + +func (scope *scopeT) Logf(format string, args ...interface{}) { + scope.t.Helper() + scope.t.Logf(format, args...) +} + +func (scope *scopeT) Failed() bool { + return scope.t.Failed() +} + +type serviceImplementationMap map[*grpc.ServiceDesc]any // service description -> service implementation + +func (scope *scopeT) StartYDBMock(services serviceImplementationMap) string { + grpcServer := grpc.NewServer() + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + scope.T().Fatal("Failed to listen port for ydb mock: %+v", err) + } + scope.T().Cleanup(func() { + grpcServer.Stop() + _ = listener.Close() + }) + + for service, impl := range services { + grpcServer.RegisterService(service, impl) + } + + go func() { + err := grpcServer.Serve(listener) + if err != nil { + scope.T().Fatal("failed to start grpc server: %+v", err) + } + }() + + connString := fmt.Sprintf("grpc://%s/local", listener.Addr()) + return connString +} + +func (scope *scopeT) MockYdbListener() net.Listener { + return sf.LocalTCPListenerNamed(scope.Env, "ydb-mock") +} From 8156bc8257c8559ef7351f10e59e845767c9b8bd Mon Sep 17 00:00:00 2001 From: v1tbrah Date: Wed, 24 Jan 2024 23:38:32 +0600 Subject: [PATCH 05/65] fix: Make the error StatusIds_SESSION_EXPIRED retriable --- examples/go.mod | 2 +- examples/go.sum | 8 ++++++++ internal/xerrors/operation.go | 3 ++- retry/errors_data_test.go | 4 ++-- tests/slo/go.sum | 8 ++++++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 141a8779d..10fad853c 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -53,7 +53,7 @@ require ( github.com/ydb-platform/ydb-go-sdk-metrics v0.16.3 // indirect github.com/ydb-platform/ydb-go-yc-metadata v0.5.4 // indirect golang.org/x/crypto v0.17.0 // indirect - golang.org/x/mod v0.9.0 // indirect + golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.15.0 // indirect diff --git a/examples/go.sum b/examples/go.sum index 57cee1bb6..a14a6cdb0 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1239,6 +1239,7 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1265,6 +1266,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= @@ -1323,10 +1325,12 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1387,6 +1391,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= @@ -1537,6 +1542,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1550,6 +1556,7 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= @@ -1650,6 +1657,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index 36998f66e..17871b121 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -164,7 +164,8 @@ func (e *operationError) Type() Type { Ydb.StatusIds_UNAVAILABLE, Ydb.StatusIds_OVERLOADED, Ydb.StatusIds_BAD_SESSION, - Ydb.StatusIds_SESSION_BUSY: + Ydb.StatusIds_SESSION_BUSY, + Ydb.StatusIds_SESSION_EXPIRED: return TypeRetryable case Ydb.StatusIds_UNDETERMINED: return TypeConditionallyRetryable diff --git a/retry/errors_data_test.go b/retry/errors_data_test.go index b8dcddcd8..0023cad56 100644 --- a/retry/errors_data_test.go +++ b/retry/errors_data_test.go @@ -408,8 +408,8 @@ var errsToCheck = []struct { backoff: backoff.TypeNoBackoff, deleteSession: true, canRetry: map[idempotency]bool{ - idempotent: false, - nonIdempotent: false, + idempotent: true, + nonIdempotent: true, }, }, { diff --git a/tests/slo/go.sum b/tests/slo/go.sum index e12fb847f..1f3004c57 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1074,6 +1074,7 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1097,6 +1098,7 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1153,10 +1155,12 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1214,6 +1218,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= @@ -1357,6 +1362,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1369,6 +1375,7 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= @@ -1465,6 +1472,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= From 010027bb01d8fad8e6dd0f39b8f8ca46206ac60d Mon Sep 17 00:00:00 2001 From: v1tbrah Date: Wed, 24 Jan 2024 23:50:52 +0600 Subject: [PATCH 06/65] docs(changelog): Add info about v3.55.1 vesion changes --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5230596b9..21d271575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## v3.55.1 +* Made StatusIds_SESSION_EXPIRED retriable + ## v3.55.0 * Refactored `internal/value/intervalValue.Yql()` * The minimum version of Go in `ydb-go-sdk` has been raised to `go1.20` From b5e926dcd906d473e97a38ad028f11152714aa3b Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:14:11 +0300 Subject: [PATCH 07/65] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d271575..45a3125b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,3 @@ -## v3.55.1 * Made StatusIds_SESSION_EXPIRED retriable ## v3.55.0 From dd48b13c7d41ddedac500262dd267989525898c0 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:14:19 +0300 Subject: [PATCH 08/65] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a3125b1..532f2fcbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -* Made StatusIds_SESSION_EXPIRED retriable +* Made `StatusIds_SESSION_EXPIRED` retriable ## v3.55.0 * Refactored `internal/value/intervalValue.Yql()` From 6d9f942595a74a311030aa85c89722938ef033f6 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:14:27 +0300 Subject: [PATCH 09/65] Update internal/xerrors/operation.go --- internal/xerrors/operation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index 17871b121..837711f0f 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -164,7 +164,7 @@ func (e *operationError) Type() Type { Ydb.StatusIds_UNAVAILABLE, Ydb.StatusIds_OVERLOADED, Ydb.StatusIds_BAD_SESSION, - Ydb.StatusIds_SESSION_BUSY, + Ydb.StatusIds_SESSION_BUSY: Ydb.StatusIds_SESSION_EXPIRED: return TypeRetryable case Ydb.StatusIds_UNDETERMINED: From f4cddaebd20f0d2fe88caac0e3e1d8b5b98cd03a Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:14:33 +0300 Subject: [PATCH 10/65] Update internal/xerrors/operation.go --- internal/xerrors/operation.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index 837711f0f..36998f66e 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -165,7 +165,6 @@ func (e *operationError) Type() Type { Ydb.StatusIds_OVERLOADED, Ydb.StatusIds_BAD_SESSION, Ydb.StatusIds_SESSION_BUSY: - Ydb.StatusIds_SESSION_EXPIRED: return TypeRetryable case Ydb.StatusIds_UNDETERMINED: return TypeConditionallyRetryable From ce72689d748f73f067787bc62b74d70b2db2075c Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:14:39 +0300 Subject: [PATCH 11/65] Update retry/errors_data_test.go --- retry/errors_data_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retry/errors_data_test.go b/retry/errors_data_test.go index 0023cad56..2a7edf076 100644 --- a/retry/errors_data_test.go +++ b/retry/errors_data_test.go @@ -409,7 +409,7 @@ var errsToCheck = []struct { deleteSession: true, canRetry: map[idempotency]bool{ idempotent: true, - nonIdempotent: true, + nonIdempotent: false, }, }, { From c25fc5bcab45a5aee831a78227755ce1278fc7a2 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:16:27 +0300 Subject: [PATCH 12/65] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 532f2fcbf..f9c19fc70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -* Made `StatusIds_SESSION_EXPIRED` retriable +* Made `StatusIds_SESSION_EXPIRED` retriable for idempotent operations ## v3.55.0 * Refactored `internal/value/intervalValue.Yql()` From 143421aeba51f998544fa21509c6fe3c96497b60 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:20:12 +0300 Subject: [PATCH 13/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 1f3004c57..59627f14c 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1074,7 +1074,6 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= From f99c91e382dd69e6d67e138c3f32449249a44395 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:20:31 +0300 Subject: [PATCH 14/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index a14a6cdb0..99c72c76c 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1556,7 +1556,6 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= From c8a834b8950868ab349e4748029e818ce678857b Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:20:40 +0300 Subject: [PATCH 15/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index 99c72c76c..e761e10ea 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1656,7 +1656,6 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= From 79c9249c71de16e8d3556ce02140d0cde038debd Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:20:47 +0300 Subject: [PATCH 16/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index e761e10ea..6629fba1f 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1542,7 +1542,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From ff9465fae1cdec999e9688929804a09cb6e64660 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:20:53 +0300 Subject: [PATCH 17/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 59627f14c..c5b6388b4 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1097,7 +1097,6 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= From 3dd700ca037d14b4bf1baa42f815987329921c34 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:00 +0300 Subject: [PATCH 18/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index c5b6388b4..73a6c22e5 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1153,7 +1153,6 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= From a0f6b2c283ffae6e064c8725f59c46183df63d52 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:06 +0300 Subject: [PATCH 19/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 73a6c22e5..57bd973fe 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1157,7 +1157,6 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 28cf0f3b88eddafdb9a802aa99939fbdd454d727 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:11 +0300 Subject: [PATCH 20/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 57bd973fe..aca85b3c0 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1214,7 +1214,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= From 09dfecb1abce2acb64b058659e57f238f5d63a1f Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:17 +0300 Subject: [PATCH 21/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index 6629fba1f..7a391d650 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1330,7 +1330,6 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From eab73621212348fc399f5fd694e51a17874a7eb6 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:22 +0300 Subject: [PATCH 22/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index 7a391d650..94c671b9b 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1390,7 +1390,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= From 8c19a5a731ee352a4dae906eeb2e6df2da147763 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:32 +0300 Subject: [PATCH 23/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index aca85b3c0..0104c064f 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1357,7 +1357,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 8be3209b91ddc44ccedd8204938c58be607fc3ad Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:42 +0300 Subject: [PATCH 24/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 0104c064f..496c3d1bd 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1369,7 +1369,6 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= From 7af45c13e8b288606933f397e20e3f55c11e10a9 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:51 +0300 Subject: [PATCH 25/65] Update tests/slo/go.sum --- tests/slo/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 496c3d1bd..e12fb847f 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1465,7 +1465,6 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= From 0fd8208b5cb3f8247dd36ab63e2fe7792f2a4c87 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:21:59 +0300 Subject: [PATCH 26/65] Update examples/go.mod --- examples/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/go.mod b/examples/go.mod index 10fad853c..141a8779d 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -53,7 +53,7 @@ require ( github.com/ydb-platform/ydb-go-sdk-metrics v0.16.3 // indirect github.com/ydb-platform/ydb-go-yc-metadata v0.5.4 // indirect golang.org/x/crypto v0.17.0 // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/mod v0.9.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.15.0 // indirect From 10ca8280c3605e3d78b5b3d9222702abe26f1eac Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:22:09 +0300 Subject: [PATCH 27/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index 94c671b9b..ff5319835 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1239,7 +1239,6 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= From 43770858618c5b47c8c6a8c22fc21d24e5c0342e Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:22:16 +0300 Subject: [PATCH 28/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index ff5319835..07e32844a 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1265,7 +1265,6 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= From acbe37026003afbd2558274494d2da8bf502badc Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:22:24 +0300 Subject: [PATCH 29/65] Update examples/go.sum --- examples/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/go.sum b/examples/go.sum index 07e32844a..57cee1bb6 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1323,7 +1323,6 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= From 713844cc8816a916aa10a9e37fa23330021073a1 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:24:16 +0300 Subject: [PATCH 30/65] Update operation.go --- internal/xerrors/operation.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index 36998f66e..aaa17b9d0 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -166,7 +166,9 @@ func (e *operationError) Type() Type { Ydb.StatusIds_BAD_SESSION, Ydb.StatusIds_SESSION_BUSY: return TypeRetryable - case Ydb.StatusIds_UNDETERMINED: + case + Ydb.StatusIds_UNDETERMINED, + Ydb.StatusIds_SESSION_EXPIRED: return TypeConditionallyRetryable default: return TypeUndefined From 41a55ef2838955477539af26b652a8e5f1715c1b Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Thu, 25 Jan 2024 12:45:32 +0300 Subject: [PATCH 31/65] Update internal/xerrors/operation.go --- internal/xerrors/operation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index aaa17b9d0..2451c8ca8 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -166,7 +166,7 @@ func (e *operationError) Type() Type { Ydb.StatusIds_BAD_SESSION, Ydb.StatusIds_SESSION_BUSY: return TypeRetryable - case + case Ydb.StatusIds_UNDETERMINED, Ydb.StatusIds_SESSION_EXPIRED: return TypeConditionallyRetryable From 2b14af7a95fda68ff2338125a77e12c242f0a347 Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Fri, 26 Jan 2024 15:49:11 +0300 Subject: [PATCH 32/65] update genproto --- examples/go.mod | 2 +- examples/go.sum | 2 ++ go.mod | 2 +- go.sum | 2 ++ tests/slo/go.mod | 2 +- tests/slo/go.sum | 2 ++ 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 99df99e38..1f950937c 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -49,7 +49,7 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/syndtr/goleveldb v1.0.0 // indirect github.com/yandex-cloud/go-genproto v0.0.0-20220815090733-4c139c0154e2 // indirect - github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 // indirect + github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf // indirect github.com/ydb-platform/ydb-go-sdk-metrics v0.16.3 // indirect github.com/ydb-platform/ydb-go-yc-metadata v0.5.4 // indirect golang.org/x/crypto v0.17.0 // indirect diff --git a/examples/go.sum b/examples/go.sum index 9a3ce87b5..594e5ce12 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1196,6 +1196,8 @@ github.com/ydb-platform/xorm v0.0.3 h1:MXk42lANB6r/MMLg/XdJfyXJycGUDlCeLiMlLGDKV github.com/ydb-platform/xorm v0.0.3/go.mod h1:hFsU7EUF0o3S+l5c0eyP2yPVjJ0d4gsFdqCsyazzwBc= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 h1:E8Z7Zy/fKKDN4bYE1GvXX3DSjp9j7bPJy8Nnpe4Hxqg= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-sdk-auth-environ v0.1.2 h1:EYSI1kulnHb0H0zt3yOw4cRj4ABMSMGwNe43D+fX7e4= github.com/ydb-platform/ydb-go-sdk-auth-environ v0.1.2/go.mod h1:Xfjce+VMU9yJVr1lj60yK2fFPWjB4jr/4cp3K7cjzi4= github.com/ydb-platform/ydb-go-sdk-metrics v0.16.3 h1:30D5jErLAiGjchVG2D9JiCLbST5LpAiyS7DoUtHkWsU= diff --git a/go.mod b/go.mod index 944158781..cef15c34c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.4.1 github.com/google/uuid v1.3.0 github.com/jonboulle/clockwork v0.3.0 - github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 + github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf golang.org/x/sync v0.3.0 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/grpc v1.57.1 diff --git a/go.sum b/go.sum index 3e6771a84..db0f2a151 100644 --- a/go.sum +++ b/go.sum @@ -70,6 +70,8 @@ github.com/ydb-platform/ydb-go-genproto v0.0.0-20231215113745-46f6d30f974a h1:9w github.com/ydb-platform/ydb-go-genproto v0.0.0-20231215113745-46f6d30f974a/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 h1:E8Z7Zy/fKKDN4bYE1GvXX3DSjp9j7bPJy8Nnpe4Hxqg= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/mock v0.3.1-0.20231011042131-892b665398ec h1:aB0WVMCyiVcqL1yMRLM4htiFlMvgdOml97GYnw9su5Q= diff --git a/tests/slo/go.mod b/tests/slo/go.mod index 050f2aae6..c2674885b 100644 --- a/tests/slo/go.mod +++ b/tests/slo/go.mod @@ -33,7 +33,7 @@ require ( github.com/prometheus/procfs v0.8.0 // indirect github.com/syndtr/goleveldb v1.0.0 // indirect github.com/yandex-cloud/go-genproto v0.0.0-20230403093326-123923969dc6 // indirect - github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 // indirect + github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf // indirect github.com/ydb-platform/ydb-go-sdk-auth-environ v0.2.0 // indirect github.com/ydb-platform/ydb-go-yc v0.10.2 // indirect github.com/ydb-platform/ydb-go-yc-metadata v0.5.3 // indirect diff --git a/tests/slo/go.sum b/tests/slo/go.sum index 52ed5fa01..41160165a 100644 --- a/tests/slo/go.sum +++ b/tests/slo/go.sum @@ -1040,6 +1040,8 @@ github.com/ydb-platform/xorm v0.0.6 h1:mlclMIXR7Obwho3cYIIgBoMlMZ+APJZ9gnJQICyVA github.com/ydb-platform/xorm v0.0.6/go.mod h1:vLAI6Xqpa+48y9I9HJnjD6IDKp/GnATYbtDgWzQb88c= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780 h1:E8Z7Zy/fKKDN4bYE1GvXX3DSjp9j7bPJy8Nnpe4Hxqg= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240125100710-96fd3a874780/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-sdk-auth-environ v0.2.0 h1:IG5bPd+Lqyc+zsw2kmxqfGLkaDHuAEnWX63/8RBBiA4= github.com/ydb-platform/ydb-go-sdk-auth-environ v0.2.0/go.mod h1:l6lZ+osdQOjDRBgRA4PQ06BuvmXN2neYjnRw8rCfd7s= github.com/ydb-platform/ydb-go-yc v0.10.2 h1:RAHy6g7ncxk1y0N4oS2MwYXLATqRqKBI6DYXuxpV2wo= From 931aeaa53bb8c5214ac5e697f0822daba23fc93d Mon Sep 17 00:00:00 2001 From: Aleksey Myasnikov Date: Wed, 20 Sep 2023 20:44:24 +0300 Subject: [PATCH 33/65] * Supported column name prefix `__discard_column_` for discard columns in result sets --- CHANGELOG.md | 1 + internal/xsql/rows.go | 7 ++- .../database_sql_ignore_placeholder_test.go | 43 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tests/integration/database_sql_ignore_placeholder_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index f9c19fc70..d61d669d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* Supported column name prefix `__discard_column_` for discard columns in result sets * Made `StatusIds_SESSION_EXPIRED` retriable for idempotent operations ## v3.55.0 diff --git a/internal/xsql/rows.go b/internal/xsql/rows.go index b3adf339b..d4a1ded6e 100644 --- a/internal/xsql/rows.go +++ b/internal/xsql/rows.go @@ -5,6 +5,7 @@ import ( "database/sql" "database/sql/driver" "io" + "strings" "sync" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" @@ -23,6 +24,8 @@ var ( _ driver.Rows = &single{} _ types.Scanner = &valuer{} + + ignoreColumnPrefixName = "__discard_column_" ) type rows struct { @@ -43,7 +46,9 @@ func (r *rows) Columns() []string { }) cs := make([]string, 0, r.result.CurrentResultSet().ColumnCount()) r.result.CurrentResultSet().Columns(func(m options.Column) { - cs = append(cs, m.Name) + if !strings.HasPrefix(m.Name, ignoreColumnPrefixName) { + cs = append(cs, m.Name) + } }) return cs } diff --git a/tests/integration/database_sql_ignore_placeholder_test.go b/tests/integration/database_sql_ignore_placeholder_test.go new file mode 100644 index 000000000..8bc6cac27 --- /dev/null +++ b/tests/integration/database_sql_ignore_placeholder_test.go @@ -0,0 +1,43 @@ +//go:build integration +// +build integration + +package integration + +import ( + "context" + "database/sql" + "testing" + "time" + + "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/retry" +) + +func TestDatabaseSqlDiscardColumn(t *testing.T) { + scope := newScope(t) + db := scope.SQLDriverWithFolder( + ydb.WithTablePathPrefix(scope.Folder()), + ydb.WithAutoDeclare(), + ydb.WithNumericArgs(), + ) + dt := time.Date(2023, 3, 1, 16, 34, 18, 0, time.UTC) + + var row *sql.Row + err := retry.Retry(scope.Ctx, func(ctx context.Context) (err error) { + row = db.QueryRowContext(ctx, ` + SELECT + $1 AS vInt, + $2 AS __discard_column_1, + $3 AS __discard_column_2, + $4 AS __discard_column_3 + `, 1, "2", 3.0, dt, + ) + return row.Err() + }) + scope.Require.NoError(err) + + var resInt int + scope.Require.NoError(row.Scan(&resInt)) + + scope.Require.Equal(1, resInt) +} From fd8aa3333141ae1d994fde7591169b56137fe5e1 Mon Sep 17 00:00:00 2001 From: robot Date: Fri, 26 Jan 2024 19:34:01 +0000 Subject: [PATCH 34/65] Release v3.55.1 --- CHANGELOG.md | 1 + internal/version/version.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d61d669d6..cf9f5a1e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +## v3.55.1 * Supported column name prefix `__discard_column_` for discard columns in result sets * Made `StatusIds_SESSION_EXPIRED` retriable for idempotent operations diff --git a/internal/version/version.go b/internal/version/version.go index 1a57d5071..519235f83 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -3,7 +3,7 @@ package version const ( Major = "3" Minor = "55" - Patch = "0" + Patch = "1" Prefix = "ydb-go-sdk" ) From e8f20d421ce5106ad40470972f47f8e00b7ade93 Mon Sep 17 00:00:00 2001 From: Artem Murashko Date: Sat, 27 Jan 2024 16:04:10 +0300 Subject: [PATCH 35/65] fix test --- internal/topic/topicwriterinternal/writer_reconnector_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/topic/topicwriterinternal/writer_reconnector_test.go b/internal/topic/topicwriterinternal/writer_reconnector_test.go index a029154c7..0c33ab408 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector_test.go +++ b/internal/topic/topicwriterinternal/writer_reconnector_test.go @@ -516,7 +516,7 @@ func TestWriterImpl_Reconnect(t *testing.T) { err := w.Write(ctx, newTestMessages(1)) require.NoError(t, err) - xtest.WaitChannelClosed(t, connectionLoopStopped) + xtest.WaitChannelClosedWithTimeout(t, connectionLoopStopped, 4*time.Second) }) } From 827dcdfd73bd4ac4712f28e26bbe134114872147 Mon Sep 17 00:00:00 2001 From: size12 Date: Sun, 28 Jan 2024 21:38:56 +0300 Subject: [PATCH 36/65] enabled gci --- .golangci.yml | 9 ++++++++- internal/cmd/gtrace/main.go | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index e58998c24..fa885dd11 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -64,6 +64,14 @@ linters-settings: # put imports beginning with prefix after 3rd-party packages; # it's a comma-separated list of prefixes local-prefixes: github.com/ydb-platform/ydb-go-sdk/v3 + gci: + sections: + - standard # Standard section: captures all standard packages. + - default # Default section: contains all imports that could not be matched to another section type. + - prefix(github.com/ydb-platform/ydb-go-sdk/v3) # Custom section: groups all imports with the specified Prefix. + - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled. + - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled. + skip-generated: true goconst: # minimal length of string constant, 3 by default min-len: 2 @@ -220,7 +228,6 @@ linters: - forbidigo - forcetypeassert - funlen - - gci - gochecknoglobals - gocognit - godot diff --git a/internal/cmd/gtrace/main.go b/internal/cmd/gtrace/main.go index 95a72f0c2..0edfe66ff 100644 --- a/internal/cmd/gtrace/main.go +++ b/internal/cmd/gtrace/main.go @@ -16,9 +16,10 @@ import ( "os" "path/filepath" "strings" - _ "unsafe" // For go:linkname. "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" + + _ "unsafe" // For go:linkname. ) //go:linkname build_goodOSArchFile go/build.(*Context).goodOSArchFile From f50d36b6415e1df9c5f0d52704041af25213473e Mon Sep 17 00:00:00 2001 From: size12 Date: Sun, 28 Jan 2024 21:56:50 +0300 Subject: [PATCH 37/65] fix --- examples/auth/environ/main.go | 1 - examples/auth/metadata_credentials/main.go | 3 +-- examples/auth/service_account_credentials/main.go | 3 +-- examples/basic/database_sql/data.go | 1 - examples/basic/database_sql/main.go | 1 - examples/basic/native/main.go | 1 - examples/basic/xorm/main.go | 4 ++-- examples/ddl/main.go | 1 - examples/decimal/main.go | 1 - examples/describe/main.go | 4 ++-- examples/pagination/main.go | 1 - examples/read_table/main.go | 1 - examples/serverless/healthcheck/service.go | 1 - examples/serverless/url_shortener/service.go | 1 - examples/topic/cdc-fill-and-read/main.go | 1 - examples/topic/topicreader/topicreader_simple.go | 3 +-- examples/ttl/main.go | 1 - examples/ttl_readtable/main.go | 1 - 18 files changed, 7 insertions(+), 23 deletions(-) diff --git a/examples/auth/environ/main.go b/examples/auth/environ/main.go index 86dd1b01c..0ab5d2228 100644 --- a/examples/auth/environ/main.go +++ b/examples/auth/environ/main.go @@ -6,7 +6,6 @@ import ( "os" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/auth/metadata_credentials/main.go b/examples/auth/metadata_credentials/main.go index 00e55ffc2..073025b53 100644 --- a/examples/auth/metadata_credentials/main.go +++ b/examples/auth/metadata_credentials/main.go @@ -6,9 +6,8 @@ import ( "fmt" "os" - yc "github.com/ydb-platform/ydb-go-yc" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" + yc "github.com/ydb-platform/ydb-go-yc" ) var dsn string diff --git a/examples/auth/service_account_credentials/main.go b/examples/auth/service_account_credentials/main.go index 879ea9ba7..160d488b8 100644 --- a/examples/auth/service_account_credentials/main.go +++ b/examples/auth/service_account_credentials/main.go @@ -6,9 +6,8 @@ import ( "fmt" "os" - yc "github.com/ydb-platform/ydb-go-yc" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" + yc "github.com/ydb-platform/ydb-go-yc" ) var ( diff --git a/examples/basic/database_sql/data.go b/examples/basic/database_sql/data.go index 279c895be..74f94c84f 100644 --- a/examples/basic/database_sql/data.go +++ b/examples/basic/database_sql/data.go @@ -8,7 +8,6 @@ import ( "time" "github.com/google/uuid" - "github.com/ydb-platform/ydb-go-sdk/v3/table/types" ) diff --git a/examples/basic/database_sql/main.go b/examples/basic/database_sql/main.go index 0c44ce7b9..e4c31bfe9 100644 --- a/examples/basic/database_sql/main.go +++ b/examples/basic/database_sql/main.go @@ -9,7 +9,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/native/main.go b/examples/basic/native/main.go index e2cfd23df..43be4ae9a 100644 --- a/examples/basic/native/main.go +++ b/examples/basic/native/main.go @@ -8,7 +8,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/xorm/main.go b/examples/basic/xorm/main.go index be8f8cbcc..f32e3c5ab 100644 --- a/examples/basic/xorm/main.go +++ b/examples/basic/xorm/main.go @@ -6,13 +6,13 @@ import ( "os" "time" - _ "github.com/lib/pq" - _ "modernc.org/sqlite" "xorm.io/builder" "xorm.io/xorm" xormLog "xorm.io/xorm/log" + _ "github.com/lib/pq" _ "github.com/ydb-platform/ydb-go-sdk/v3" + _ "modernc.org/sqlite" ) var envNotFoundMessage = `DSN environment variable not defined diff --git a/examples/ddl/main.go b/examples/ddl/main.go index 75bd8576d..6e219b001 100644 --- a/examples/ddl/main.go +++ b/examples/ddl/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/decimal/main.go b/examples/decimal/main.go index 1662dc983..7f79d4850 100644 --- a/examples/decimal/main.go +++ b/examples/decimal/main.go @@ -9,7 +9,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/describe/main.go b/examples/describe/main.go index cc8f7106c..ba890c66f 100644 --- a/examples/describe/main.go +++ b/examples/describe/main.go @@ -3,7 +3,6 @@ package main import ( "bytes" "context" - _ "embed" "flag" "fmt" "os" @@ -11,12 +10,13 @@ import ( "text/template" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/scheme" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" + + _ "embed" ) var ( diff --git a/examples/pagination/main.go b/examples/pagination/main.go index 4510f1f3a..24690610b 100644 --- a/examples/pagination/main.go +++ b/examples/pagination/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/read_table/main.go b/examples/read_table/main.go index 931672e6f..2e72d944a 100644 --- a/examples/read_table/main.go +++ b/examples/read_table/main.go @@ -9,7 +9,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" diff --git a/examples/serverless/healthcheck/service.go b/examples/serverless/healthcheck/service.go index c56953407..3f7ed883b 100644 --- a/examples/serverless/healthcheck/service.go +++ b/examples/serverless/healthcheck/service.go @@ -14,7 +14,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" "github.com/ydb-platform/ydb-go-sdk/v3/table" diff --git a/examples/serverless/url_shortener/service.go b/examples/serverless/url_shortener/service.go index 528549ce6..daf3063d4 100644 --- a/examples/serverless/url_shortener/service.go +++ b/examples/serverless/url_shortener/service.go @@ -22,7 +22,6 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" ydbMetrics "github.com/ydb-platform/ydb-go-sdk-prometheus" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/topic/cdc-fill-and-read/main.go b/examples/topic/cdc-fill-and-read/main.go index b4ebf7c95..d0cfdbe47 100644 --- a/examples/topic/cdc-fill-and-read/main.go +++ b/examples/topic/cdc-fill-and-read/main.go @@ -10,7 +10,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topictypes" diff --git a/examples/topic/topicreader/topicreader_simple.go b/examples/topic/topicreader/topicreader_simple.go index a652567c5..6fb568037 100644 --- a/examples/topic/topicreader/topicreader_simple.go +++ b/examples/topic/topicreader/topicreader_simple.go @@ -5,10 +5,9 @@ import ( "fmt" "io" - firestore "google.golang.org/genproto/firestore/bundle" - "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicreader" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicsugar" + firestore "google.golang.org/genproto/firestore/bundle" ) // PrintMessageContent is simple example for easy start read messages diff --git a/examples/ttl/main.go b/examples/ttl/main.go index ff7836037..b1a8ab963 100644 --- a/examples/ttl/main.go +++ b/examples/ttl/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/ttl_readtable/main.go b/examples/ttl_readtable/main.go index 54fd72d27..e867056d7 100644 --- a/examples/ttl_readtable/main.go +++ b/examples/ttl_readtable/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) From f90055a4d35519ea122abba635589b1c1927069f Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 29 Jan 2024 13:12:57 +0300 Subject: [PATCH 38/65] Fixed init info in topic writer, when autoseq num turned off. --- CHANGELOG.md | 2 ++ .../topicwriterinternal/writer_reconnector.go | 4 +-- .../writer_reconnector_test.go | 14 ++++++-- .../writer_single_stream.go | 20 ++++++----- .../writer_single_stream_test.go | 4 +-- tests/integration/topic_regression_test.go | 35 +++++++++++++++++++ 6 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 tests/integration/topic_regression_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index cf9f5a1e3..581bf3bcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Fixed init info in topic writer, when autoseq num turned off. + ## v3.55.1 * Supported column name prefix `__discard_column_` for discard columns in result sets * Made `StatusIds_SESSION_EXPIRED` retriable for idempotent operations diff --git a/internal/topic/topicwriterinternal/writer_reconnector.go b/internal/topic/topicwriterinternal/writer_reconnector.go index fcd1eabf7..b32abda10 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector.go +++ b/internal/topic/topicwriterinternal/writer_reconnector.go @@ -428,7 +428,7 @@ func (w *WriterReconnector) startWriteStream(ctx, streamCtx context.Context, att } func (w *WriterReconnector) needReceiveLastSeqNo() bool { - res := w.cfg.AutoSetSeqNo && !w.firstConnectionHandled.Load() + res := !w.firstConnectionHandled.Load() return res } @@ -490,7 +490,7 @@ func (w *WriterReconnector) onWriterChange(writerStream *SingleStreamWriter) { defer close(w.firstInitResponseProcessedChan) isFirstInit = true - if w.cfg.AutoSetSeqNo { + if writerStream.LastSeqNumRequested { w.lastSeqNo = writerStream.ReceivedLastSeqNum } }) diff --git a/internal/topic/topicwriterinternal/writer_reconnector_test.go b/internal/topic/topicwriterinternal/writer_reconnector_test.go index 618e61706..295dba55d 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector_test.go +++ b/internal/topic/topicwriterinternal/writer_reconnector_test.go @@ -328,8 +328,9 @@ func TestWriterImpl_InitSession(t *testing.T) { sessionID := "test-session-id" w.onWriterChange(&SingleStreamWriter{ - ReceivedLastSeqNum: lastSeqNo, - SessionID: sessionID, + ReceivedLastSeqNum: lastSeqNo, + LastSeqNumRequested: true, + SessionID: sessionID, }) require.Equal(t, sessionID, w.sessionID) @@ -344,7 +345,8 @@ func TestWriterImpl_WaitInit(t *testing.T) { LastSeqNum: int64(123), } w.onWriterChange(&SingleStreamWriter{ - ReceivedLastSeqNum: expectedInitData.LastSeqNum, + ReceivedLastSeqNum: expectedInitData.LastSeqNum, + LastSeqNumRequested: true, }) initData, err := w.WaitInit(context.Background()) @@ -432,9 +434,15 @@ func TestWriterImpl_Reconnect(t *testing.T) { connectionError error } + isFirstConnection := true newStream := func(name string) *MockRawTopicWriterStream { strm := NewMockRawTopicWriterStream(mc) initReq := testCreateInitRequest(w) + if isFirstConnection { + isFirstConnection = false + } else { + initReq.GetLastSeqNo = false + } streamClosed := make(empty.Chan) strm.EXPECT().CloseSend().Do(func() { diff --git a/internal/topic/topicwriterinternal/writer_single_stream.go b/internal/topic/topicwriterinternal/writer_single_stream.go index 3d835398d..3e3a95d07 100644 --- a/internal/topic/topicwriterinternal/writer_single_stream.go +++ b/internal/topic/topicwriterinternal/writer_single_stream.go @@ -24,7 +24,7 @@ type SingleStreamWriterConfig struct { stream RawTopicWriterStream queue *messageQueue encodersMap *EncoderMap - getAutoSeq bool + getLastSeqNum bool reconnectorInstanceID string } @@ -33,7 +33,7 @@ func newSingleStreamWriterConfig( stream RawTopicWriterStream, queue *messageQueue, encodersMap *EncoderMap, - getAutoSeq bool, + getLastSeqNum bool, reconnectorID string, ) SingleStreamWriterConfig { return SingleStreamWriterConfig{ @@ -41,17 +41,18 @@ func newSingleStreamWriterConfig( stream: stream, queue: queue, encodersMap: encodersMap, - getAutoSeq: getAutoSeq, + getLastSeqNum: getLastSeqNum, reconnectorInstanceID: reconnectorID, } } type SingleStreamWriter struct { - ReceivedLastSeqNum int64 - SessionID string - PartitionID int64 - CodecsFromServer rawtopiccommon.SupportedCodecs - Encoder EncoderSelector + ReceivedLastSeqNum int64 + LastSeqNumRequested bool + SessionID string + PartitionID int64 + CodecsFromServer rawtopiccommon.SupportedCodecs + Encoder EncoderSelector cfg SingleStreamWriterConfig allowedCodecs rawtopiccommon.SupportedCodecs @@ -152,6 +153,7 @@ func (w *SingleStreamWriter) initStream() (err error) { ) w.SessionID = result.SessionID + w.LastSeqNumRequested = req.GetLastSeqNo w.ReceivedLastSeqNum = result.LastSeqNo w.PartitionID = result.PartitionID w.CodecsFromServer = result.SupportedCodecs @@ -164,7 +166,7 @@ func (w *SingleStreamWriter) createInitRequest() rawtopicwriter.InitRequest { ProducerID: w.cfg.producerID, WriteSessionMeta: w.cfg.writerMeta, Partitioning: w.cfg.defaultPartitioning, - GetLastSeqNo: w.cfg.getAutoSeq, + GetLastSeqNo: w.cfg.getLastSeqNum, } } diff --git a/internal/topic/topicwriterinternal/writer_single_stream_test.go b/internal/topic/topicwriterinternal/writer_single_stream_test.go index 59e08bc53..d12d7068b 100644 --- a/internal/topic/topicwriterinternal/writer_single_stream_test.go +++ b/internal/topic/topicwriterinternal/writer_single_stream_test.go @@ -20,7 +20,7 @@ func TestWriterImpl_CreateInitMessage(t *testing.T) { defaultPartitioning: rawtopicwriter.NewPartitioningPartitionID(5), compressorCount: 1, }, - getAutoSeq: true, + getLastSeqNum: true, } w := newSingleStreamWriterStopped(ctx, cfg) expected := rawtopicwriter.InitRequest{ @@ -36,7 +36,7 @@ func TestWriterImpl_CreateInitMessage(t *testing.T) { t.Run("WithoutGetLastSeq", func(t *testing.T) { ctx := xtest.Context(t) w := newSingleStreamWriterStopped(ctx, - SingleStreamWriterConfig{getAutoSeq: false}, + SingleStreamWriterConfig{getLastSeqNum: false}, ) require.False(t, w.createInitRequest().GetLastSeqNo) }) diff --git a/tests/integration/topic_regression_test.go b/tests/integration/topic_regression_test.go new file mode 100644 index 000000000..fab6cd075 --- /dev/null +++ b/tests/integration/topic_regression_test.go @@ -0,0 +1,35 @@ +//go:build integration +// +build integration + +package integration + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" + "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicwriter" +) + +func TestRegressionIssue1011_WriteInitInfoLastSeqNum(t *testing.T) { + scope := newScope(t) + w1 := scope.TopicWriter() + err := w1.Write(scope.Ctx, topicwriter.Message{ + Data: strings.NewReader("123"), + }) + require.NoError(t, err) + require.NoError(t, w1.Close(scope.Ctx)) + + // Check + w2, err := scope.Driver().Topic().StartWriter( + scope.TopicPath(), + topicoptions.WithWriterProducerID(scope.TopicWriterProducerID()), + topicoptions.WithWriterSetAutoSeqNo(false), + ) + require.NoError(t, err) + + info, err := w2.WaitInitInfo(scope.Ctx) + require.Equal(t, int64(1), info.LastSeqNum) +} From 7ba309dcead1e8917b57a81d75ad6eba5bb8f96b Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 29 Jan 2024 13:20:16 +0300 Subject: [PATCH 39/65] Enable temporary disabled tests --- tests/integration/topic_read_writer_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/integration/topic_read_writer_test.go b/tests/integration/topic_read_writer_test.go index c1e10f9f7..306b16b01 100644 --- a/tests/integration/topic_read_writer_test.go +++ b/tests/integration/topic_read_writer_test.go @@ -163,8 +163,6 @@ func TestMessageMetadata(t *testing.T) { } func TestManyConcurentReadersWriters(t *testing.T) { - xtest.AllowByFlag(t, "ISSUE-389") - const partitionCount = 3 const writersCount = 5 const readersCount = 10 @@ -351,8 +349,6 @@ func TestCommitUnexpectedRange(t *testing.T) { } func TestUpdateToken(t *testing.T) { - xtest.AllowByFlag(t, "LOGBROKER-7960") - ctx := context.Background() db := connect(t) dbLogging := connectWithGrpcLogging(t) From 0e967e0716ad741575b7573f39a4ed6141032639 Mon Sep 17 00:00:00 2001 From: robot Date: Mon, 29 Jan 2024 10:30:35 +0000 Subject: [PATCH 40/65] Release v3.55.2 --- CHANGELOG.md | 1 + internal/version/version.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 581bf3bcc..47615b0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +## v3.55.2 * Fixed init info in topic writer, when autoseq num turned off. ## v3.55.1 diff --git a/internal/version/version.go b/internal/version/version.go index 519235f83..21696416c 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -3,7 +3,7 @@ package version const ( Major = "3" Minor = "55" - Patch = "1" + Patch = "2" Prefix = "ydb-go-sdk" ) From b37bb913eaa3c820eb0eded595778d4b946727ea Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 15:35:52 +0300 Subject: [PATCH 41/65] test2 --- .golangci.yml | 2 -- examples/auth/environ/main.go | 1 + examples/auth/metadata_credentials/main.go | 3 ++- examples/auth/service_account_credentials/main.go | 3 ++- examples/basic/database_sql/data.go | 1 + examples/basic/database_sql/main.go | 1 + examples/basic/native/main.go | 1 + examples/basic/xorm/main.go | 4 ++-- examples/ddl/main.go | 1 + examples/decimal/main.go | 1 + examples/describe/main.go | 4 ++-- examples/pagination/main.go | 1 + examples/read_table/main.go | 1 + examples/serverless/healthcheck/service.go | 1 + examples/serverless/url_shortener/service.go | 1 + examples/topic/cdc-fill-and-read/main.go | 1 + examples/topic/topicreader/topicreader_simple.go | 3 ++- examples/ttl/main.go | 1 + examples/ttl_readtable/main.go | 1 + internal/cmd/gtrace/main.go | 3 +-- tests/slo/database/sql/main.go | 1 - tests/slo/database/sql/storage.go | 6 +++--- tests/slo/gorm/main.go | 1 - tests/slo/gorm/storage.go | 10 +++++----- tests/slo/internal/metrics/metrics.go | 1 + tests/slo/internal/workers/read.go | 1 - tests/slo/internal/workers/write.go | 1 - tests/slo/native/main.go | 1 - tests/slo/native/storage.go | 6 +++--- tests/slo/xorm/main.go | 1 - tests/slo/xorm/storage.go | 12 ++++++------ 31 files changed, 42 insertions(+), 34 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index fa885dd11..55570020b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -69,8 +69,6 @@ linters-settings: - standard # Standard section: captures all standard packages. - default # Default section: contains all imports that could not be matched to another section type. - prefix(github.com/ydb-platform/ydb-go-sdk/v3) # Custom section: groups all imports with the specified Prefix. - - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled. - - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled. skip-generated: true goconst: # minimal length of string constant, 3 by default diff --git a/examples/auth/environ/main.go b/examples/auth/environ/main.go index 0ab5d2228..86dd1b01c 100644 --- a/examples/auth/environ/main.go +++ b/examples/auth/environ/main.go @@ -6,6 +6,7 @@ import ( "os" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/auth/metadata_credentials/main.go b/examples/auth/metadata_credentials/main.go index 073025b53..00e55ffc2 100644 --- a/examples/auth/metadata_credentials/main.go +++ b/examples/auth/metadata_credentials/main.go @@ -6,8 +6,9 @@ import ( "fmt" "os" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" yc "github.com/ydb-platform/ydb-go-yc" + + ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) var dsn string diff --git a/examples/auth/service_account_credentials/main.go b/examples/auth/service_account_credentials/main.go index 160d488b8..879ea9ba7 100644 --- a/examples/auth/service_account_credentials/main.go +++ b/examples/auth/service_account_credentials/main.go @@ -6,8 +6,9 @@ import ( "fmt" "os" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" yc "github.com/ydb-platform/ydb-go-yc" + + ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) var ( diff --git a/examples/basic/database_sql/data.go b/examples/basic/database_sql/data.go index 74f94c84f..279c895be 100644 --- a/examples/basic/database_sql/data.go +++ b/examples/basic/database_sql/data.go @@ -8,6 +8,7 @@ import ( "time" "github.com/google/uuid" + "github.com/ydb-platform/ydb-go-sdk/v3/table/types" ) diff --git a/examples/basic/database_sql/main.go b/examples/basic/database_sql/main.go index e4c31bfe9..0c44ce7b9 100644 --- a/examples/basic/database_sql/main.go +++ b/examples/basic/database_sql/main.go @@ -9,6 +9,7 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/native/main.go b/examples/basic/native/main.go index 43be4ae9a..e2cfd23df 100644 --- a/examples/basic/native/main.go +++ b/examples/basic/native/main.go @@ -8,6 +8,7 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/xorm/main.go b/examples/basic/xorm/main.go index f32e3c5ab..be8f8cbcc 100644 --- a/examples/basic/xorm/main.go +++ b/examples/basic/xorm/main.go @@ -6,13 +6,13 @@ import ( "os" "time" + _ "github.com/lib/pq" + _ "modernc.org/sqlite" "xorm.io/builder" "xorm.io/xorm" xormLog "xorm.io/xorm/log" - _ "github.com/lib/pq" _ "github.com/ydb-platform/ydb-go-sdk/v3" - _ "modernc.org/sqlite" ) var envNotFoundMessage = `DSN environment variable not defined diff --git a/examples/ddl/main.go b/examples/ddl/main.go index 6e219b001..75bd8576d 100644 --- a/examples/ddl/main.go +++ b/examples/ddl/main.go @@ -8,6 +8,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/decimal/main.go b/examples/decimal/main.go index 7f79d4850..1662dc983 100644 --- a/examples/decimal/main.go +++ b/examples/decimal/main.go @@ -9,6 +9,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/describe/main.go b/examples/describe/main.go index ba890c66f..cc8f7106c 100644 --- a/examples/describe/main.go +++ b/examples/describe/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + _ "embed" "flag" "fmt" "os" @@ -10,13 +11,12 @@ import ( "text/template" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/scheme" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" - - _ "embed" ) var ( diff --git a/examples/pagination/main.go b/examples/pagination/main.go index 24690610b..4510f1f3a 100644 --- a/examples/pagination/main.go +++ b/examples/pagination/main.go @@ -8,6 +8,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/read_table/main.go b/examples/read_table/main.go index 2e72d944a..931672e6f 100644 --- a/examples/read_table/main.go +++ b/examples/read_table/main.go @@ -9,6 +9,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" diff --git a/examples/serverless/healthcheck/service.go b/examples/serverless/healthcheck/service.go index 3f7ed883b..c56953407 100644 --- a/examples/serverless/healthcheck/service.go +++ b/examples/serverless/healthcheck/service.go @@ -14,6 +14,7 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" "github.com/ydb-platform/ydb-go-sdk/v3/table" diff --git a/examples/serverless/url_shortener/service.go b/examples/serverless/url_shortener/service.go index daf3063d4..528549ce6 100644 --- a/examples/serverless/url_shortener/service.go +++ b/examples/serverless/url_shortener/service.go @@ -22,6 +22,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" ydbMetrics "github.com/ydb-platform/ydb-go-sdk-prometheus" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/topic/cdc-fill-and-read/main.go b/examples/topic/cdc-fill-and-read/main.go index d0cfdbe47..b4ebf7c95 100644 --- a/examples/topic/cdc-fill-and-read/main.go +++ b/examples/topic/cdc-fill-and-read/main.go @@ -10,6 +10,7 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topictypes" diff --git a/examples/topic/topicreader/topicreader_simple.go b/examples/topic/topicreader/topicreader_simple.go index 6fb568037..a652567c5 100644 --- a/examples/topic/topicreader/topicreader_simple.go +++ b/examples/topic/topicreader/topicreader_simple.go @@ -5,9 +5,10 @@ import ( "fmt" "io" + firestore "google.golang.org/genproto/firestore/bundle" + "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicreader" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicsugar" - firestore "google.golang.org/genproto/firestore/bundle" ) // PrintMessageContent is simple example for easy start read messages diff --git a/examples/ttl/main.go b/examples/ttl/main.go index b1a8ab963..ff7836037 100644 --- a/examples/ttl/main.go +++ b/examples/ttl/main.go @@ -8,6 +8,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/ttl_readtable/main.go b/examples/ttl_readtable/main.go index e867056d7..54fd72d27 100644 --- a/examples/ttl_readtable/main.go +++ b/examples/ttl_readtable/main.go @@ -8,6 +8,7 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/internal/cmd/gtrace/main.go b/internal/cmd/gtrace/main.go index 0edfe66ff..95a72f0c2 100644 --- a/internal/cmd/gtrace/main.go +++ b/internal/cmd/gtrace/main.go @@ -16,10 +16,9 @@ import ( "os" "path/filepath" "strings" + _ "unsafe" // For go:linkname. "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" - - _ "unsafe" // For go:linkname. ) //go:linkname build_goodOSArchFile go/build.(*Context).goodOSArchFile diff --git a/tests/slo/database/sql/main.go b/tests/slo/database/sql/main.go index 6244e917a..844071863 100644 --- a/tests/slo/database/sql/main.go +++ b/tests/slo/database/sql/main.go @@ -10,7 +10,6 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" - "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/database/sql/storage.go b/tests/slo/database/sql/storage.go index 0c6bcc606..aebd88790 100755 --- a/tests/slo/database/sql/storage.go +++ b/tests/slo/database/sql/storage.go @@ -7,13 +7,13 @@ import ( "path" "time" + "slo/internal/config" + "slo/internal/generator" + ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/trace" - - "slo/internal/config" - "slo/internal/generator" ) //nolint:goconst diff --git a/tests/slo/gorm/main.go b/tests/slo/gorm/main.go index ef4a9a079..21b213722 100644 --- a/tests/slo/gorm/main.go +++ b/tests/slo/gorm/main.go @@ -10,7 +10,6 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" - "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/gorm/storage.go b/tests/slo/gorm/storage.go index 2481014f1..12ae9eca4 100644 --- a/tests/slo/gorm/storage.go +++ b/tests/slo/gorm/storage.go @@ -7,16 +7,16 @@ import ( "time" ydb "github.com/ydb-platform/gorm-driver" - ydbSDK "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/retry" - "github.com/ydb-platform/ydb-go-sdk/v3/table" - "github.com/ydb-platform/ydb-go-sdk/v3/trace" "gorm.io/gorm" "gorm.io/gorm/clause" gormLogger "gorm.io/gorm/logger" - "slo/internal/config" "slo/internal/generator" + + ydbSDK "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/retry" + "github.com/ydb-platform/ydb-go-sdk/v3/table" + "github.com/ydb-platform/ydb-go-sdk/v3/trace" ) const optionsTemplate = ` diff --git a/tests/slo/internal/metrics/metrics.go b/tests/slo/internal/metrics/metrics.go index ee7778152..3533999bd 100644 --- a/tests/slo/internal/metrics/metrics.go +++ b/tests/slo/internal/metrics/metrics.go @@ -6,6 +6,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" + "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/tests/slo/internal/workers/read.go b/tests/slo/internal/workers/read.go index 3fb8212e3..219c3aba3 100644 --- a/tests/slo/internal/workers/read.go +++ b/tests/slo/internal/workers/read.go @@ -7,7 +7,6 @@ import ( "sync" "golang.org/x/time/rate" - "slo/internal/metrics" ) diff --git a/tests/slo/internal/workers/write.go b/tests/slo/internal/workers/write.go index daa624174..c0ff2233e 100644 --- a/tests/slo/internal/workers/write.go +++ b/tests/slo/internal/workers/write.go @@ -6,7 +6,6 @@ import ( "sync" "golang.org/x/time/rate" - "slo/internal/generator" "slo/internal/metrics" ) diff --git a/tests/slo/native/main.go b/tests/slo/native/main.go index 9d5df4e72..4443e3682 100644 --- a/tests/slo/native/main.go +++ b/tests/slo/native/main.go @@ -10,7 +10,6 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" - "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/native/storage.go b/tests/slo/native/storage.go index 4a438bf10..bb996c9fa 100755 --- a/tests/slo/native/storage.go +++ b/tests/slo/native/storage.go @@ -6,6 +6,9 @@ import ( "path" "time" + "slo/internal/config" + "slo/internal/generator" + "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" @@ -13,9 +16,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/table/result/named" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" "github.com/ydb-platform/ydb-go-sdk/v3/trace" - - "slo/internal/config" - "slo/internal/generator" ) //nolint:goconst diff --git a/tests/slo/xorm/main.go b/tests/slo/xorm/main.go index 9d5df4e72..4443e3682 100644 --- a/tests/slo/xorm/main.go +++ b/tests/slo/xorm/main.go @@ -10,7 +10,6 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" - "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/xorm/storage.go b/tests/slo/xorm/storage.go index b6bc813df..8f3b0e53e 100644 --- a/tests/slo/xorm/storage.go +++ b/tests/slo/xorm/storage.go @@ -9,16 +9,16 @@ import ( "strconv" "time" - "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/retry" - "github.com/ydb-platform/ydb-go-sdk/v3/table" - "github.com/ydb-platform/ydb-go-sdk/v3/trace" + "slo/internal/config" + "slo/internal/generator" "xorm.io/xorm" "xorm.io/xorm/core" "xorm.io/xorm/log" - "slo/internal/config" - "slo/internal/generator" + "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/retry" + "github.com/ydb-platform/ydb-go-sdk/v3/table" + "github.com/ydb-platform/ydb-go-sdk/v3/trace" ) var ( From ddbeceb69f8bcf4e3e91f4ea1821a19c830f0a99 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:21:33 +0300 Subject: [PATCH 42/65] fix gci --- examples/auth/environ/main.go | 1 - examples/auth/metadata_credentials/main.go | 3 +-- examples/auth/service_account_credentials/main.go | 3 +-- examples/basic/database_sql/data.go | 1 - examples/basic/database_sql/main.go | 1 - examples/basic/native/main.go | 1 - examples/basic/xorm/main.go | 3 +-- examples/ddl/main.go | 1 - examples/decimal/main.go | 1 - examples/describe/main.go | 1 - examples/pagination/main.go | 1 - examples/read_table/main.go | 1 - examples/serverless/healthcheck/service.go | 1 - examples/serverless/url_shortener/service.go | 1 - examples/topic/cdc-fill-and-read/main.go | 1 - examples/topic/topicreader/topicreader_simple.go | 3 +-- examples/ttl/main.go | 1 - examples/ttl_readtable/main.go | 1 - tests/slo/database/sql/main.go | 1 + tests/slo/database/sql/storage.go | 6 +++--- tests/slo/gorm/main.go | 1 + tests/slo/gorm/storage.go | 10 +++++----- tests/slo/internal/metrics/metrics.go | 1 - tests/slo/internal/workers/read.go | 1 + tests/slo/internal/workers/write.go | 1 + tests/slo/native/main.go | 1 + tests/slo/native/storage.go | 6 +++--- tests/slo/xorm/main.go | 1 + tests/slo/xorm/storage.go | 12 ++++++------ 29 files changed, 27 insertions(+), 40 deletions(-) diff --git a/examples/auth/environ/main.go b/examples/auth/environ/main.go index 86dd1b01c..0ab5d2228 100644 --- a/examples/auth/environ/main.go +++ b/examples/auth/environ/main.go @@ -6,7 +6,6 @@ import ( "os" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/auth/metadata_credentials/main.go b/examples/auth/metadata_credentials/main.go index 00e55ffc2..073025b53 100644 --- a/examples/auth/metadata_credentials/main.go +++ b/examples/auth/metadata_credentials/main.go @@ -6,9 +6,8 @@ import ( "fmt" "os" - yc "github.com/ydb-platform/ydb-go-yc" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" + yc "github.com/ydb-platform/ydb-go-yc" ) var dsn string diff --git a/examples/auth/service_account_credentials/main.go b/examples/auth/service_account_credentials/main.go index 879ea9ba7..160d488b8 100644 --- a/examples/auth/service_account_credentials/main.go +++ b/examples/auth/service_account_credentials/main.go @@ -6,9 +6,8 @@ import ( "fmt" "os" - yc "github.com/ydb-platform/ydb-go-yc" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" + yc "github.com/ydb-platform/ydb-go-yc" ) var ( diff --git a/examples/basic/database_sql/data.go b/examples/basic/database_sql/data.go index 279c895be..74f94c84f 100644 --- a/examples/basic/database_sql/data.go +++ b/examples/basic/database_sql/data.go @@ -8,7 +8,6 @@ import ( "time" "github.com/google/uuid" - "github.com/ydb-platform/ydb-go-sdk/v3/table/types" ) diff --git a/examples/basic/database_sql/main.go b/examples/basic/database_sql/main.go index 0c44ce7b9..e4c31bfe9 100644 --- a/examples/basic/database_sql/main.go +++ b/examples/basic/database_sql/main.go @@ -9,7 +9,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/native/main.go b/examples/basic/native/main.go index e2cfd23df..43be4ae9a 100644 --- a/examples/basic/native/main.go +++ b/examples/basic/native/main.go @@ -8,7 +8,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/basic/xorm/main.go b/examples/basic/xorm/main.go index be8f8cbcc..94f580bd6 100644 --- a/examples/basic/xorm/main.go +++ b/examples/basic/xorm/main.go @@ -7,12 +7,11 @@ import ( "time" _ "github.com/lib/pq" + _ "github.com/ydb-platform/ydb-go-sdk/v3" _ "modernc.org/sqlite" "xorm.io/builder" "xorm.io/xorm" xormLog "xorm.io/xorm/log" - - _ "github.com/ydb-platform/ydb-go-sdk/v3" ) var envNotFoundMessage = `DSN environment variable not defined diff --git a/examples/ddl/main.go b/examples/ddl/main.go index 75bd8576d..6e219b001 100644 --- a/examples/ddl/main.go +++ b/examples/ddl/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/examples/decimal/main.go b/examples/decimal/main.go index 1662dc983..7f79d4850 100644 --- a/examples/decimal/main.go +++ b/examples/decimal/main.go @@ -9,7 +9,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/describe/main.go b/examples/describe/main.go index cc8f7106c..229a08d96 100644 --- a/examples/describe/main.go +++ b/examples/describe/main.go @@ -11,7 +11,6 @@ import ( "text/template" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/scheme" diff --git a/examples/pagination/main.go b/examples/pagination/main.go index 4510f1f3a..24690610b 100644 --- a/examples/pagination/main.go +++ b/examples/pagination/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/read_table/main.go b/examples/read_table/main.go index 931672e6f..2e72d944a 100644 --- a/examples/read_table/main.go +++ b/examples/read_table/main.go @@ -9,7 +9,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" diff --git a/examples/serverless/healthcheck/service.go b/examples/serverless/healthcheck/service.go index c56953407..3f7ed883b 100644 --- a/examples/serverless/healthcheck/service.go +++ b/examples/serverless/healthcheck/service.go @@ -14,7 +14,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" "github.com/ydb-platform/ydb-go-sdk/v3/table" diff --git a/examples/serverless/url_shortener/service.go b/examples/serverless/url_shortener/service.go index 528549ce6..daf3063d4 100644 --- a/examples/serverless/url_shortener/service.go +++ b/examples/serverless/url_shortener/service.go @@ -22,7 +22,6 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" ydbMetrics "github.com/ydb-platform/ydb-go-sdk-prometheus" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" diff --git a/examples/topic/cdc-fill-and-read/main.go b/examples/topic/cdc-fill-and-read/main.go index b4ebf7c95..d0cfdbe47 100644 --- a/examples/topic/cdc-fill-and-read/main.go +++ b/examples/topic/cdc-fill-and-read/main.go @@ -10,7 +10,6 @@ import ( "time" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topictypes" diff --git a/examples/topic/topicreader/topicreader_simple.go b/examples/topic/topicreader/topicreader_simple.go index a652567c5..6fb568037 100644 --- a/examples/topic/topicreader/topicreader_simple.go +++ b/examples/topic/topicreader/topicreader_simple.go @@ -5,10 +5,9 @@ import ( "fmt" "io" - firestore "google.golang.org/genproto/firestore/bundle" - "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicreader" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicsugar" + firestore "google.golang.org/genproto/firestore/bundle" ) // PrintMessageContent is simple example for easy start read messages diff --git a/examples/ttl/main.go b/examples/ttl/main.go index ff7836037..b1a8ab963 100644 --- a/examples/ttl/main.go +++ b/examples/ttl/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/examples/ttl_readtable/main.go b/examples/ttl_readtable/main.go index 54fd72d27..e867056d7 100644 --- a/examples/ttl_readtable/main.go +++ b/examples/ttl_readtable/main.go @@ -8,7 +8,6 @@ import ( "path" environ "github.com/ydb-platform/ydb-go-sdk-auth-environ" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/sugar" ) diff --git a/tests/slo/database/sql/main.go b/tests/slo/database/sql/main.go index 844071863..6244e917a 100644 --- a/tests/slo/database/sql/main.go +++ b/tests/slo/database/sql/main.go @@ -10,6 +10,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" + "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/database/sql/storage.go b/tests/slo/database/sql/storage.go index aebd88790..0c6bcc606 100755 --- a/tests/slo/database/sql/storage.go +++ b/tests/slo/database/sql/storage.go @@ -7,13 +7,13 @@ import ( "path" "time" - "slo/internal/config" - "slo/internal/generator" - ydb "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/trace" + + "slo/internal/config" + "slo/internal/generator" ) //nolint:goconst diff --git a/tests/slo/gorm/main.go b/tests/slo/gorm/main.go index 21b213722..ef4a9a079 100644 --- a/tests/slo/gorm/main.go +++ b/tests/slo/gorm/main.go @@ -10,6 +10,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" + "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/gorm/storage.go b/tests/slo/gorm/storage.go index 12ae9eca4..2481014f1 100644 --- a/tests/slo/gorm/storage.go +++ b/tests/slo/gorm/storage.go @@ -7,16 +7,16 @@ import ( "time" ydb "github.com/ydb-platform/gorm-driver" + ydbSDK "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/retry" + "github.com/ydb-platform/ydb-go-sdk/v3/table" + "github.com/ydb-platform/ydb-go-sdk/v3/trace" "gorm.io/gorm" "gorm.io/gorm/clause" gormLogger "gorm.io/gorm/logger" + "slo/internal/config" "slo/internal/generator" - - ydbSDK "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/retry" - "github.com/ydb-platform/ydb-go-sdk/v3/table" - "github.com/ydb-platform/ydb-go-sdk/v3/trace" ) const optionsTemplate = ` diff --git a/tests/slo/internal/metrics/metrics.go b/tests/slo/internal/metrics/metrics.go index 3533999bd..ee7778152 100644 --- a/tests/slo/internal/metrics/metrics.go +++ b/tests/slo/internal/metrics/metrics.go @@ -6,7 +6,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" - "github.com/ydb-platform/ydb-go-sdk/v3" ) diff --git a/tests/slo/internal/workers/read.go b/tests/slo/internal/workers/read.go index 219c3aba3..3fb8212e3 100644 --- a/tests/slo/internal/workers/read.go +++ b/tests/slo/internal/workers/read.go @@ -7,6 +7,7 @@ import ( "sync" "golang.org/x/time/rate" + "slo/internal/metrics" ) diff --git a/tests/slo/internal/workers/write.go b/tests/slo/internal/workers/write.go index c0ff2233e..daa624174 100644 --- a/tests/slo/internal/workers/write.go +++ b/tests/slo/internal/workers/write.go @@ -6,6 +6,7 @@ import ( "sync" "golang.org/x/time/rate" + "slo/internal/generator" "slo/internal/metrics" ) diff --git a/tests/slo/native/main.go b/tests/slo/native/main.go index 4443e3682..9d5df4e72 100644 --- a/tests/slo/native/main.go +++ b/tests/slo/native/main.go @@ -10,6 +10,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" + "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/native/storage.go b/tests/slo/native/storage.go index bb996c9fa..4a438bf10 100755 --- a/tests/slo/native/storage.go +++ b/tests/slo/native/storage.go @@ -6,9 +6,6 @@ import ( "path" "time" - "slo/internal/config" - "slo/internal/generator" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" @@ -16,6 +13,9 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/table/result/named" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" "github.com/ydb-platform/ydb-go-sdk/v3/trace" + + "slo/internal/config" + "slo/internal/generator" ) //nolint:goconst diff --git a/tests/slo/xorm/main.go b/tests/slo/xorm/main.go index 4443e3682..9d5df4e72 100644 --- a/tests/slo/xorm/main.go +++ b/tests/slo/xorm/main.go @@ -10,6 +10,7 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/time/rate" + "slo/internal/config" "slo/internal/generator" "slo/internal/workers" diff --git a/tests/slo/xorm/storage.go b/tests/slo/xorm/storage.go index 8f3b0e53e..b6bc813df 100644 --- a/tests/slo/xorm/storage.go +++ b/tests/slo/xorm/storage.go @@ -9,16 +9,16 @@ import ( "strconv" "time" - "slo/internal/config" - "slo/internal/generator" - "xorm.io/xorm" - "xorm.io/xorm/core" - "xorm.io/xorm/log" - "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/retry" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/trace" + "xorm.io/xorm" + "xorm.io/xorm/core" + "xorm.io/xorm/log" + + "slo/internal/config" + "slo/internal/generator" ) var ( From b50bbbe84cbd444bd4dc73a8ecbf69b5845bb772 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:38:01 +0300 Subject: [PATCH 43/65] editet ci --- .github/scripts/format-go-code.sh | 6 +++--- .github/workflows/lint.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/scripts/format-go-code.sh b/.github/scripts/format-go-code.sh index 33063ce42..e7b0f750d 100755 --- a/.github/scripts/format-go-code.sh +++ b/.github/scripts/format-go-code.sh @@ -6,12 +6,12 @@ FILEPATH="$1" gofmt -s -w "$FILEPATH" -# https://github.com/rinchsan/gosimports +# https://github.com/daixiang0/gci if [[ "$FILEPATH" == *"tests/slo/"* ]] then - gosimports -local slo -w "$FILEPATH" + gci write --skip-generated -s standard -s default -s "prefix(slo)" "$FILEPATH" else - gosimports -local github.com/ydb-platform/ydb-go-sdk/v3 -w "$FILEPATH" + gci write --skip-generated -s standard -s default -s "prefix(github.com/ydb-platform/ydb-go-sdk/v3)" "$FILEPATH" fi diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d62b7849e..147e1497b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -69,7 +69,7 @@ jobs: - name: Install utilities run: | go install mvdan.cc/gofumpt@v0.3.1 - go install github.com/rinchsan/gosimports/cmd/gosimports@v0.1.5 + go install go install github.com/daixiang0/gci@v0.12.1 - name: format all files with auto-formatter run: bash ./.github/scripts/format-all-go-code.sh "$PWD" - name: Check repository diff From 955c29559fb6f5c28af74704700c67dc6eb8afb3 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:41:52 +0300 Subject: [PATCH 44/65] fix --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 147e1497b..ece2cd6a3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -69,7 +69,7 @@ jobs: - name: Install utilities run: | go install mvdan.cc/gofumpt@v0.3.1 - go install go install github.com/daixiang0/gci@v0.12.1 + go install go install github.com/daixiang0/gci@latest - name: format all files with auto-formatter run: bash ./.github/scripts/format-all-go-code.sh "$PWD" - name: Check repository diff From 65eec1bb386c45e0f32a6feaa51901e633c585cc Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:45:34 +0300 Subject: [PATCH 45/65] fix --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ece2cd6a3..686fd8e5a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -69,7 +69,7 @@ jobs: - name: Install utilities run: | go install mvdan.cc/gofumpt@v0.3.1 - go install go install github.com/daixiang0/gci@latest + go install go install github.com/daixiang0/gci@v0.11.2 - name: format all files with auto-formatter run: bash ./.github/scripts/format-all-go-code.sh "$PWD" - name: Check repository diff From c0bbf100bd0a60efaf22a61e4e256fa0a2d42b57 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:49:19 +0300 Subject: [PATCH 46/65] fix --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 686fd8e5a..c4b89aa7a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -69,7 +69,7 @@ jobs: - name: Install utilities run: | go install mvdan.cc/gofumpt@v0.3.1 - go install go install github.com/daixiang0/gci@v0.11.2 + go install github.com/daixiang0/gci@v0.12.1 - name: format all files with auto-formatter run: bash ./.github/scripts/format-all-go-code.sh "$PWD" - name: Check repository diff From 323d7d7732a7f957d12c0ec576dabfe17d3815a7 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 18:55:16 +0300 Subject: [PATCH 47/65] fix --- .github/scripts/format-go-code.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/scripts/format-go-code.sh b/.github/scripts/format-go-code.sh index e7b0f750d..30c9a131b 100755 --- a/.github/scripts/format-go-code.sh +++ b/.github/scripts/format-go-code.sh @@ -10,6 +10,8 @@ gofmt -s -w "$FILEPATH" if [[ "$FILEPATH" == *"tests/slo/"* ]] then gci write --skip-generated -s standard -s default -s "prefix(slo)" "$FILEPATH" +elif [ "$FILEPATH" == *"examples/"* ]; then + gci write --skip-generated -s standard -s default -s "examples" "$FILEPATH" else gci write --skip-generated -s standard -s default -s "prefix(github.com/ydb-platform/ydb-go-sdk/v3)" "$FILEPATH" fi From 8c69f929b82fb162f5edeb96c8f2e5da060469de Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 19:00:10 +0300 Subject: [PATCH 48/65] fix :( --- .github/scripts/format-go-code.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/format-go-code.sh b/.github/scripts/format-go-code.sh index 30c9a131b..a6789de79 100755 --- a/.github/scripts/format-go-code.sh +++ b/.github/scripts/format-go-code.sh @@ -11,7 +11,7 @@ if [[ "$FILEPATH" == *"tests/slo/"* ]] then gci write --skip-generated -s standard -s default -s "prefix(slo)" "$FILEPATH" elif [ "$FILEPATH" == *"examples/"* ]; then - gci write --skip-generated -s standard -s default -s "examples" "$FILEPATH" + gci write --skip-generated -s standard -s default -s "prefix(examples)" "$FILEPATH" else gci write --skip-generated -s standard -s default -s "prefix(github.com/ydb-platform/ydb-go-sdk/v3)" "$FILEPATH" fi From f41ed52ecd86219f83f6cf4446f3faba8782c1d1 Mon Sep 17 00:00:00 2001 From: size12 Date: Mon, 29 Jan 2024 19:10:56 +0300 Subject: [PATCH 49/65] fix :) --- .github/scripts/format-go-code.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/format-go-code.sh b/.github/scripts/format-go-code.sh index a6789de79..03420092e 100755 --- a/.github/scripts/format-go-code.sh +++ b/.github/scripts/format-go-code.sh @@ -10,7 +10,8 @@ gofmt -s -w "$FILEPATH" if [[ "$FILEPATH" == *"tests/slo/"* ]] then gci write --skip-generated -s standard -s default -s "prefix(slo)" "$FILEPATH" -elif [ "$FILEPATH" == *"examples/"* ]; then +elif [[ "$FILEPATH" == *"examples/"* ]] +then gci write --skip-generated -s standard -s default -s "prefix(examples)" "$FILEPATH" else gci write --skip-generated -s standard -s default -s "prefix(github.com/ydb-platform/ydb-go-sdk/v3)" "$FILEPATH" From a989b407da1082f2a4c328b6cec217efc6f0f320 Mon Sep 17 00:00:00 2001 From: Grigory Gavrin <96040376+grishagavrin@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:01:04 +0300 Subject: [PATCH 50/65] enable nilerr --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index e58998c24..c1f8d06a8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -234,7 +234,6 @@ linters: - ireturn - maintidx - maligned - - nilerr - nlreturn - nonamedreturns - paralleltest From 4d566f277b882a2048d67688d91fc00b8361469d Mon Sep 17 00:00:00 2001 From: Grigory Gavrin <96040376+grishagavrin@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:01:51 +0300 Subject: [PATCH 51/65] fix nilerr issues --- internal/grpcwrapper/rawtopic/describe_topic.go | 2 +- internal/grpcwrapper/rawydb/issues.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/grpcwrapper/rawtopic/describe_topic.go b/internal/grpcwrapper/rawtopic/describe_topic.go index bca36dab5..50662e37f 100644 --- a/internal/grpcwrapper/rawtopic/describe_topic.go +++ b/internal/grpcwrapper/rawtopic/describe_topic.go @@ -43,7 +43,7 @@ type DescribeTopicResult struct { func (res *DescribeTopicResult) FromProto(protoResponse *Ydb_Topic.DescribeTopicResponse) error { if err := res.Operation.FromProtoWithStatusCheck(protoResponse.Operation); err != nil { - return nil + return err } protoResult := &Ydb_Topic.DescribeTopicResult{} diff --git a/internal/grpcwrapper/rawydb/issues.go b/internal/grpcwrapper/rawydb/issues.go index 2c04ce799..d2522dc96 100644 --- a/internal/grpcwrapper/rawydb/issues.go +++ b/internal/grpcwrapper/rawydb/issues.go @@ -17,7 +17,7 @@ func (issuesPointer *Issues) FromProto(p []*Ydb_Issue.IssueMessage) error { issues := *issuesPointer for i := range issues { if err := issues[i].FromProto(p[i]); err != nil { - return nil + return err } } return nil From d2d3fc8e4e6a83deaf84cc986d36c7615c873914 Mon Sep 17 00:00:00 2001 From: Grigory Gavrin <96040376+grishagavrin@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:33:12 +0300 Subject: [PATCH 52/65] wrote to changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47615b0ec..5528fecf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* Refactored nil on err `internal/grpcwrapper/rawydb/issues.go`, when golangci-lint nilerr enabled +* Refactored nil on err `internal/grpcwrapper/rawtopic/describe_topic.go`, when golangci-lint nilerr enabled + ## v3.55.2 * Fixed init info in topic writer, when autoseq num turned off. From 0b4d3697a468b6273772d953e57bcdf792196601 Mon Sep 17 00:00:00 2001 From: Stanislav Date: Wed, 31 Jan 2024 15:47:00 +0300 Subject: [PATCH 53/65] enable interfacer linter (#1024) * enable interfacer linter --- .golangci.yml | 1 - examples/topic/cdc-cache-bus-freeseats/webserver.go | 2 +- internal/cmd/gtrace/writer.go | 2 +- internal/table/client_test.go | 3 ++- log/discovery.go | 2 +- log/driver.go | 2 +- log/retry.go | 2 +- log/topic.go | 2 +- table/types/types.go | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 33d5b8e4c..946776d43 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -235,7 +235,6 @@ linters: - gomoddirectives - ifshort - interfacebloat - - interfacer - ireturn - maintidx - maligned diff --git a/examples/topic/cdc-cache-bus-freeseats/webserver.go b/examples/topic/cdc-cache-bus-freeseats/webserver.go index 790339b53..2d045b29e 100644 --- a/examples/topic/cdc-cache-bus-freeseats/webserver.go +++ b/examples/topic/cdc-cache-bus-freeseats/webserver.go @@ -81,7 +81,7 @@ func (s *server) BuyTicketHandler(writer http.ResponseWriter, request *http.Requ s.writeAnswer(writer, freeSeats, duration) } -func (s *server) writeAnswer(writer http.ResponseWriter, freeSeats int64, duration time.Duration) { +func (s *server) writeAnswer(writer io.Writer, freeSeats int64, duration time.Duration) { _, _ = fmt.Fprintf(writer, "%v\n\nDuration: %v\n", freeSeats, duration) } diff --git a/internal/cmd/gtrace/writer.go b/internal/cmd/gtrace/writer.go index 00e099ba6..fc90b063e 100644 --- a/internal/cmd/gtrace/writer.go +++ b/internal/cmd/gtrace/writer.go @@ -601,7 +601,7 @@ func (w *Writer) constructParams(params []Param, names []string) (res []string) return res } -func (w *Writer) constructStruct(n *types.Named, s *types.Struct, vars []string) (string, []string) { +func (w *Writer) constructStruct(n types.Type, s *types.Struct, vars []string) (string, []string) { p := w.declare("p") // maybe skip pointers from flattening to not allocate anyhing during trace. w.line(`var `, p, ` `, w.typeString(n)) diff --git a/internal/table/client_test.go b/internal/table/client_test.go index 90937d41c..ee0137bfc 100644 --- a/internal/table/client_test.go +++ b/internal/table/client_test.go @@ -18,6 +18,7 @@ import ( "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/emptypb" + "github.com/ydb-platform/ydb-go-sdk/v3/internal/closer" "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/config" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" @@ -769,7 +770,7 @@ func mustPutSession(t testing.TB, p *Client, s *session) { } } -func mustClose(t testing.TB, p *Client) { +func mustClose(t testing.TB, p closer.Closer) { wg := sync.WaitGroup{} defer wg.Wait() if err := p.Close(context.Background()); err != nil { diff --git a/log/discovery.go b/log/discovery.go index f9b7c60d5..84b8d1228 100644 --- a/log/discovery.go +++ b/log/discovery.go @@ -11,7 +11,7 @@ func Discovery(l Logger, d trace.Detailer, opts ...Option) (t trace.Discovery) { return internalDiscovery(wrapLogger(l, opts...), d) } -func internalDiscovery(l *wrapper, d trace.Detailer) (t trace.Discovery) { +func internalDiscovery(l Logger, d trace.Detailer) (t trace.Discovery) { t.OnDiscover = func(info trace.DiscoveryDiscoverStartInfo) func(trace.DiscoveryDiscoverDoneInfo) { if d.Details()&trace.DiscoveryEvents == 0 { return nil diff --git a/log/driver.go b/log/driver.go index 8292f31bc..c381fa957 100644 --- a/log/driver.go +++ b/log/driver.go @@ -13,7 +13,7 @@ func Driver(l Logger, d trace.Detailer, opts ...Option) (t trace.Driver) { return internalDriver(wrapLogger(l, opts...), d) } -func internalDriver(l *wrapper, d trace.Detailer) (t trace.Driver) { //nolint:gocyclo +func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocyclo t.OnResolve = func( info trace.DriverResolveStartInfo, ) func( diff --git a/log/retry.go b/log/retry.go index 4f0c582b6..a9a488914 100644 --- a/log/retry.go +++ b/log/retry.go @@ -13,7 +13,7 @@ func Retry(l Logger, d trace.Detailer, opts ...Option) (t trace.Retry) { return internalRetry(wrapLogger(l, opts...), d) } -func internalRetry(l *wrapper, d trace.Detailer) (t trace.Retry) { +func internalRetry(l Logger, d trace.Detailer) (t trace.Retry) { t.OnRetry = func( info trace.RetryLoopStartInfo, ) func( diff --git a/log/topic.go b/log/topic.go index 769d081f0..b3a1e0493 100644 --- a/log/topic.go +++ b/log/topic.go @@ -12,7 +12,7 @@ func Topic(l Logger, d trace.Detailer, opts ...Option) (t trace.Topic) { return internalTopic(wrapLogger(l, opts...), d) } -func internalTopic(l *wrapper, d trace.Detailer) (t trace.Topic) { //nolint:gocyclo +func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocyclo t.OnReaderReconnect = func( info trace.TopicReaderReconnectStartInfo, ) func(doneInfo trace.TopicReaderReconnectDoneInfo) { diff --git a/table/types/types.go b/table/types/types.go index a9f587578..a04191e7a 100644 --- a/table/types/types.go +++ b/table/types/types.go @@ -120,7 +120,7 @@ const ( // WriteTypeStringTo writes ydb type string representation into buffer // // Deprecated: use types.Type.Yql() instead -func WriteTypeStringTo(buf *bytes.Buffer, t Type) { +func WriteTypeStringTo(buf *bytes.Buffer, t Type) { //nolint: interfacer buf.WriteString(t.Yql()) } From 2690bff04724f1665905c9c88684aa57daff4017 Mon Sep 17 00:00:00 2001 From: Artem Murashko Date: Thu, 1 Feb 2024 11:52:46 +0300 Subject: [PATCH 54/65] fix reviews --- internal/topic/retriable_error.go | 5 +++-- internal/topic/retriable_error_test.go | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/internal/topic/retriable_error.go b/internal/topic/retriable_error.go index 90ab37981..6e90f036a 100644 --- a/internal/topic/retriable_error.go +++ b/internal/topic/retriable_error.go @@ -13,7 +13,8 @@ import ( ) const ( - DefaultStartTimeout = time.Minute + DefaultStartTimeout = time.Minute + connectionEstablishedTimeout = time.Minute ) type RetrySettings struct { @@ -46,7 +47,7 @@ var ( func CheckResetReconnectionCounters(lastTry, now time.Time, connectionTimeout time.Duration) bool { const resetAttemptEmpiricalCoefficient = 10 if connectionTimeout == value.InfiniteDuration { - return false + return now.Sub(lastTry) > connectionEstablishedTimeout } return now.Sub(lastTry) > connectionTimeout*resetAttemptEmpiricalCoefficient } diff --git a/internal/topic/retriable_error_test.go b/internal/topic/retriable_error_test.go index 6136a2bc6..9de4b2c00 100644 --- a/internal/topic/retriable_error_test.go +++ b/internal/topic/retriable_error_test.go @@ -243,11 +243,17 @@ func TestCheckResetReconnectionCounters(t *testing.T) { shouldReset bool }{ { - name: "InfiniteConnectionTimeout", - lastTry: time.Time{}, + name: "RecentLastTryWithInfiniteConnectionTimeout", + lastTry: now.Add(-30 * time.Second), connectionTimeout: value.InfiniteDuration, shouldReset: false, }, + { + name: "OldLastTryWithInfiniteConnectionTimeout", + lastTry: now.Add(-30 * time.Minute), + connectionTimeout: value.InfiniteDuration, + shouldReset: true, + }, { name: "LastTryLessThanConnectionTimeout", lastTry: now.Add(-30 * time.Second), From 54823f08c84a4a61dee6a3e138c0d576339dd40d Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Thu, 1 Feb 2024 16:53:52 +0300 Subject: [PATCH 55/65] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5528fecf4..86c81bc7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* Fixed topic writer infinite reconnections in some cases * Refactored nil on err `internal/grpcwrapper/rawydb/issues.go`, when golangci-lint nilerr enabled * Refactored nil on err `internal/grpcwrapper/rawtopic/describe_topic.go`, when golangci-lint nilerr enabled From c6e45cd175ad4f1739c79b35155b03492dc169c3 Mon Sep 17 00:00:00 2001 From: size12 <54941444+size12@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:40:43 +0300 Subject: [PATCH 56/65] enabled nlreturn (#1027) * enabled nlreturn + partial fix * nlreturn refactoring pt.2 * fix nlreturn pt. 3 * nlreturn fixed * fixed tests * codegen fix * fixed gtrace codegen --- .golangci.yml | 1 - balancers/balancers.go | 7 + balancers/balancers_test.go | 1 + balancers/config.go | 3 + config/config.go | 1 + config/defaults.go | 2 + coordination/example_test.go | 3 + discovery/example_test.go | 4 + driver_string.go | 1 + driver_string_test.go | 4 +- examples/basic/database_sql/data.go | 5 + examples/basic/database_sql/series.go | 15 ++ examples/basic/gorm/data.go | 1 + examples/basic/gorm/main.go | 3 + examples/basic/gorm/models.go | 3 + examples/basic/native/data.go | 2 + examples/basic/native/series.go | 10 ++ examples/basic/xorm/data.go | 4 + examples/basic/xorm/main.go | 3 + examples/ddl/ddl.go | 2 + examples/decimal/decimal.go | 1 + examples/decimal/main.go | 1 + examples/describe/main.go | 4 + examples/pagination/cities.go | 5 + examples/read_table/orders.go | 6 + examples/serverless/healthcheck/main.go | 1 + examples/serverless/healthcheck/service.go | 9 ++ examples/serverless/url_shortener/main.go | 1 + examples/serverless/url_shortener/service.go | 22 +++ .../topic/cdc-cache-bus-freeseats/cache.go | 1 + .../topic/cdc-cache-bus-freeseats/database.go | 3 + .../cdc-cache-bus-freeseats/webserver.go | 7 + examples/topic/cdc-fill-and-read/tables.go | 5 + .../topic/topicreader/topicreader_advanced.go | 1 + .../topic/topicreader/topicreader_trace.go | 4 + examples/topic/topicwriter/topicwriter.go | 3 + examples/ttl/series.go | 10 ++ examples/ttl_readtable/series.go | 8 ++ internal/allocator/allocator.go | 42 ++++++ internal/background/worker.go | 1 + internal/backoff/backoff.go | 4 + internal/backoff/backoff_test.go | 4 + internal/balancer/balancer.go | 10 ++ internal/balancer/connections_state.go | 4 + internal/balancer/ctx.go | 1 + internal/balancer/local_dc.go | 7 + internal/bind/bind.go | 2 + internal/bind/numeric_args.go | 7 + internal/bind/params.go | 6 + internal/bind/positional_args.go | 4 + internal/bind/sql_lexer.go | 5 + internal/certificates/certificates.go | 4 + internal/cmd/gtrace/main.go | 13 ++ internal/cmd/gtrace/writer.go | 28 ++++ internal/conn/conn.go | 13 ++ internal/conn/context.go | 1 + internal/conn/grpc_client_stream.go | 5 + internal/conn/middleware.go | 6 + internal/conn/pool.go | 3 + internal/coordination/client.go | 11 ++ internal/coordination/config/config.go | 1 + internal/credentials/access_error.go | 2 + internal/credentials/access_token.go | 2 + internal/credentials/anonymous.go | 2 + internal/credentials/static.go | 3 + internal/decimal/decimal.go | 14 ++ internal/decimal/decimal_test.go | 1 + internal/discovery/config/config.go | 1 + internal/discovery/discovery.go | 1 + internal/endpoint/endpoint.go | 9 ++ .../grpcwrapper/rawoptional/rawoptional.go | 5 + internal/grpcwrapper/rawscheme/entry.go | 2 + internal/grpcwrapper/rawtopic/client.go | 6 + .../rawtopic/controlplane_types.go | 1 + .../rawtopic/rawtopiccommon/codec.go | 4 + .../rawtopic/rawtopicreader/messages.go | 10 ++ .../rawtopic/rawtopicreader/rawtopicreader.go | 15 ++ .../rawtopic/rawtopicwriter/messages.go | 5 + .../rawtopic/rawtopicwriter/streamwriter.go | 7 + .../rawtopicwriter/streamwriter_test.go | 3 + internal/grpcwrapper/rawydb/issues.go | 2 + internal/grpcwrapper/rawydb/operation.go | 3 + .../grpcwrapper/rawydb/operation_params.go | 1 + internal/grpcwrapper/rawydb/status.go | 1 + internal/meta/context.go | 3 + internal/meta/incoming.go | 1 + internal/meta/meta.go | 3 + internal/meta/trace_id.go | 1 + internal/mock/conn.go | 3 + internal/operation/context.go | 5 + internal/operation/params.go | 1 + internal/operation/params_test.go | 5 + internal/operation/timeout.go | 1 + internal/ratelimiter/client.go | 15 ++ internal/ratelimiter/config/config.go | 1 + internal/ratelimiter/errors/errors.go | 2 + internal/ratelimiter/options/acquire.go | 1 + internal/repeater/repeater.go | 1 + internal/repeater/repeater_test.go | 2 + internal/scheme/client.go | 15 ++ internal/scheme/config/config.go | 1 + internal/scheme/helpers/check_exists.go | 4 + internal/scheme/helpers/check_exists_test.go | 3 + internal/scripting/client.go | 15 ++ internal/scripting/config/config.go | 1 + internal/secret/password.go | 1 + internal/secret/token.go | 1 + internal/stack/function_id.go | 1 + internal/stack/record.go | 2 + internal/table/client.go | 21 +++ internal/table/client_test.go | 19 +++ internal/table/config/config.go | 1 + internal/table/data_query.go | 2 + internal/table/params.go | 1 + internal/table/retry.go | 3 + internal/table/retry_test.go | 13 ++ internal/table/scanner/result.go | 13 ++ internal/table/scanner/result_test.go | 5 + internal/table/scanner/scan_raw.go | 63 +++++++++ internal/table/scanner/scanner.go | 73 ++++++++++ internal/table/scanner/scanner_data_test.go | 4 + internal/table/scanner/scanner_test.go | 73 ++++++++++ internal/table/scanner/stats.go | 4 + internal/table/session.go | 20 +++ internal/table/session_test.go | 4 + internal/table/statement.go | 1 + internal/table/transaction_test.go | 3 + internal/table/ttl.go | 2 + internal/topic/retriable_error.go | 1 + internal/topic/topicclientinternal/client.go | 8 ++ internal/topic/topicreaderinternal/batch.go | 4 + internal/topic/topicreaderinternal/batcher.go | 7 + .../topic/topicreaderinternal/batcher_test.go | 1 + .../topic/topicreaderinternal/commit_range.go | 4 + .../topicreaderinternal/commit_range_test.go | 1 + .../topic/topicreaderinternal/committer.go | 5 + .../topicreaderinternal/committer_test.go | 12 ++ .../topic/topicreaderinternal/decoders.go | 1 + internal/topic/topicreaderinternal/message.go | 14 ++ .../message_content_pool.go | 1 + .../message_content_pool_test.go | 5 + .../topicreaderinternal/partition_session.go | 5 + internal/topic/topicreaderinternal/reader.go | 2 + .../topic/topicreaderinternal/reader_test.go | 1 + .../topicreaderinternal/stream_reader_impl.go | 15 ++ .../stream_reader_impl_test.go | 6 + .../topicreaderinternal/stream_reconnector.go | 10 ++ .../stream_reconnector_test.go | 8 ++ .../topic/topicwriterinternal/encoders.go | 5 + internal/topic/topicwriterinternal/message.go | 7 + internal/topic/topicwriterinternal/queue.go | 6 + .../topic/topicwriterinternal/queue_test.go | 2 + .../topicwriterinternal/writer_reconnector.go | 17 +++ .../writer_reconnector_test.go | 10 ++ .../writer_reconnector_unsafe_test.go | 1 + .../writer_single_stream.go | 9 ++ internal/value/time.go | 4 + internal/value/time_test.go | 4 + internal/value/type.go | 23 +++ internal/value/value.go | 131 ++++++++++++++++++ internal/value/value_test.go | 3 + internal/version/parse.go | 4 + internal/wait/wait.go | 3 + internal/xcontext/context_with_cancel.go | 2 + internal/xcontext/context_with_cancel_test.go | 8 +- internal/xcontext/context_with_timeout.go | 4 + .../xcontext/context_with_timeout_test.go | 14 +- internal/xcontext/idempotent.go | 1 + internal/xcontext/local_dc.go | 1 + internal/xcontext/retry_call.go | 1 + internal/xerrors/check.go | 2 + internal/xerrors/issues.go | 6 + internal/xerrors/join.go | 3 + internal/xerrors/join_test.go | 8 +- internal/xerrors/operation.go | 5 + internal/xerrors/retryable.go | 2 + internal/xerrors/stacktrace.go | 1 + internal/xerrors/transport.go | 4 + internal/xerrors/xerrors.go | 4 + internal/xerrors/ydb.go | 1 + internal/xrand/xrand.go | 1 + internal/xresolver/xresolver.go | 2 + internal/xsql/badconn/badconn.go | 1 + internal/xsql/conn.go | 35 +++++ internal/xsql/connector.go | 15 ++ internal/xsql/context.go | 4 + internal/xsql/dsn.go | 2 + internal/xsql/dsn_test.go | 1 + internal/xsql/errors.go | 1 + internal/xsql/isolation/isolation.go | 1 + internal/xsql/mode.go | 2 + internal/xsql/rows.go | 5 + internal/xsql/stmt.go | 1 + internal/xsql/tx.go | 7 + internal/xsql/tx_fake.go | 5 + internal/xsql/unwrap.go | 4 + internal/xsql/valuer.go | 1 + internal/xstring/convert.go | 2 + internal/xtest/context.go | 2 + internal/xtest/grpclogger.go | 5 + internal/xtest/waiters.go | 2 + log/context.go | 2 + log/discovery.go | 3 + log/driver.go | 19 +++ log/field.go | 17 +++ log/field_test.go | 2 + log/logger.go | 4 + log/retry.go | 3 + log/scripting.go | 6 + log/sql.go | 13 ++ log/table.go | 24 ++++ log/topic.go | 16 +++ meta/consumed_units.go | 1 + meta/example_test.go | 1 + metrics/driver.go | 8 ++ metrics/error_brief.go | 2 + metrics/retry.go | 3 + metrics/sql.go | 10 ++ metrics/table.go | 4 + metrics/traces.go | 1 + ratelimiter/example_test.go | 2 + retry/context.go | 1 + retry/errors.go | 1 + retry/errors_data_test.go | 1 + retry/retry.go | 2 + retry/retry_test.go | 3 + retry/retryable_error.go | 1 + retry/sql.go | 4 + retry/sql_test.go | 21 +++ scheme/example_test.go | 1 + scheme/options.go | 1 + scheme/scheme.go | 2 + scripting/example_test.go | 9 ++ sugar/certificates.go | 2 + sugar/check_exists.go | 4 + sugar/params.go | 3 + sugar/params_test.go | 3 + sugar/path.go | 1 + table/example_test.go | 15 ++ table/options/models.go | 8 ++ table/options/options.go | 7 + table/result/named/named.go | 3 + table/table.go | 11 ++ table/types/cast.go | 9 ++ table/types/types.go | 2 + table/types/value.go | 43 ++++++ tests/slo/database/sql/storage.go | 2 + tests/slo/internal/config/config.go | 5 + tests/slo/internal/workers/workers.go | 1 + tests/slo/internal/workers/write.go | 1 + tests/slo/xorm/storage.go | 1 + testutil/compare.go | 12 ++ testutil/driver.go | 19 +++ testutil/file_line.go | 1 + testutil/session.go | 1 + topic/example_test.go | 12 ++ topic/topicoptions/topicoptions_alter.go | 5 + topic/topicoptions/topicoptions_create.go | 2 + topic/topicreader/batch_options.go | 2 + topic/topicwriter/topicwriter.go | 2 + trace/details.go | 2 + trace/driver.go | 3 + trace/trace_test.go | 1 + trace/traceutil.go | 2 + 264 files changed, 1731 insertions(+), 11 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 946776d43..40e5b3514 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -238,7 +238,6 @@ linters: - ireturn - maintidx - maligned - - nlreturn - nonamedreturns - paralleltest - protogetter diff --git a/balancers/balancers.go b/balancers/balancers.go index f5fa1076e..c73c8f503 100644 --- a/balancers/balancers.go +++ b/balancers/balancers.go @@ -40,6 +40,7 @@ func (filterLocalDC) String() string { func PreferLocalDC(balancer *balancerConfig.Config) *balancerConfig.Config { balancer.Filter = filterLocalDC{} balancer.DetectLocalDC = true + return balancer } @@ -49,6 +50,7 @@ func PreferLocalDC(balancer *balancerConfig.Config) *balancerConfig.Config { func PreferLocalDCWithFallBack(balancer *balancerConfig.Config) *balancerConfig.Config { balancer = PreferLocalDC(balancer) balancer.AllowFallback = true + return balancer } @@ -61,6 +63,7 @@ func (locations filterLocations) Allow(_ balancerConfig.Info, c conn.Conn) bool return true } } + return false } @@ -91,6 +94,7 @@ func PreferLocations(balancer *balancerConfig.Config, locations ...string) *bala } sort.Strings(locations) balancer.Filter = filterLocations(locations) + return balancer } @@ -100,6 +104,7 @@ func PreferLocations(balancer *balancerConfig.Config, locations ...string) *bala func PreferLocationsWithFallback(balancer *balancerConfig.Config, locations ...string) *balancerConfig.Config { balancer = PreferLocations(balancer, locations...) balancer.AllowFallback = true + return balancer } @@ -129,6 +134,7 @@ func Prefer(balancer *balancerConfig.Config, filter func(endpoint Endpoint) bool balancer.Filter = filterFunc(func(_ balancerConfig.Info, c conn.Conn) bool { return filter(c.Endpoint()) }) + return balancer } @@ -138,6 +144,7 @@ func Prefer(balancer *balancerConfig.Config, filter func(endpoint Endpoint) bool func PreferWithFallback(balancer *balancerConfig.Config, filter func(endpoint Endpoint) bool) *balancerConfig.Config { balancer = Prefer(balancer, filter) balancer.AllowFallback = true + return balancer } diff --git a/balancers/balancers_test.go b/balancers/balancers_test.go index 2c7c4efd8..75d0758b0 100644 --- a/balancers/balancers_test.go +++ b/balancers/balancers_test.go @@ -66,5 +66,6 @@ func applyPreferFilter(info balancerConfig.Info, b *balancerConfig.Config, conns res = append(res, c) } } + return res } diff --git a/balancers/config.go b/balancers/config.go index 04623862f..ee70ec57f 100644 --- a/balancers/config.go +++ b/balancers/config.go @@ -92,6 +92,7 @@ func CreateFromConfig(s string) (*balancerConfig.Config, error) { if c.Fallback { return PreferLocalDCWithFallBack(b), nil } + return PreferLocalDC(b), nil case preferTypeLocations: if len(c.Locations) == 0 { @@ -100,6 +101,7 @@ func CreateFromConfig(s string) (*balancerConfig.Config, error) { if c.Fallback { return PreferLocationsWithFallback(b, c.Locations...), nil } + return PreferLocations(b, c.Locations...), nil default: return b, nil @@ -125,6 +127,7 @@ func FromConfig(config string, opts ...fromConfigOption) *balancerConfig.Config if h.errorHandler != nil { h.errorHandler(err) } + return h.fallbackBalancer } diff --git a/config/config.go b/config/config.go index 5cf9a0a09..e3578ee58 100644 --- a/config/config.go +++ b/config/config.go @@ -292,5 +292,6 @@ func (c *Config) With(opts ...Option) *Config { c.trace, c.metaOptions..., ) + return c } diff --git a/config/defaults.go b/config/defaults.go index a5dcfeb83..e63867808 100644 --- a/config/defaults.go +++ b/config/defaults.go @@ -64,6 +64,7 @@ func defaultGrpcOptions(t *trace.Driver, secure bool, tlsConfig *tls.Config) (op insecure.NewCredentials(), )) } + return opts } @@ -72,6 +73,7 @@ func certPool() *x509.CertPool { if err == nil { return certPool } + return x509.NewCertPool() } diff --git a/coordination/example_test.go b/coordination/example_test.go index f1e416294..57657d779 100644 --- a/coordination/example_test.go +++ b/coordination/example_test.go @@ -14,6 +14,7 @@ func Example() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -28,12 +29,14 @@ func Example() { }) if err != nil { fmt.Printf("failed to create node: %v", err) + return } defer db.Coordination().DropNode(ctx, "/local/test") e, c, err := db.Coordination().DescribeNode(ctx, "/local/test") if err != nil { fmt.Printf("failed to describe node: %v", err) + return } fmt.Printf("node description: %+v\nnode config: %+v\n", e, c) diff --git a/discovery/example_test.go b/discovery/example_test.go index 30ca45b40..87b142ab1 100644 --- a/discovery/example_test.go +++ b/discovery/example_test.go @@ -12,12 +12,14 @@ func Example_discoverCluster() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources endpoints, err := db.Discovery().Discover(ctx) if err != nil { fmt.Printf("discover failed: %v", err) + return } fmt.Printf("%s endpoints:\n", db.Name()) @@ -31,12 +33,14 @@ func Example_whoAmI() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources whoAmI, err := db.Discovery().WhoAmI(ctx) if err != nil { fmt.Printf("discover failed: %v", err) + return } fmt.Printf("%s whoAmI: %s\n", db.Name(), whoAmI.String()) diff --git a/driver_string.go b/driver_string.go index d2b5fd6f7..32b52fbc8 100644 --- a/driver_string.go +++ b/driver_string.go @@ -18,5 +18,6 @@ func (d *Driver) String() string { fmt.Fprintf(buffer, ",Credentials:%v", c.String()) } buffer.WriteByte('}') + return buffer.String() } diff --git a/driver_string_test.go b/driver_string_test.go index 812a81e94..cc4e1cbe9 100644 --- a/driver_string_test.go +++ b/driver_string_test.go @@ -23,7 +23,7 @@ func TestDriver_String(t *testing.T) { config.WithDatabase("local"), config.WithSecure(false), )}, - s: `Driver{Endpoint:"localhost",Database:"local",Secure:false,Credentials:Anonymous{From:"github.com/ydb-platform/ydb-go-sdk/v3/config.defaultConfig(defaults.go:88)"}}`, //nolint:lll + s: `Driver{Endpoint:"localhost",Database:"local",Secure:false,Credentials:Anonymous{From:"github.com/ydb-platform/ydb-go-sdk/v3/config.defaultConfig(defaults.go:90)"}}`, //nolint:lll }, { name: xtest.CurrentFileLine(), @@ -32,7 +32,7 @@ func TestDriver_String(t *testing.T) { config.WithDatabase("local"), config.WithSecure(true), )}, - s: `Driver{Endpoint:"localhost",Database:"local",Secure:true,Credentials:Anonymous{From:"github.com/ydb-platform/ydb-go-sdk/v3/config.defaultConfig(defaults.go:88)"}}`, //nolint:lll + s: `Driver{Endpoint:"localhost",Database:"local",Secure:true,Credentials:Anonymous{From:"github.com/ydb-platform/ydb-go-sdk/v3/config.defaultConfig(defaults.go:90)"}}`, //nolint:lll }, { name: xtest.CurrentFileLine(), diff --git a/examples/basic/database_sql/data.go b/examples/basic/database_sql/data.go index 74f94c84f..5b373b7a3 100644 --- a/examples/basic/database_sql/data.go +++ b/examples/basic/database_sql/data.go @@ -18,6 +18,7 @@ func seriesData(id string, released time.Time, title, info, comment string) type } else { commentv = types.OptionalValue(types.TextValue(comment)) } + return types.StructValue( types.StructFieldValue("series_id", types.BytesValueFromString(id)), types.StructFieldValue("release_date", types.DateValueFromTime(released)), @@ -59,6 +60,7 @@ func getData() (series, seasons, episodes []types.Value) { seasons = append(seasons, seasonsData...) episodes = append(episodes, episodesData...) } + return } @@ -114,6 +116,7 @@ func getDataForITCrowd(seriesID string) (series types.Value, seasons, episodes [ episodes = append(episodes, episodeData(seriesID, seasonID, uuid.New().String(), title, date)) } } + return series, seasons, episodes } @@ -193,6 +196,7 @@ func getDataForSiliconValley(seriesID string) (series types.Value, seasons, epis episodes = append(episodes, episodeData(seriesID, seasonID, uuid.New().String(), title, date)) } } + return series, seasons, episodes } @@ -203,5 +207,6 @@ func date(date string) time.Time { if err != nil { panic(err) } + return t } diff --git a/examples/basic/database_sql/series.go b/examples/basic/database_sql/series.go index d76904e50..28c39a50d 100644 --- a/examples/basic/database_sql/series.go +++ b/examples/basic/database_sql/series.go @@ -30,6 +30,7 @@ func selectDefault(ctx context.Context, db *sql.DB) (err error) { return err } log.Printf("AST = %s\n\nPlan = %s", ast, plan) + return nil }, retry.WithIdempotent(true)) if err != nil { @@ -61,11 +62,13 @@ func selectDefault(ctx context.Context, db *sql.DB) (err error) { *id, *title, releaseDate.Format("2006-01-02"), ) } + return rows.Err() }, retry.WithIdempotent(true)) if err != nil { return fmt.Errorf("execute data query failed: %w", err) } + return nil } @@ -154,11 +157,13 @@ func selectScan(ctx context.Context, db *sql.DB) (err error) { episodeID, title, firstAired.Format("2006-01-02"), ) } + return rows.Err() }, retry.WithIdempotent(true)) if err != nil { return fmt.Errorf("scan query failed: %w", err) } + return nil } @@ -201,11 +206,13 @@ func fillTablesWithData(ctx context.Context, db *sql.DB) (err error) { ); err != nil { return err } + return nil }, retry.WithIdempotent(true)) if err != nil { return fmt.Errorf("upsert query failed: %w", err) } + return nil } @@ -232,8 +239,10 @@ func prepareSchema(ctx context.Context, db *sql.DB) (err error) { ) if err != nil { _, _ = fmt.Fprintf(os.Stderr, "create series table failed: %v", err) + return err } + return nil }, retry.WithIdempotent(true)) if err != nil { @@ -263,8 +272,10 @@ func prepareSchema(ctx context.Context, db *sql.DB) (err error) { ) if err != nil { _, _ = fmt.Fprintf(os.Stderr, "create seasons table failed: %v\n", err) + return err } + return nil }, retry.WithIdempotent(true)) if err != nil { @@ -296,13 +307,16 @@ func prepareSchema(ctx context.Context, db *sql.DB) (err error) { ) if err != nil { _, _ = fmt.Fprintf(os.Stderr, "create episodes table failed: %v\n", err) + return err } + return nil }, retry.WithIdempotent(true)) if err != nil { return fmt.Errorf("create table failed: %w", err) } + return nil } @@ -326,5 +340,6 @@ func dropTableIfExists(ctx context.Context, cc *sql.Conn, tableName string) erro if err != nil { return fmt.Errorf("drop table failed: %w", err) } + return nil } diff --git a/examples/basic/gorm/data.go b/examples/basic/gorm/data.go index 6d92ad170..b5b72f269 100644 --- a/examples/basic/gorm/data.go +++ b/examples/basic/gorm/data.go @@ -373,5 +373,6 @@ func date(date string) time.Time { if err != nil { panic(err) } + return t } diff --git a/examples/basic/gorm/main.go b/examples/basic/gorm/main.go index 6affba9e0..725032216 100644 --- a/examples/basic/gorm/main.go +++ b/examples/basic/gorm/main.go @@ -85,6 +85,7 @@ func prepareScheme(db *gorm.DB) error { ); err != nil { return err } + return db.AutoMigrate( &Series{}, &Season{}, @@ -123,6 +124,7 @@ func readAll(db *gorm.DB) error { } } } + return nil } @@ -161,5 +163,6 @@ func findEpisodesByTitle(db *gorm.DB, fragment string) error { episodes[i].ID, episodes[i].AirDate.Format(dateISO8601), episodes[i].Title, ) } + return nil } diff --git a/examples/basic/gorm/models.go b/examples/basic/gorm/models.go index c96edc7ee..8b2b05d64 100644 --- a/examples/basic/gorm/models.go +++ b/examples/basic/gorm/models.go @@ -26,6 +26,7 @@ func (s *Series) BeforeCreate(_ *gorm.DB) (err error) { for i := range s.Seasons { s.Seasons[i].SeriesID = s.ID } + return } @@ -48,6 +49,7 @@ func (s *Season) BeforeCreate(_ *gorm.DB) (err error) { for i := range s.Episodes { s.Episodes[i].SeasonID = s.ID } + return } @@ -64,5 +66,6 @@ func (e *Episode) BeforeCreate(_ *gorm.DB) (err error) { return err } e.ID = id.String() + return } diff --git a/examples/basic/native/data.go b/examples/basic/native/data.go index cc8e7f3fc..cc4b12547 100644 --- a/examples/basic/native/data.go +++ b/examples/basic/native/data.go @@ -13,6 +13,7 @@ func seriesData(id uint64, released time.Time, title, info, comment string) type } else { commentv = types.OptionalValue(types.TextValue(comment)) } + return types.StructValue( types.StructFieldValue("series_id", types.Uint64Value(id)), types.StructFieldValue("release_date", types.DateValueFromTime(released)), @@ -155,5 +156,6 @@ func days(date string) time.Time { if err != nil { panic(err) } + return t } diff --git a/examples/basic/native/series.go b/examples/basic/native/series.go index a9e267aab..625c5967e 100644 --- a/examples/basic/native/series.go +++ b/examples/basic/native/series.go @@ -80,6 +80,7 @@ func readTable(ctx context.Context, c table.Client, path string) (err error) { options.ReadColumn("title"), options.ReadColumn("release_date"), ) + return }, ) @@ -142,6 +143,7 @@ func describeTableOptions(ctx context.Context, c table.Client) (err error) { err = c.Do(ctx, func(ctx context.Context, s table.Session) (err error) { desc, err = s.DescribeTableOptions(ctx) + return }, ) @@ -227,6 +229,7 @@ func selectSimple(ctx context.Context, c table.Client, prefix string) (err error ), options.WithCollectStatsModeBasic(), ) + return }, ) @@ -259,6 +262,7 @@ func selectSimple(ctx context.Context, c table.Client, prefix string) (err error ) } } + return res.Err() } @@ -317,6 +321,7 @@ func scanQuerySelect(ctx context.Context, c table.Client, prefix string) (err er log.Printf("# Season, SeriesId: %d, SeasonId: %d, Title: %s, Air date: %s", seriesID, seasonID, title, date) } } + return res.Err() }, ) @@ -338,9 +343,11 @@ func fillTablesWithData(ctx context.Context, c table.Client, prefix string) (err table.ValueParam("$seasonsData", getSeasonsData()), table.ValueParam("$episodesData", getEpisodesData()), )) + return err }, ) + return err } @@ -407,9 +414,11 @@ func describeTable(ctx context.Context, c table.Client, path string) (err error) for i := range desc.Columns { log.Printf("column, name: %s, %s", desc.Columns[i].Type, desc.Columns[i].Name) } + return nil }, ) + return } @@ -419,5 +428,6 @@ func render(t *template.Template, data interface{}) string { if err != nil { panic(err) } + return buf.String() } diff --git a/examples/basic/xorm/data.go b/examples/basic/xorm/data.go index eb085e19c..c6cfbb3fe 100644 --- a/examples/basic/xorm/data.go +++ b/examples/basic/xorm/data.go @@ -49,6 +49,7 @@ func getData() (series []*Series, seasons []*Seasons, episodes []*Episodes) { seasons = append(seasons, seasonsData...) episodes = append(episodes, episodesData...) } + return } @@ -112,6 +113,7 @@ func getDataForITCrowd(seriesID string) (series *Series, seasons []*Seasons, epi episodes = append(episodes, episodeData(seasonID, uuid.New().String(), title, date)) } } + return series, seasons, episodes } @@ -201,6 +203,7 @@ func getDataForSiliconValley(seriesID string) (series *Series, seasons []*Season episodes = append(episodes, episodeData(seasonID, uuid.New().String(), title, date)) } } + return series, seasons, episodes } @@ -211,5 +214,6 @@ func date(date string) time.Time { if err != nil { panic(err) } + return t } diff --git a/examples/basic/xorm/main.go b/examples/basic/xorm/main.go index 94f580bd6..8a0961af5 100644 --- a/examples/basic/xorm/main.go +++ b/examples/basic/xorm/main.go @@ -76,6 +76,7 @@ func prepareScheme(db *xorm.Engine) error { } err = db.CreateTables(&Series{}, &Seasons{}, &Episodes{}) + return err } @@ -88,6 +89,7 @@ func fillData(db *xorm.Engine) error { if _, err := session.Insert(&series, &seasons, &episodes); err != nil { return err } + return nil } @@ -177,5 +179,6 @@ func findEpisodesByTitle(db *xorm.Engine, fragment string) error { e.ID, e.AirDate.Format(dateISO8601), e.Title, ) } + return nil } diff --git a/examples/ddl/ddl.go b/examples/ddl/ddl.go index 6641c913f..9e0d4725a 100644 --- a/examples/ddl/ddl.go +++ b/examples/ddl/ddl.go @@ -71,11 +71,13 @@ func executeQuery(ctx context.Context, c table.Client, prefix, query string) (er err = c.Do(ctx, func(ctx context.Context, s table.Session) error { err = s.ExecuteSchemeQuery(ctx, fmt.Sprintf(query, prefix)) + return err }, ) if err != nil { return err } + return nil } diff --git a/examples/decimal/decimal.go b/examples/decimal/decimal.go index 9934ca15e..51400f575 100644 --- a/examples/decimal/decimal.go +++ b/examples/decimal/decimal.go @@ -34,5 +34,6 @@ func render(t *template.Template, data interface{}) string { if err != nil { panic(err) } + return buf.String() } diff --git a/examples/decimal/main.go b/examples/decimal/main.go index 7f79d4850..8e77c2ce1 100644 --- a/examples/decimal/main.go +++ b/examples/decimal/main.go @@ -130,6 +130,7 @@ func main() { fmt.Println(p.String()) } } + return res.Err() }, ) diff --git a/examples/describe/main.go b/examples/describe/main.go index 229a08d96..93fb00333 100644 --- a/examples/describe/main.go +++ b/examples/describe/main.go @@ -101,10 +101,12 @@ func list(ctx context.Context, db *ydb.Driver, t *template.Template, p string) { var err error err = retry.Retry(ctx, func(ctx context.Context) (err error) { dir, err = db.Scheme().ListDirectory(ctx, p) + return err }, retry.WithIdempotent(true)) if err != nil { fmt.Printf("list directory '%s' failed: %v\n", p, err) + return } @@ -121,10 +123,12 @@ func list(ctx context.Context, db *ydb.Driver, t *template.Template, p string) { var desc options.Description err = db.Table().Do(ctx, func(ctx context.Context, s table.Session) (err error) { desc, err = s.DescribeTable(ctx, pt) + return err }, table.WithIdempotent()) if err != nil { fmt.Printf("describe '%s' failed: %v\n", pt, err) + continue } desc.Name = pt diff --git a/examples/pagination/cities.go b/examples/pagination/cities.go index 2fd8aa846..620e9ee72 100644 --- a/examples/pagination/cities.go +++ b/examples/pagination/cities.go @@ -69,6 +69,7 @@ func selectPaging( }() if !res.NextResultSet(ctx) || !res.HasNextRow() { empty = true + return res.Err() } var addr string @@ -83,9 +84,11 @@ func selectPaging( } fmt.Printf("\t%v, School #%v, Address: %v\n", *lastCity, *lastNum, addr) } + return res.Err() }, ) + return empty, err } @@ -112,8 +115,10 @@ func fillTableWithData(ctx context.Context, c table.Client, prefix string) (err _, _, err = s.Execute(ctx, writeTx, query, table.NewQueryParameters( table.ValueParam("$schoolsData", getSchoolData()), )) + return err }) + return err } diff --git a/examples/read_table/orders.go b/examples/read_table/orders.go index 7255608ef..c9e007193 100644 --- a/examples/read_table/orders.go +++ b/examples/read_table/orders.go @@ -31,6 +31,7 @@ func dropTableIfExists(ctx context.Context, c table.Client, path string) (err er if !ydb.IsOperationErrorSchemeError(err) { return err } + return nil } @@ -76,6 +77,7 @@ func render(t *template.Template, data interface{}) string { if err != nil { panic(err) } + return buf.String() } @@ -116,6 +118,7 @@ func fillTable(ctx context.Context, c table.Client, prefix string) (err error) { ), ), ) + return err }, ) @@ -126,6 +129,7 @@ func order(customerID, orderID uint64, description, date string) types.Value { if err != nil { panic(err) } + return types.StructValue( types.StructFieldValue("customer_id", types.Uint64Value(customerID)), types.StructFieldValue("order_id", types.Uint64Value(orderID)), @@ -173,8 +177,10 @@ func readTable(ctx context.Context, c table.Client, path string, opts ...options } } } + return res.Err() }, ) + return err } diff --git a/examples/serverless/healthcheck/main.go b/examples/serverless/healthcheck/main.go index fa44c3b72..5e828aa31 100644 --- a/examples/serverless/healthcheck/main.go +++ b/examples/serverless/healthcheck/main.go @@ -32,6 +32,7 @@ func (u *URLs) String() string { // Set appends new value to URLs holder func (u *URLs) Set(s string) error { u.urls = append(u.urls, s) + return nil } diff --git a/examples/serverless/healthcheck/service.go b/examples/serverless/healthcheck/service.go index 3f7ed883b..7e5ecb486 100644 --- a/examples/serverless/healthcheck/service.go +++ b/examples/serverless/healthcheck/service.go @@ -42,6 +42,7 @@ func getService(ctx context.Context, dsn string, opts ...ydb.Option) (s *service s.db, err = ydb.Open(ctx, dsn, opts...) if err != nil { err = fmt.Errorf("connect error: %w", err) + return } err = s.createTableIfNotExists(ctx) @@ -52,8 +53,10 @@ func getService(ctx context.Context, dsn string, opts ...ydb.Option) (s *service }) if err != nil { once = sync.Once{} + return nil, err } + return s, nil } @@ -82,6 +85,7 @@ func (s *service) createTableIfNotExists(ctx context.Context) error { AUTO_PARTITIONING_BY_LOAD = ENABLED );`, path.Join(s.db.Name(), prefix), ) + return s.db.Table().Do(ctx, func(ctx context.Context, s table.Session) error { return s.ExecuteSchemeQuery(ctx, query) @@ -108,6 +112,7 @@ func (s *service) ping(ctx context.Context, path string) (code int32, err error) defer func() { _ = response.Body.Close() }() + return int32(response.StatusCode), nil } @@ -159,6 +164,7 @@ func (s *service) upsertRows(ctx context.Context, rows []row) (err error) { if err != nil { return err.Error() } + return "" }(rows[i].err))), ) @@ -185,12 +191,14 @@ func (s *service) upsertRows(ctx context.Context, rows []row) (err error) { table.ValueParam("$rows", types.ListValue(values...)), ), ) + return err }, ) if err != nil { return fmt.Errorf("error on upsert rows: %w", err) } + return nil } @@ -208,5 +216,6 @@ func Serverless(ctx context.Context) error { return fmt.Errorf("error on create service: %w", err) } defer s.Close(ctx) + return s.check(ctx, strings.Split(os.Getenv("URLS"), ",")) } diff --git a/examples/serverless/url_shortener/main.go b/examples/serverless/url_shortener/main.go index 40eadc06a..7e8ad0919 100644 --- a/examples/serverless/url_shortener/main.go +++ b/examples/serverless/url_shortener/main.go @@ -93,6 +93,7 @@ func main() { if err != nil { fmt.Println() fmt.Println("Create service failed. Re-run with flag '-log-level=warn' and see logs") + return } defer s.Close(ctx) diff --git a/examples/serverless/url_shortener/service.go b/examples/serverless/url_shortener/service.go index daf3063d4..b7a435458 100644 --- a/examples/serverless/url_shortener/service.go +++ b/examples/serverless/url_shortener/service.go @@ -45,6 +45,7 @@ func hash(s string) (string, error) { if err != nil { return "", err } + return hex.EncodeToString(hasher.Sum(nil)), nil } @@ -62,6 +63,7 @@ func render(t *template.Template, data interface{}) string { if err != nil { panic(err) } + return buf.String() } @@ -148,6 +150,7 @@ func getService(ctx context.Context, dsn string, opts ...ydb.Option) (s *service s.db, err = ydb.Open(ctx, dsn, opts...) if err != nil { err = fmt.Errorf("connect error: %w", err) + return } @@ -162,13 +165,16 @@ func getService(ctx context.Context, dsn string, opts ...ydb.Option) (s *service if err != nil { _ = s.db.Close(ctx) err = fmt.Errorf("error on create table: %w", err) + return } }) if err != nil { once = sync.Once{} + return nil, err } + return s, nil } @@ -192,9 +198,11 @@ func (s *service) createTable(ctx context.Context) (err error) { TablePathPrefix: path.Join(s.db.Name(), prefix), }, ) + return s.db.Table().Do(ctx, func(ctx context.Context, s table.Session) error { err := s.ExecuteSchemeQuery(ctx, query) + return err }, ) @@ -236,9 +244,11 @@ func (s *service) insertShort(ctx context.Context, url string) (h string, err er ), options.WithCollectStatsModeBasic(), ) + return }, ) + return h, err } @@ -275,6 +285,7 @@ func (s *service) selectLong(ctx context.Context, hash string) (url string, err ), options.WithCollectStatsModeBasic(), ) + return err }, ) @@ -290,9 +301,11 @@ func (s *service) selectLong(ctx context.Context, hash string) (url string, err err = res.ScanNamed( named.OptionalWithDefault("src", &src), ) + return src, err } } + return "", fmt.Errorf("hash '%s' is not found", hash) } @@ -305,6 +318,7 @@ func successToString(b bool) string { if b { return "true" } + return "false" } @@ -332,6 +346,7 @@ func (s *service) handleIndex(w http.ResponseWriter, r *http.Request) { tpl, err = template.ParseFS(static, "static/index.html") if err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } w.Header().Set("Content-Type", "text/html") @@ -341,6 +356,7 @@ func (s *service) handleIndex(w http.ResponseWriter, r *http.Request) { } if err = tpl.Execute(w, data); err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } } @@ -370,16 +386,19 @@ func (s *service) handleShorten(w http.ResponseWriter, r *http.Request) { url, err = io.ReadAll(r.Body) if err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } if !isLongCorrect(string(url)) { err = fmt.Errorf("'%s' is not a valid URL", url) writeResponse(w, http.StatusBadRequest, err.Error()) + return } hash, err = s.insertShort(r.Context(), string(url)) if err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } w.Header().Set("Content-Type", "application/text") @@ -411,11 +430,13 @@ func (s *service) handleLonger(w http.ResponseWriter, r *http.Request) { if !isShortCorrect(path[len(path)-1]) { err = fmt.Errorf("'%s' is not a valid short path", path[len(path)-1]) writeResponse(w, http.StatusBadRequest, err.Error()) + return } url, err = s.selectLong(r.Context(), path[len(path)-1]) if err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } http.Redirect(w, r, url, http.StatusSeeOther) @@ -432,6 +453,7 @@ func Serverless(w http.ResponseWriter, r *http.Request) { ) if err != nil { writeResponse(w, http.StatusInternalServerError, err.Error()) + return } defer s.Close(r.Context()) diff --git a/examples/topic/cdc-cache-bus-freeseats/cache.go b/examples/topic/cdc-cache-bus-freeseats/cache.go index ada1aac22..4e67084f6 100644 --- a/examples/topic/cdc-cache-bus-freeseats/cache.go +++ b/examples/topic/cdc-cache-bus-freeseats/cache.go @@ -35,6 +35,7 @@ func (c *Cache) Get(key string) (int64, bool) { if time.Now().After(item.ExpiresAt) { delete(c.values, key) + return 0, false } diff --git a/examples/topic/cdc-cache-bus-freeseats/database.go b/examples/topic/cdc-cache-bus-freeseats/database.go index 218b892b6..43ad188ce 100644 --- a/examples/topic/cdc-cache-bus-freeseats/database.go +++ b/examples/topic/cdc-cache-bus-freeseats/database.go @@ -32,6 +32,7 @@ func createTables(ctx context.Context, db *ydb.Driver) error { if ydb.IsOperationErrorSchemeError(err) { err = nil } + return err }) if err != nil { @@ -59,6 +60,7 @@ UPSERT INTO bus (id, freeSeats) VALUES ("bus1", 40), ("bus2", 60); if err != nil { return fmt.Errorf("failed insert rows: %w", err) } + return nil } @@ -104,6 +106,7 @@ func connect() *ydb.Driver { panic(fmt.Errorf("failed to create to ydb: %w", err)) } log.Printf("connected to database") + return db } diff --git a/examples/topic/cdc-cache-bus-freeseats/webserver.go b/examples/topic/cdc-cache-bus-freeseats/webserver.go index 2d045b29e..3825fabce 100644 --- a/examples/topic/cdc-cache-bus-freeseats/webserver.go +++ b/examples/topic/cdc-cache-bus-freeseats/webserver.go @@ -55,6 +55,7 @@ func (s *server) GetFreeSeatsHandler(writer http.ResponseWriter, request *http.R freeSeats, err := s.getFreeSeats(ctx, id) if err != nil { http.Error(writer, err.Error(), http.StatusInternalServerError) + return } duration := time.Since(start) @@ -73,6 +74,7 @@ func (s *server) BuyTicketHandler(writer http.ResponseWriter, request *http.Requ } else { http.Error(writer, err.Error(), http.StatusInternalServerError) } + return } //nolint:gocritic @@ -105,6 +107,7 @@ func (s *server) getContentFromDB(ctx context.Context, id string) (int64, error) err := s.db.Table().DoTx(ctx, func(ctx context.Context, tx table.TransactionActor) error { var err error freeSeats, err = s.getFreeSeatsTx(ctx, tx, id) + return err }) @@ -129,6 +132,7 @@ SELECT freeSeats FROM bus WHERE id=$id; if !res.NextRow() { freeSeats = 0 + return 0, errors.New("not found") } @@ -157,11 +161,13 @@ DECLARE $id AS Text; UPDATE bus SET freeSeats = freeSeats - 1 WHERE id=$id; `, table.NewQueryParameters(table.ValueParam("$id", types.UTF8Value(id)))) + return err }) if err == nil { freeSeats-- } + return freeSeats, err } @@ -192,6 +198,7 @@ func (s *server) IndexPageHandler(writer http.ResponseWriter, request *http.Requ }) if err != nil { http.Error(writer, err.Error(), http.StatusInternalServerError) + return } diff --git a/examples/topic/cdc-fill-and-read/tables.go b/examples/topic/cdc-fill-and-read/tables.go index fcf5050f5..a522bdf11 100644 --- a/examples/topic/cdc-fill-and-read/tables.go +++ b/examples/topic/cdc-fill-and-read/tables.go @@ -29,6 +29,7 @@ func dropTableIfExists(ctx context.Context, c table.Client, path string) (err er if !ydb.IsOperationErrorSchemeError(err) { return err } + return nil } @@ -60,11 +61,13 @@ WITH ( MODE = 'NEW_AND_OLD_IMAGES' ) `, prefix, tableName) + return s.ExecuteSchemeQuery(ctx, query) }) if err != nil { return fmt.Errorf("failed to add changefeed to test table: %w", err) } + return nil } @@ -90,6 +93,7 @@ VALUES ) _ = c.DoTx(ctx, func(ctx context.Context, tx table.TransactionActor) error { _, err := tx.Execute(ctx, query, params) + return err }) @@ -114,6 +118,7 @@ WHERE id=$id ) _ = c.DoTx(ctx, func(ctx context.Context, tx table.TransactionActor) error { _, err := tx.Execute(ctx, query, params) + return err }) diff --git a/examples/topic/topicreader/topicreader_advanced.go b/examples/topic/topicreader/topicreader_advanced.go index cc1cb29be..962f4700b 100644 --- a/examples/topic/topicreader/topicreader_advanced.go +++ b/examples/topic/topicreader/topicreader_advanced.go @@ -36,6 +36,7 @@ func (m *MyMessage) UnmarshalYDBTopicMessage(data []byte) error { m.ID = data[0] m.ChangeType = data[1] m.Delta = binary.BigEndian.Uint32(data[2:]) + return nil } diff --git a/examples/topic/topicreader/topicreader_trace.go b/examples/topic/topicreader/topicreader_trace.go index 2de678993..28ab11427 100644 --- a/examples/topic/topicreader/topicreader_trace.go +++ b/examples/topic/topicreader/topicreader_trace.go @@ -44,6 +44,7 @@ func ExplicitPartitionStartStopHandler(ctx context.Context, db *ydb.Driver) { if err != nil { stopReader() } + return nil }, OnReaderPartitionReadStopResponse: func( @@ -57,6 +58,7 @@ func ExplicitPartitionStartStopHandler(ctx context.Context, db *ydb.Driver) { stopReader() } } + return nil }, }, @@ -107,6 +109,7 @@ func PartitionStartStopHandlerAndOwnReadProgressStorage(ctx context.Context, db if err != nil { stopReader() } + return nil } @@ -121,6 +124,7 @@ func PartitionStartStopHandlerAndOwnReadProgressStorage(ctx context.Context, db stopReader() } } + return nil } diff --git a/examples/topic/topicwriter/topicwriter.go b/examples/topic/topicwriter/topicwriter.go index 7faecd584..a378f8a90 100644 --- a/examples/topic/topicwriter/topicwriter.go +++ b/examples/topic/topicwriter/topicwriter.go @@ -12,16 +12,19 @@ import ( func ConnectSimple(ctx context.Context, db *ydb.Driver) *topicwriter.Writer { writer, _ := db.Topic().StartWriter("topicName") + return writer } func ConnectWithSyncWrite(ctx context.Context, db *ydb.Driver) *topicwriter.Writer { writer, _ := db.Topic().StartWriter("topicName", topicoptions.WithSyncWrite(true)) + return writer } func ConnectSelectCodec(ctx context.Context, db *ydb.Driver) *topicwriter.Writer { writer, _ := db.Topic().StartWriter("topicName", topicoptions.WithCodec(topictypes.CodecGzip)) + return writer } diff --git a/examples/ttl/series.go b/examples/ttl/series.go index 9aff311ea..a6e4753c3 100644 --- a/examples/ttl/series.go +++ b/examples/ttl/series.go @@ -62,6 +62,7 @@ func readExpiredBatchTransaction(ctx context.Context, c table.Client, prefix str table.ValueParam("$prev_timestamp", types.Uint64Value(prevTimestamp)), table.ValueParam("$prev_doc_id", types.Uint64Value(prevDocID)), )) + return err }, ) @@ -71,6 +72,7 @@ func readExpiredBatchTransaction(ctx context.Context, c table.Client, prefix str if res.Err() != nil { return nil, res.Err() } + return res, nil } @@ -97,9 +99,11 @@ func deleteDocumentWithTimestamp(ctx context.Context, table.ValueParam("$doc_id", types.Uint64Value(lastDocID)), table.ValueParam("$timestamp", types.Uint64Value(timestamp)), )) + return err }, ) + return err } @@ -137,12 +141,14 @@ func deleteExpired(ctx context.Context, c table.Client, prefix string, queue, ti return err } } + return res.Err() }() if err != nil { return err } } + return nil } @@ -196,9 +202,11 @@ func readDocument(ctx context.Context, c table.Client, prefix, url string) error } else { fmt.Println("\tNot found") } + return res.Err() }, ) + return err } @@ -234,9 +242,11 @@ func addDocument(ctx context.Context, c table.Client, prefix, url, html string, table.ValueParam("$html", types.TextValue(html)), table.ValueParam("$timestamp", types.Uint64Value(timestamp)), )) + return err }, ) + return err } diff --git a/examples/ttl_readtable/series.go b/examples/ttl_readtable/series.go index cb6fb62ec..0ed5c33a3 100644 --- a/examples/ttl_readtable/series.go +++ b/examples/ttl_readtable/series.go @@ -47,6 +47,7 @@ func deleteExpiredDocuments(ctx context.Context, c table.Client, prefix string, for i := range ids { k[i] = types.StructValue(types.StructFieldValue("doc_id", types.Uint64Value(ids[i]))) } + return k }()...) @@ -60,9 +61,11 @@ func deleteExpiredDocuments(ctx context.Context, c table.Client, prefix string, table.ValueParam("$timestamp", types.Uint64Value(timestamp)), ), ) + return err }, ) + return err } @@ -78,6 +81,7 @@ func deleteExpiredRange(ctx context.Context, c table.Client, prefix string, time options.ReadKeyRange(keyRange), options.ReadColumn("doc_id"), options.ReadColumn("ts")) + return err }, ) @@ -136,6 +140,7 @@ func deleteExpired(ctx context.Context, c table.Client, prefix string, timestamp err := c.Do(ctx, func(ctx context.Context, s table.Session) (err error) { res, err = s.DescribeTable(ctx, path.Join(prefix, "documents"), options.WithShardKeyBounds()) + return err }, ) @@ -177,6 +182,7 @@ func readDocument(ctx context.Context, c table.Client, prefix, url string) error _, res, err = s.Execute(ctx, readTx, query, table.NewQueryParameters( table.ValueParam("$url", types.TextValue(url))), ) + return err }, ) @@ -239,9 +245,11 @@ func addDocument(ctx context.Context, c table.Client, prefix, url, html string, table.ValueParam("$html", types.TextValue(html)), table.ValueParam("$timestamp", types.Uint64Value(timestamp))), ) + return err }, ) + return err } diff --git a/internal/allocator/allocator.go b/internal/allocator/allocator.go index 2c8c7b176..6c55c51b4 100644 --- a/internal/allocator/allocator.go +++ b/internal/allocator/allocator.go @@ -110,6 +110,7 @@ type boolAllocator struct { func (a *boolAllocator) Bool() (v *Ydb.Value_BoolValue) { v = boolPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -128,6 +129,7 @@ type bytesAllocator struct { func (a *bytesAllocator) Bytes() (v *Ydb.Value_BytesValue) { v = bytesPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -146,6 +148,7 @@ type decimalAllocator struct { func (a *decimalAllocator) Decimal() (v *Ydb.DecimalType) { v = decimalPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -164,6 +167,7 @@ type dictAllocator struct { func (a *dictAllocator) Dict() (v *Ydb.DictType) { v = dictPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -182,6 +186,7 @@ type doubleAllocator struct { func (a *doubleAllocator) Double() (v *Ydb.Value_DoubleValue) { v = doublePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -200,6 +205,7 @@ type floatAllocator struct { func (a *floatAllocator) Float() (v *Ydb.Value_FloatValue) { v = floatPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -218,6 +224,7 @@ type int32Allocator struct { func (a *int32Allocator) Int32() (v *Ydb.Value_Int32Value) { v = int32Pool.Get() a.allocations = append(a.allocations, v) + return v } @@ -236,6 +243,7 @@ type int64Allocator struct { func (a *int64Allocator) Int64() (v *Ydb.Value_Int64Value) { v = int64Pool.Get() a.allocations = append(a.allocations, v) + return v } @@ -254,6 +262,7 @@ type listAllocator struct { func (a *listAllocator) List() (v *Ydb.ListType) { v = listPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -272,6 +281,7 @@ type low128Allocator struct { func (a *low128Allocator) Low128() (v *Ydb.Value_Low_128) { v = low128Pool.Get() a.allocations = append(a.allocations, v) + return v } @@ -290,6 +300,7 @@ type nestedAllocator struct { func (a *nestedAllocator) Nested() (v *Ydb.Value_NestedValue) { v = nestedPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -308,6 +319,7 @@ type nullFlagAllocator struct { func (a *nullFlagAllocator) NullFlag() (v *Ydb.Value_NullFlagValue) { v = nullFlagPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -326,6 +338,7 @@ type optionalAllocator struct { func (a *optionalAllocator) Optional() (v *Ydb.OptionalType) { v = optionalPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -344,6 +357,7 @@ type pairAllocator struct { func (a *pairAllocator) Pair() (v *Ydb.ValuePair) { v = pairPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -365,6 +379,7 @@ func (a *structAllocator) Struct() (v *Ydb.StructType) { v.Members = make([]*Ydb.StructMember, 0, 10) } a.allocations = append(a.allocations, v) + return v } @@ -388,6 +403,7 @@ type structMemberAllocator struct { func (a *structMemberAllocator) StructMember() (v *Ydb.StructMember) { v = structMemberPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -406,6 +422,7 @@ type textAllocator struct { func (a *textAllocator) Text() (v *Ydb.Value_TextValue) { v = textPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -424,6 +441,7 @@ type tupleAllocator struct { func (a *tupleAllocator) Tuple() (v *Ydb.TupleType) { v = tuplePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -447,6 +465,7 @@ type typeDecimalAllocator struct { func (a *typeDecimalAllocator) TypeDecimal() (v *Ydb.Type_DecimalType) { v = typeDecimalPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -465,6 +484,7 @@ type typeDictAllocator struct { func (a *typeDictAllocator) TypeDict() (v *Ydb.Type_DictType) { v = typeDictPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -483,6 +503,7 @@ type typeEmptyListAllocator struct { func (a *typeEmptyListAllocator) TypeEmptyList() (v *Ydb.Type_EmptyListType) { v = typeEmptyListPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -501,6 +522,7 @@ type typeEmptyDictAllocator struct { func (a *typeEmptyDictAllocator) TypeEmptyDict() (v *Ydb.Type_EmptyDictType) { v = typeEmptyDictPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -519,6 +541,7 @@ type typeAllocator struct { func (a *typeAllocator) Type() (v *Ydb.Type) { v = typePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -537,6 +560,7 @@ type typeListAllocator struct { func (a *typeListAllocator) TypeList() (v *Ydb.Type_ListType) { v = typeListPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -555,6 +579,7 @@ type typeOptionalAllocator struct { func (a *typeOptionalAllocator) TypeOptional() (v *Ydb.Type_OptionalType) { v = typeOptionalPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -573,6 +598,7 @@ type typeStructAllocator struct { func (a *typeStructAllocator) TypeStruct() (v *Ydb.Type_StructType) { v = typeStructPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -591,6 +617,7 @@ type typeTupleAllocator struct { func (a *typeTupleAllocator) TypeTuple() (v *Ydb.Type_TupleType) { v = typeTuplePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -609,6 +636,7 @@ type typeVariantAllocator struct { func (a *typeVariantAllocator) TypeVariant() (v *Ydb.Type_VariantType) { v = typeVariantPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -627,6 +655,7 @@ type typedValueAllocator struct { func (a *typedValueAllocator) TypedValue() (v *Ydb.TypedValue) { v = typedValuePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -645,6 +674,7 @@ type uint32Allocator struct { func (a *uint32Allocator) Uint32() (v *Ydb.Value_Uint32Value) { v = uint32Pool.Get() a.allocations = append(a.allocations, v) + return v } @@ -663,6 +693,7 @@ type uint64Allocator struct { func (a *uint64Allocator) Uint64() (v *Ydb.Value_Uint64Value) { v = uint64Pool.Get() a.allocations = append(a.allocations, v) + return v } @@ -681,6 +712,7 @@ type valueAllocator struct { func (a *valueAllocator) Value() (v *Ydb.Value) { v = valuePool.Get() a.allocations = append(a.allocations, v) + return v } @@ -709,6 +741,7 @@ type variantAllocator struct { func (a *variantAllocator) Variant() (v *Ydb.VariantType) { v = variantPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -726,6 +759,7 @@ type variantStructItemsAllocator struct { func (a *variantStructItemsAllocator) VariantStructItems() (v *Ydb.VariantType_StructItems) { v = variantStructItemsPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -743,6 +777,7 @@ type variantTupleItemsAllocator struct { func (a *variantTupleItemsAllocator) VariantTupleItems() (v *Ydb.VariantType_TupleItems) { v = variantTupleItemsPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -760,6 +795,7 @@ type tableExecuteQueryResultAllocator struct { func (a *tableExecuteQueryResultAllocator) TableExecuteQueryResult() (v *Ydb_Table.ExecuteQueryResult) { v = tableExecuteQueryResultPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -778,6 +814,7 @@ type tableExecuteQueryRequestAllocator struct { func (a *tableExecuteQueryRequestAllocator) TableExecuteDataQueryRequest() (v *Ydb_Table.ExecuteDataQueryRequest) { v = tableExecuteDataQueryRequestPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -796,6 +833,7 @@ type tableQueryCachePolicyAllocator struct { func (a *tableQueryCachePolicyAllocator) TableQueryCachePolicy() (v *Ydb_Table.QueryCachePolicy) { v = tableQueryCachePolicyPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -814,6 +852,7 @@ type tableQueryAllocator struct { func (a *tableQueryAllocator) TableQuery() (v *Ydb_Table.Query) { v = tableQueryPool.Get() a.allocations = append(a.allocations, v) + return v } @@ -833,6 +872,7 @@ func (a *tableQueryYqlTextAllocator) TableQueryYqlText(s string) (v *Ydb_Table.Q v = tableQueryYqlTextPool.Get() v.YqlText = s a.allocations = append(a.allocations, v) + return v } @@ -851,6 +891,7 @@ func (a *tableQueryIDAllocator) TableQueryID(id string) (v *Ydb_Table.Query_Id) v = tableQueryIDPool.Get() v.Id = id a.allocations = append(a.allocations, v) + return v } @@ -869,6 +910,7 @@ func (p *Pool[T]) Get() *T { var zero T v = &zero } + return v.(*T) } diff --git a/internal/background/worker.go b/internal/background/worker.go index 3b989d66d..5f1e90a9a 100644 --- a/internal/background/worker.go +++ b/internal/background/worker.go @@ -77,6 +77,7 @@ func (b *Worker) Close(ctx context.Context, err error) error { b.m.WithLock(func() { if b.closed { resErr = xerrors.WithStackTrace(ErrAlreadyClosed) + return } diff --git a/internal/backoff/backoff.go b/internal/backoff/backoff.go index c0c1fcb64..97beef0d9 100644 --- a/internal/backoff/backoff.go +++ b/internal/backoff/backoff.go @@ -91,6 +91,7 @@ func New(opts ...option) logBackoff { o(&b) } } + return b } @@ -106,6 +107,7 @@ func (b logBackoff) Delay(i int) time.Duration { if f == d { return f } + return f + time.Duration(b.r.Int64(int64(d-f)+1)) } @@ -113,6 +115,7 @@ func min(a, b uint) uint { if a < b { return a } + return b } @@ -120,5 +123,6 @@ func max(a, b uint) uint { if a > b { return a } + return b } diff --git a/internal/backoff/backoff_test.go b/internal/backoff/backoff_test.go index 24cb77f8c..45cd7fd1e 100644 --- a/internal/backoff/backoff_test.go +++ b/internal/backoff/backoff_test.go @@ -15,6 +15,7 @@ func TestDelays(t *testing.T) { if err != nil { panic(err) } + return d } b := New( @@ -141,6 +142,7 @@ func TestLogBackoff(t *testing.T) { act, eq, ) } + continue } if gte := exp.gte; act <= gte { @@ -172,6 +174,7 @@ func TestFastSlowDelaysWithoutJitter(t *testing.T) { backoff: func() (backoff logBackoff) { backoff = Fast backoff.jitterLimit = 1 + return backoff }(), exp: []time.Duration{ @@ -193,6 +196,7 @@ func TestFastSlowDelaysWithoutJitter(t *testing.T) { backoff: func() (backoff logBackoff) { backoff = Slow backoff.jitterLimit = 1 + return backoff }(), exp: []time.Duration{ diff --git a/internal/balancer/balancer.go b/internal/balancer/balancer.go index 5f089688f..2ee0140e6 100644 --- a/internal/balancer/balancer.go +++ b/internal/balancer/balancer.go @@ -55,6 +55,7 @@ func (b *Balancer) HasNode(id uint32) bool { if _, has := b.connectionsState.connByNodeID[id]; has { return true } + return false } @@ -80,8 +81,10 @@ func (b *Balancer) clusterDiscovery(ctx context.Context) (err error) { if ctx.Err() == nil && xerrors.IsTimeoutError(err) { return xerrors.WithStackTrace(xerrors.Retryable(err)) } + return xerrors.WithStackTrace(err) } + return nil }, retry.WithIdempotent(true), @@ -162,6 +165,7 @@ func endpointsDiff(newestEndpoints []endpoint.Endpoint, previousConns []conn.Con dropped = append(dropped, c.Endpoint().Copy()) } } + return nodes, added, dropped } @@ -311,11 +315,13 @@ func (b *Balancer) NewStream( var client grpc.ClientStream err = b.wrapCall(ctx, func(ctx context.Context, cc conn.Conn) error { client, err = cc.NewStream(ctx, desc, method, opts...) + return err }) if err == nil { return client, nil } + return nil, err } @@ -348,8 +354,10 @@ func (b *Balancer) wrapCall(ctx context.Context, f func(ctx context.Context, cc credentials.WithCredentials(b.driverConfig.Credentials()), ) } + return xerrors.WithStackTrace(err) } + return err } @@ -397,6 +405,7 @@ func (b *Balancer) getConn(ctx context.Context) (c conn.Conn, err error) { fmt.Errorf("%w: cannot get connection from Balancer after %d attempts", ErrNoEndpoints, failedCount), ) } + return c, nil } @@ -405,5 +414,6 @@ func endpointsToConnections(p *conn.Pool, endpoints []endpoint.Endpoint) []conn. for _, e := range endpoints { conns = append(conns, p.Get(e)) } + return conns } diff --git a/internal/balancer/connections_state.go b/internal/balancer/connections_state.go index 98afeba68..e9196ead7 100644 --- a/internal/balancer/connections_state.go +++ b/internal/balancer/connections_state.go @@ -35,6 +35,7 @@ func newConnectionsState( } else { res.all = res.prefer } + return res } @@ -54,6 +55,7 @@ func (s *connectionsState) GetConnection(ctx context.Context) (_ conn.Conn, fail try := func(conns []conn.Conn) conn.Conn { c, tryFailed := s.selectRandomConnection(conns, false) failedCount += tryFailed + return c } @@ -121,6 +123,7 @@ func connsToNodeIDMap(conns []conn.Conn) (nodes map[uint32]conn.Conn) { for _, c := range conns { nodes[c.Endpoint().NodeID()] = c } + return nodes } @@ -146,6 +149,7 @@ func sortPreferConnections( fallback = append(fallback, c) } } + return prefer, fallback } diff --git a/internal/balancer/ctx.go b/internal/balancer/ctx.go index 434e64ede..9b4aeb209 100644 --- a/internal/balancer/ctx.go +++ b/internal/balancer/ctx.go @@ -18,5 +18,6 @@ func ContextEndpoint(ctx context.Context) (e Endpoint, ok bool) { if e, ok = ctx.Value(ctxEndpointKey{}).(Endpoint); ok { return e, true } + return nil, false } diff --git a/internal/balancer/local_dc.go b/internal/balancer/local_dc.go index d375ac680..e764af7d8 100644 --- a/internal/balancer/local_dc.go +++ b/internal/balancer/local_dc.go @@ -75,16 +75,19 @@ func detectFastestEndpoint(ctx context.Context, endpoints []endpoint.Endpoint) ( host, port, err := extractHostPort(ep.Address()) if err != nil { lastErr = xerrors.WithStackTrace(err) + continue } addresses, err := net.DefaultResolver.LookupHost(ctx, host) if err != nil { lastErr = err + continue } if len(addresses) == 0 { lastErr = xerrors.WithStackTrace(fmt.Errorf("no ips for fqdn: %q", host)) + continue } @@ -105,6 +108,7 @@ func detectFastestEndpoint(ctx context.Context, endpoints []endpoint.Endpoint) ( if fastestAddress == "" { return nil, xerrors.WithStackTrace(errors.New("failed to check fastest address")) } + return addressToEndpoint[fastestAddress], nil } @@ -127,6 +131,7 @@ func detectLocalDC(ctx context.Context, endpoints []endpoint.Endpoint) (string, if err == nil { return fastest.Location(), nil } + return "", err } @@ -143,6 +148,7 @@ func extractHostPort(address string) (host, port string, _ error) { if err != nil { return "", "", xerrors.WithStackTrace(err) } + return host, port, nil } @@ -174,5 +180,6 @@ func splitEndpointsByLocation(endpoints []endpoint.Endpoint) map[string][]endpoi location := ep.Location() res[location] = append(res[location], ep) } + return res } diff --git a/internal/bind/bind.go b/internal/bind/bind.go index a19699a88..2b4f0a346 100644 --- a/internal/bind/bind.go +++ b/internal/bind/bind.go @@ -35,6 +35,7 @@ func (bindings Bindings) RewriteQuery(query string, args ...interface{}) ( if err != nil { return "", nil, xerrors.WithStackTrace(err) } + return query, table.NewQueryParameters(params...), nil } @@ -60,5 +61,6 @@ func Sort(bindings []Bind) []Bind { sort.Slice(bindings, func(i, j int) bool { return bindings[i].blockID() < bindings[j].blockID() }) + return bindings } diff --git a/internal/bind/numeric_args.go b/internal/bind/numeric_args.go index ecfc22787..89c9c4ecc 100644 --- a/internal/bind/numeric_args.go +++ b/internal/bind/numeric_args.go @@ -76,6 +76,7 @@ func (m NumericArgs) RewriteQuery(sql string, args ...interface{}) ( if len(newArgs) > 0 { const prefix = "-- origin query with numeric args replacement\n" + return prefix + buffer.String(), newArgs, nil } @@ -101,18 +102,21 @@ func numericArgsStateFn(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos-width]) } l.start = l.pos + return numericArgState } case '-': nextRune, width := utf8.DecodeRuneInString(l.src[l.pos:]) if nextRune == '-' { l.pos += width + return oneLineCommentState } case '/': nextRune, width := utf8.DecodeRuneInString(l.src[l.pos:]) if nextRune == '*' { l.pos += width + return multilineCommentState } case utf8.RuneError: @@ -120,6 +124,7 @@ func numericArgsStateFn(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } @@ -149,9 +154,11 @@ func numericArgState(l *sqlLexer) stateFn { numbers += string(r) case isLetter(r): numbers = "" + return l.rawStateFn default: l.pos -= width + return l.rawStateFn } } diff --git a/internal/bind/params.go b/internal/bind/params.go index 00df0504d..a817dd2cb 100644 --- a/internal/bind/params.go +++ b/internal/bind/params.go @@ -46,6 +46,7 @@ func toValue(v interface{}) (_ types.Value, err error) { return types.NullValue(types.TypeInt32), nil } xx := int32(*x) + return types.NullableInt32Value(&xx), nil case uint: return types.Uint32Value(uint32(x)), nil @@ -54,6 +55,7 @@ func toValue(v interface{}) (_ types.Value, err error) { return types.NullValue(types.TypeUint32), nil } xx := uint32(*x) + return types.NullableUint32Value(&xx), nil case int8: return types.Int8Value(x), nil @@ -108,6 +110,7 @@ func toValue(v interface{}) (_ types.Value, err error) { for i := range x { items[i] = types.TextValue(x[i]) } + return types.ListValue(items...), nil case [16]byte: return types.UUIDValue(x), nil @@ -135,6 +138,7 @@ func supportNewTypeLink(x interface{}) string { v.Add("labels", "enhancement,database/sql") v.Add("template", "02_FEATURE_REQUEST.md") v.Add("title", fmt.Sprintf("feat: Support new type `%T` in `database/sql` query args", x)) + return "https://github.com/ydb-platform/ydb-go-sdk/issues/new?" + v.Encode() } @@ -166,6 +170,7 @@ func toYdbParam(name string, value interface{}) (table.ParameterOption, error) { if name[0] != '$' { name = "$" + name } + return table.ValueParam(name, v), nil } @@ -229,5 +234,6 @@ func Params(args ...interface{}) (params []table.ParameterOption, _ error) { sort.Slice(params, func(i, j int) bool { return params[i].Name() < params[j].Name() }) + return params, nil } diff --git a/internal/bind/positional_args.go b/internal/bind/positional_args.go index 506a3d62e..e3c0afa13 100644 --- a/internal/bind/positional_args.go +++ b/internal/bind/positional_args.go @@ -65,6 +65,7 @@ func (m PositionalArgs) RewriteQuery(sql string, args ...interface{}) ( if position > 0 { const prefix = "-- origin query with positional args replacement\n" + return prefix + buffer.String(), newArgs, nil } @@ -90,12 +91,14 @@ func positionalArgsStateFn(l *sqlLexer) stateFn { nextRune, width := utf8.DecodeRuneInString(l.src[l.pos:]) if nextRune == '-' { l.pos += width + return oneLineCommentState } case '/': nextRune, width := utf8.DecodeRuneInString(l.src[l.pos:]) if nextRune == '*' { l.pos += width + return multilineCommentState } case utf8.RuneError: @@ -103,6 +106,7 @@ func positionalArgsStateFn(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } diff --git a/internal/bind/sql_lexer.go b/internal/bind/sql_lexer.go index 23626b495..49fe30911 100644 --- a/internal/bind/sql_lexer.go +++ b/internal/bind/sql_lexer.go @@ -44,6 +44,7 @@ func backtickState(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } @@ -66,6 +67,7 @@ func singleQuoteState(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } @@ -88,6 +90,7 @@ func doubleQuoteState(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } @@ -109,6 +112,7 @@ func oneLineCommentState(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } @@ -143,6 +147,7 @@ func multilineCommentState(l *sqlLexer) stateFn { l.parts = append(l.parts, l.src[l.start:l.pos]) l.start = l.pos } + return nil } } diff --git a/internal/certificates/certificates.go b/internal/certificates/certificates.go index 6a7b1f12f..8282dce79 100644 --- a/internal/certificates/certificates.go +++ b/internal/certificates/certificates.go @@ -47,6 +47,7 @@ func loadFromFileCache(key string) (_ []*x509.Certificate, exists bool) { if !ok { panic(fmt.Sprintf("unexpected value type '%T'", value)) } + return certs, true } @@ -65,6 +66,7 @@ func FromFile(file string, opts ...FromFileOption) ([]*x509.Certificate, error) if options.onHit != nil { options.onHit() } + return certs, nil } } @@ -100,6 +102,7 @@ func loadFromPemCache(key string) (_ *x509.Certificate, exists bool) { if !ok { panic(fmt.Sprintf("unexpected value type '%T'", value)) } + return cert, true } @@ -120,6 +123,7 @@ func parseCertificate(der []byte, opts ...FromPemOption) (*x509.Certificate, err if options.onHit != nil { options.onHit() } + return cert, nil } } diff --git a/internal/cmd/gtrace/main.go b/internal/cmd/gtrace/main.go index 95a72f0c2..d6c1b5d7b 100644 --- a/internal/cmd/gtrace/main.go +++ b/internal/cmd/gtrace/main.go @@ -79,6 +79,7 @@ func main() { if err != nil { log.Fatal(err) } + return f, func() { f.Close() } } f, clean := openFile(name + "_gtrace" + tags + ext) @@ -159,6 +160,7 @@ func main() { if n == nil { item = nil depth-- + return true } defer func() { @@ -175,6 +177,7 @@ func main() { if item != nil { item.Ident = v } + return false case *ast.CommentGroup: @@ -185,6 +188,7 @@ func main() { } } } + return false case *ast.StructType: @@ -193,6 +197,7 @@ func main() { items = append(items, item) item = nil } + return false } @@ -228,6 +233,7 @@ func main() { "skipping hook %s due to error: %v", name, err, ) + continue } t.Hooks = append(t.Hooks, Hook{ @@ -289,12 +295,14 @@ func buildFunc(info *types.Info, traces map[string]*Trace, fn *ast.FuncType) (re return nil, xerrors.WithStackTrace(err) } ret.Result = append(ret.Result, result) + return ret, nil case *ast.Ident: if t, ok := traces[x.Name]; ok { t.Nested = true ret.Result = append(ret.Result, t) + return ret, nil } } @@ -333,6 +341,7 @@ func splitOSArchTags(ctx *build.Context, name string) (base, tags, ext string) { len(fileTags), )) } + return } @@ -396,6 +405,7 @@ func rsplit(s string, c byte) (s1, s2 string) { if i == -1 { return s, "" } + return s[:i], s[i+1:] } @@ -411,6 +421,7 @@ func scanBuildConstraints(r io.Reader) (cs []string, err error) { comm = bytes.TrimSpace(comm) if bytes.HasPrefix(comm, []byte("+build")) { cs = append(cs, string(line)) + continue } } @@ -418,6 +429,7 @@ func scanBuildConstraints(r io.Reader) (cs []string, err error) { break } } + return cs, nil } @@ -428,5 +440,6 @@ func isGenerated(base, suffix string) bool { } n := len(base) m := i + len(suffix) + return m == n || base[m] == '_' } diff --git a/internal/cmd/gtrace/writer.go b/internal/cmd/gtrace/writer.go index fc90b063e..fcc87a43e 100644 --- a/internal/cmd/gtrace/writer.go +++ b/internal/cmd/gtrace/writer.go @@ -160,6 +160,7 @@ func (w *Writer) typeImports(dst []dep, t types.Type) []dep { typName: obj.Name(), }) } + return dst } @@ -175,6 +176,7 @@ func unwrapStruct(t types.Type) (n *types.Named, s *types.Struct) { if ok { s, _ = n.Underlying().(*types.Struct) } + return } @@ -194,6 +196,7 @@ func (w *Writer) funcImports(dst []dep, fn *Func) []dep { dst = w.funcImports(dst, fn) } } + return dst } @@ -201,6 +204,7 @@ func (w *Writer) traceImports(dst []dep, t *Trace) []dep { for _, h := range t.Hooks { dst = w.funcImports(dst, h.Func) } + return dst } @@ -212,6 +216,7 @@ func (w *Writer) importDeps(deps []dep) { n := len(deps) deps[i], deps[n-1] = deps[n-1], deps[i] deps = deps[:n-1] + continue } seen[d.pkgPath] = true @@ -230,6 +235,7 @@ func (w *Writer) importDeps(deps []dep) { if std0 != std1 { return std0 } + return d0.pkgPath < d1.pkgPath }) w.line(`import (`) @@ -250,6 +256,7 @@ func (w *Writer) importDeps(deps []dep) { func (w *Writer) isStdLib(pkg string) bool { w.ensureStdLibMapping() s := strings.Split(pkg, "/")[0] + return w.std[s] } @@ -520,6 +527,7 @@ func (w *Writer) hookFuncCall(fn *Func, name string, args []string) { }) w.line(`}`) }) + return } } @@ -532,6 +540,7 @@ func nameParam(p *Param) (s string) { if s == "" { s = firstChar(ident(typeBasename(p.Type))) } + return unexported(s) } @@ -540,6 +549,7 @@ func (w *Writer) declareParams(src []Param) (names []string) { for i := range src { names[i] = w.declare(nameParam(&src[i])) } + return names } @@ -548,10 +558,12 @@ func flattenParams(params []Param) (dst []Param) { _, s := unwrapStruct(params[i].Type) if s != nil { dst = flattenStruct(dst, s) + continue } dst = append(dst, params[i]) } + return dst } @@ -560,6 +572,7 @@ func typeBasename(t types.Type) (name string) { if name == "" { name = lo } + return name } @@ -582,6 +595,7 @@ func flattenStruct(dst []Param, s *types.Struct) []Param { Type: typ, }) }) + return dst } @@ -592,12 +606,14 @@ func (w *Writer) constructParams(params []Param, names []string) (res []string) var v string v, names = w.constructStruct(n, s, names) res = append(res, v) + continue } name := names[0] names = names[1:] res = append(res, name) } + return res } @@ -614,6 +630,7 @@ func (w *Writer) constructStruct(n types.Type, s *types.Struct, vars []string) ( vars = vars[1:] w.line(p, `.`, v.Name(), ` = `, name) } + return p, vars } @@ -726,6 +743,7 @@ func (w *Writer) hookFuncShortcut(fn *Func, name string) { func (w *Writer) zeroReturn(fn *Func) { if !fn.HasResult() { w.line(`return`) + return } w.code(`return `) @@ -753,6 +771,7 @@ func (w *Writer) funcParams(params []Param) (vars []string) { vars = append(vars, w.funcParam(¶ms[i])) } w.code(`)`) + return } @@ -760,6 +779,7 @@ func (w *Writer) funcParam(p *Param) (name string) { name = w.declare(nameParam(p)) w.code(name, ` `) w.code(w.typeString(p.Type)) + return name } @@ -875,6 +895,7 @@ func haveNames(params []Param) bool { return true } } + return false } @@ -883,6 +904,7 @@ func (w *Writer) typeString(t types.Type) string { if pkg.Path() == w.pkg.Path() { return "" // same package; unqualified } + return pkg.Name() }) } @@ -922,6 +944,7 @@ func exported(s string) string { if r == utf8.RuneError { panic("invalid string") } + return string(unicode.ToUpper(r)) + s[size:] } @@ -930,6 +953,7 @@ func unexported(s string) string { if r == utf8.RuneError { panic("invalid string") } + return string(unicode.ToLower(r)) + s[size:] } @@ -938,6 +962,7 @@ func firstChar(s string) string { if r == utf8.RuneError { panic("invalid string") } + return string(r) } @@ -984,6 +1009,7 @@ func tempName(names ...string) string { } sb.WriteString(name) } + return sb.String() } @@ -1006,10 +1032,12 @@ func (s *scope) set(v string) bool { s.vars[v] = decl{ where: fmt.Sprintf("%s:%d", file, line), } + return true } func (s *scope) where(v string) string { d := s.vars[v] + return d.where } diff --git a/internal/conn/conn.go b/internal/conn/conn.go index c9a1d755a..e20266f48 100644 --- a/internal/conn/conn.go +++ b/internal/conn/conn.go @@ -72,12 +72,14 @@ func (c *conn) Ping(ctx context.Context) error { if !isAvailable(cc) { return c.wrapError(errUnavailableConnection) } + return nil } func (c *conn) LastUsage() time.Time { c.mtx.RLock() defer c.mtx.RUnlock() + return c.lastUsage } @@ -126,6 +128,7 @@ func (c *conn) NodeID() uint32 { if c != nil { return c.endpoint.NodeID() } + return 0 } @@ -133,6 +136,7 @@ func (c *conn) Endpoint() endpoint.Endpoint { if c != nil { return c.endpoint } + return nil } @@ -148,6 +152,7 @@ func (c *conn) setState(ctx context.Context, s State) State { c.endpoint.Copy(), state, )(s) } + return s } @@ -163,6 +168,7 @@ func (c *conn) Unban(ctx context.Context) State { } c.setState(ctx, newState) + return newState } @@ -252,12 +258,14 @@ func (c *conn) close(ctx context.Context) (err error) { err = c.cc.Close() c.cc = nil c.setState(ctx, Offline) + return c.wrapError(err) } func (c *conn) isClosed() bool { c.mtx.RLock() defer c.mtx.RUnlock() + return c.closed } @@ -344,6 +352,7 @@ func (c *conn) Invoke( if sentMark.canRetry() { return c.wrapError(xerrors.Retryable(err, xerrors.WithName("Invoke"))) } + return c.wrapError(err) } @@ -436,6 +445,7 @@ func (c *conn) NewStream( if sentMark.canRetry() { return s, c.wrapError(xerrors.Retryable(err, xerrors.WithName("NewStream"))) } + return s, c.wrapError(err) } @@ -461,6 +471,7 @@ func (c *conn) wrapError(err error) error { return nil } nodeErr := newConnError(c.endpoint.NodeID(), c.endpoint.Address(), err) + return xerrors.WithStackTrace(nodeErr, xerrors.WithSkipDepth(1)) } @@ -530,6 +541,7 @@ var rpcKey = ctxHandleRPCKey{} func markContext(ctx context.Context) (context.Context, *modificationMark) { mark := &modificationMark{} + return context.WithValue(ctx, rpcKey, mark), mark } @@ -538,6 +550,7 @@ func getContextMark(ctx context.Context) *modificationMark { if v == nil { return &modificationMark{} } + return v.(*modificationMark) } diff --git a/internal/conn/context.go b/internal/conn/context.go index 927d1c846..64ffd877e 100644 --- a/internal/conn/context.go +++ b/internal/conn/context.go @@ -10,5 +10,6 @@ func WithoutWrapping(ctx context.Context) context.Context { func UseWrapping(ctx context.Context) bool { b, ok := ctx.Value(ctxNoWrappingKey{}).(bool) + return !ok || !b } diff --git a/internal/conn/grpc_client_stream.go b/internal/conn/grpc_client_stream.go index a24db653e..ca07acb79 100644 --- a/internal/conn/grpc_client_stream.go +++ b/internal/conn/grpc_client_stream.go @@ -38,6 +38,7 @@ func (s *grpcClientStream) CloseSend() (err error) { ), ) } + return s.wrapError(err) } @@ -65,6 +66,7 @@ func (s *grpcClientStream) SendMsg(m interface{}) (err error) { xerrors.WithName("SendMsg"), )) } + return s.wrapError(err) } @@ -105,6 +107,7 @@ func (s *grpcClientStream) RecvMsg(m interface{}) (err error) { xerrors.WithName("RecvMsg"), )) } + return s.wrapError(err) } @@ -133,6 +136,7 @@ func (s *grpcClientStream) wrapError(err error) error { } nodeErr := newConnError(s.c.endpoint.NodeID(), s.c.endpoint.Address(), err) + return xerrors.WithStackTrace(nodeErr, xerrors.WithSkipDepth(1)) } @@ -146,6 +150,7 @@ func createPinger(c *conn) context.CancelFunc { select { case <-ctxDone: ticker.Stop() + return case <-ticker.C: c.touchLastUsage() diff --git a/internal/conn/middleware.go b/internal/conn/middleware.go index f6069def8..07ab761e4 100644 --- a/internal/conn/middleware.go +++ b/internal/conn/middleware.go @@ -37,12 +37,14 @@ func WithContextModifier( return &middleware{ invoke: func(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { ctx = modifyCtx(ctx) + return cc.Invoke(ctx, method, args, reply, opts...) }, newStream: func(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) ( grpc.ClientStream, error, ) { ctx = modifyCtx(ctx) + return cc.NewStream(ctx, desc, method, opts...) }, } @@ -52,12 +54,14 @@ func WithAppendOptions(cc grpc.ClientConnInterface, appendOpts ...grpc.CallOptio return &middleware{ invoke: func(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { opts = append(opts, appendOpts...) + return cc.Invoke(ctx, method, args, reply, opts...) }, newStream: func(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) ( grpc.ClientStream, error, ) { opts = append(opts, appendOpts...) + return cc.NewStream(ctx, desc, method, opts...) }, } @@ -70,12 +74,14 @@ func WithBeforeFunc( return &middleware{ invoke: func(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { before() + return cc.Invoke(ctx, method, args, reply, opts...) }, newStream: func(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) ( grpc.ClientStream, error, ) { before() + return cc.NewStream(ctx, desc, method, opts...) }, } diff --git a/internal/conn/pool.go b/internal/conn/pool.go index 47e0082e8..cbf49f93d 100644 --- a/internal/conn/pool.go +++ b/internal/conn/pool.go @@ -120,6 +120,7 @@ func (p *Pool) Allow(ctx context.Context, cc Conn) { func (p *Pool) Take(context.Context) error { atomic.AddInt64(&p.usages, 1) + return nil } @@ -201,6 +202,7 @@ func (p *Pool) collectConns() []*conn { for _, c := range p.conns { conns = append(conns, c) } + return conns } @@ -218,5 +220,6 @@ func NewPool(ctx context.Context, config Config) *Pool { if ttl := config.ConnectionTTL(); ttl > 0 { go p.connParker(xcontext.WithoutDeadline(ctx), ttl, ttl/2) } + return p } diff --git a/internal/coordination/client.go b/internal/coordination/client.go index f077aabfa..c6ceede63 100644 --- a/internal/coordination/client.go +++ b/internal/coordination/client.go @@ -44,6 +44,7 @@ func (c *Client) CreateNode(ctx context.Context, path string, config coordinatio if !c.config.AutoRetry() { return xerrors.WithStackTrace(call(ctx)) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -72,6 +73,7 @@ func (c *Client) createNode(ctx context.Context, path string, config coordinatio ), }, ) + return xerrors.WithStackTrace(err) } @@ -85,6 +87,7 @@ func (c *Client) AlterNode(ctx context.Context, path string, config coordination if !c.config.AutoRetry() { return xerrors.WithStackTrace(call(ctx)) } + return retry.Retry(ctx, call, retry.WithStackTrace(), @@ -114,6 +117,7 @@ func (c *Client) alterNode(ctx context.Context, path string, config coordination ), }, ) + return xerrors.WithStackTrace(err) } @@ -127,6 +131,7 @@ func (c *Client) DropNode(ctx context.Context, path string) error { if !c.config.AutoRetry() { return xerrors.WithStackTrace(call(ctx)) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -147,6 +152,7 @@ func (c *Client) dropNode(ctx context.Context, path string) error { ), }, ) + return xerrors.WithStackTrace(err) } @@ -163,10 +169,12 @@ func (c *Client) DescribeNode( } call := func(ctx context.Context) (err error) { entry, config, err = c.describeNode(ctx, path) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err := call(ctx) + return entry, config, xerrors.WithStackTrace(err) } err := retry.Retry(ctx, call, @@ -174,6 +182,7 @@ func (c *Client) DescribeNode( retry.WithIdempotent(true), retry.WithTrace(c.config.TraceRetry()), ) + return entry, config, xerrors.WithStackTrace(err) } @@ -209,6 +218,7 @@ func (c *Client) describeNode( if err != nil { return nil, nil, xerrors.WithStackTrace(err) } + return scheme.InnerConvertEntry(result.GetSelf()), &coordination.NodeConfig{ Path: result.GetConfig().GetPath(), SelfCheckPeriodMillis: result.GetConfig().GetSelfCheckPeriodMillis(), @@ -223,6 +233,7 @@ func (c *Client) Close(ctx context.Context) error { if c == nil { return xerrors.WithStackTrace(errNilClient) } + return c.close(ctx) } diff --git a/internal/coordination/config/config.go b/internal/coordination/config/config.go index b10fc43d4..a4525bfd1 100644 --- a/internal/coordination/config/config.go +++ b/internal/coordination/config/config.go @@ -44,5 +44,6 @@ func New(opts ...Option) Config { o(&c) } } + return c } diff --git a/internal/credentials/access_error.go b/internal/credentials/access_error.go index ce904e2e4..70f801bc3 100644 --- a/internal/credentials/access_error.go +++ b/internal/credentials/access_error.go @@ -100,6 +100,7 @@ func AccessError(msg string, err error, opts ...authErrorOption) error { opt.applyAuthErrorOption(buffer) } buffer.WriteString("): %w") + return xerrors.WithStackTrace(fmt.Errorf(buffer.String(), err), xerrors.WithSkipDepth(1)) } @@ -115,5 +116,6 @@ func IsAccessError(err error) bool { ) { return true } + return false } diff --git a/internal/credentials/access_token.go b/internal/credentials/access_token.go index 57e0f12bc..2d1365827 100644 --- a/internal/credentials/access_token.go +++ b/internal/credentials/access_token.go @@ -34,6 +34,7 @@ func NewAccessTokenCredentials(token string, opts ...AccessTokenCredentialsOptio for _, opt := range opts { opt.ApplyAccessTokenCredentialsOption(c) } + return c } @@ -53,5 +54,6 @@ func (c AccessToken) String() string { fmt.Fprintf(buffer, "%q", c.sourceInfo) } buffer.WriteByte('}') + return buffer.String() } diff --git a/internal/credentials/anonymous.go b/internal/credentials/anonymous.go index eea7ba2c1..7bd75f4c3 100644 --- a/internal/credentials/anonymous.go +++ b/internal/credentials/anonymous.go @@ -30,6 +30,7 @@ func NewAnonymousCredentials(opts ...AnonymousCredentialsOption) *Anonymous { for _, opt := range opts { opt.ApplyAnonymousCredentialsOption(c) } + return c } @@ -48,5 +49,6 @@ func (c Anonymous) String() string { fmt.Fprintf(buffer, "%q", c.sourceInfo) } buffer.WriteByte('}') + return buffer.String() } diff --git a/internal/credentials/static.go b/internal/credentials/static.go index 39bba0234..56e80277d 100644 --- a/internal/credentials/static.go +++ b/internal/credentials/static.go @@ -49,6 +49,7 @@ func NewStaticCredentials(user, password, endpoint string, opts ...StaticCredent for _, opt := range opts { opt.ApplyStaticCredentialsOption(c) } + return c } @@ -141,6 +142,7 @@ func parseExpiresAt(raw string) (expiresAt time.Time, err error) { if _, _, err = jwt.NewParser().ParseUnverified(raw, &claims); err != nil { return expiresAt, xerrors.WithStackTrace(err) } + return claims.ExpiresAt.Time, nil } @@ -158,5 +160,6 @@ func (c *Static) String() string { fmt.Fprintf(buffer, "%q", c.sourceInfo) } buffer.WriteByte('}') + return buffer.String() } diff --git a/internal/decimal/decimal.go b/internal/decimal/decimal.go index 4bf91f6ab..a4753992a 100644 --- a/internal/decimal/decimal.go +++ b/internal/decimal/decimal.go @@ -73,6 +73,7 @@ func FromBytes(bts []byte, precision, scale uint32) *big.Int { v.Set(inf) } } + return v } @@ -102,12 +103,14 @@ func Parse(s string, precision, scale uint32) (*big.Int, error) { if neg { return v.Set(neginf), nil } + return v.Set(inf), nil } if isNaN(s) { if neg { return v.Set(negnan), nil } + return v.Set(nan), nil } @@ -121,6 +124,7 @@ func Parse(s string, precision, scale uint32) (*big.Int, error) { return nil, syntaxError(s) } dot = true + continue } if dot { @@ -142,6 +146,7 @@ func Parse(s string, precision, scale uint32) (*big.Int, error) { if neg { return neginf, nil } + return inf, nil } integral-- @@ -176,6 +181,7 @@ func Parse(s string, precision, scale uint32) (*big.Int, error) { if neg { v.Neg(v) } + return v, nil } @@ -187,12 +193,14 @@ func Format(x *big.Int, precision, scale uint32) string { if x.Sign() < 0 { return "-inf" } + return "inf" case x.CmpAbs(nan) == 0: if x.Sign() < 0 { return "-nan" } + return "nan" case x == nil: @@ -271,6 +279,7 @@ func BigIntToByte(x *big.Int, precision, scale uint32) (p [16]byte) { } } put(x, p[:]) + return p } @@ -301,6 +310,7 @@ func Append(p []byte, x *big.Int) []byte { n := len(p) p = ensure(p, size(x)) put(x, p[n:]) + return p } @@ -308,6 +318,7 @@ func size(x *big.Int) int { if x.Sign() < 0 { x = complement(x) } + return len(x.Bits()) * wordSize } @@ -321,6 +332,7 @@ func ensure(p []byte, n int) []byte { copy(cp, p) p = cp } + return p[:l+n] } @@ -346,6 +358,7 @@ func pow(x *big.Int, n uint32) *big.Int { n >>= 1 m.Mul(m, m) } + return v } @@ -356,6 +369,7 @@ func complement(x *big.Int) *big.Int { not(x) x.Neg(x) x.Add(x, one) + return x } diff --git a/internal/decimal/decimal_test.go b/internal/decimal/decimal_test.go index 8178c37c9..fd7391da1 100644 --- a/internal/decimal/decimal_test.go +++ b/internal/decimal/decimal_test.go @@ -61,6 +61,7 @@ func uint128(hi, lo uint64) []byte { p := make([]byte, 16) binary.BigEndian.PutUint64(p[:8], hi) binary.BigEndian.PutUint64(p[8:], lo) + return p } diff --git a/internal/discovery/config/config.go b/internal/discovery/config/config.go index ebcdce783..6ea99d21b 100644 --- a/internal/discovery/config/config.go +++ b/internal/discovery/config/config.go @@ -34,6 +34,7 @@ func New(opts ...Option) *Config { o(c) } } + return c } diff --git a/internal/discovery/discovery.go b/internal/discovery/discovery.go index 6126c5961..dba4ca480 100644 --- a/internal/discovery/discovery.go +++ b/internal/discovery/discovery.go @@ -154,5 +154,6 @@ func (c *Client) Close(context.Context) error { if cc, has := c.cc.(io.Closer); has { return cc.Close() } + return nil } diff --git a/internal/endpoint/endpoint.go b/internal/endpoint/endpoint.go index 139829cac..cdaba3710 100644 --- a/internal/endpoint/endpoint.go +++ b/internal/endpoint/endpoint.go @@ -39,6 +39,7 @@ type endpoint struct { func (e *endpoint) Copy() Endpoint { e.mu.RLock() defer e.mu.RUnlock() + return &endpoint{ id: e.id, address: e.address, @@ -53,6 +54,7 @@ func (e *endpoint) Copy() Endpoint { func (e *endpoint) String() string { e.mu.RLock() defer e.mu.RUnlock() + return fmt.Sprintf(`{id:%d,address:%q,local:%t,location:%q,loadFactor:%f,lastUpdated:%q}`, e.id, e.address, @@ -66,36 +68,42 @@ func (e *endpoint) String() string { func (e *endpoint) NodeID() uint32 { e.mu.RLock() defer e.mu.RUnlock() + return e.id } func (e *endpoint) Address() (address string) { e.mu.RLock() defer e.mu.RUnlock() + return e.address } func (e *endpoint) Location() string { e.mu.RLock() defer e.mu.RUnlock() + return e.location } func (e *endpoint) LocalDC() bool { e.mu.RLock() defer e.mu.RUnlock() + return e.local } func (e *endpoint) LoadFactor() float32 { e.mu.RLock() defer e.mu.RUnlock() + return e.loadFactor } func (e *endpoint) LastUpdated() time.Time { e.mu.RLock() defer e.mu.RUnlock() + return e.lastUpdated } @@ -160,5 +168,6 @@ func New(address string, opts ...Option) *endpoint { o(e) } } + return e } diff --git a/internal/grpcwrapper/rawoptional/rawoptional.go b/internal/grpcwrapper/rawoptional/rawoptional.go index aed976dfe..e4aec2c4a 100644 --- a/internal/grpcwrapper/rawoptional/rawoptional.go +++ b/internal/grpcwrapper/rawoptional/rawoptional.go @@ -18,6 +18,7 @@ func (b *Bool) ToProto() *bool { } val := b.Value + return &val } @@ -30,6 +31,7 @@ func (v *Duration) ToProto() *durationpb.Duration { if v.HasValue { return durationpb.New(v.Value) } + return nil } @@ -44,6 +46,7 @@ func (v *Int64) ToProto() *int64 { } val := v.Value + return &val } @@ -56,6 +59,7 @@ func (v *Time) ToProto() *timestamppb.Timestamp { if v.HasValue { return timestamppb.New(v.Value) } + return nil } @@ -63,6 +67,7 @@ func (v *Time) MustFromProto(proto *timestamppb.Timestamp) { if proto == nil { v.Value = time.Time{} v.HasValue = false + return } diff --git a/internal/grpcwrapper/rawscheme/entry.go b/internal/grpcwrapper/rawscheme/entry.go index e1516e6c3..e0ec8f808 100644 --- a/internal/grpcwrapper/rawscheme/entry.go +++ b/internal/grpcwrapper/rawscheme/entry.go @@ -45,6 +45,7 @@ func (e *Entry) FromProto(proto *Ydb_Scheme.Entry) error { } e.SizeBytes = proto.SizeBytes + return nil } @@ -75,5 +76,6 @@ func (p *Permissions) FromProto(proto *Ydb_Scheme.Permissions) error { } p.Subject = proto.Subject p.PermissionNames = proto.PermissionNames + return nil } diff --git a/internal/grpcwrapper/rawtopic/client.go b/internal/grpcwrapper/rawtopic/client.go index d5081bf80..5ccc30225 100644 --- a/internal/grpcwrapper/rawtopic/client.go +++ b/internal/grpcwrapper/rawtopic/client.go @@ -25,6 +25,7 @@ func (c *Client) AlterTopic(ctx context.Context, req *AlterTopicRequest) (res Al return res, xerrors.WithStackTrace(fmt.Errorf("ydb: alter topic grpc failed: %w", err)) } err = res.FromProto(resp) + return res, err } @@ -37,6 +38,7 @@ func (c *Client) CreateTopic( return res, xerrors.WithStackTrace(fmt.Errorf("ydb: create topic grpc failed: %w", err)) } err = res.FromProto(resp) + return res, err } @@ -48,6 +50,7 @@ func (c *Client) DescribeTopic(ctx context.Context, req DescribeTopicRequest) (r )) } err = res.FromProto(resp) + return res, err } @@ -60,6 +63,7 @@ func (c *Client) DropTopic( return res, xerrors.WithStackTrace(fmt.Errorf("ydb: drop topic grpc failed: %w", err)) } err = res.FromProto(resp) + return res, err } @@ -72,6 +76,7 @@ func (c *Client) StreamRead(ctxStreamLifeTime context.Context) (rawtopicreader.S ), ) } + return rawtopicreader.StreamReader{Stream: protoResp}, nil } @@ -84,5 +89,6 @@ func (c *Client) StreamWrite(ctxStreamLifeTime context.Context) (*rawtopicwriter ), ) } + return &rawtopicwriter.StreamWriter{Stream: protoResp}, nil } diff --git a/internal/grpcwrapper/rawtopic/controlplane_types.go b/internal/grpcwrapper/rawtopic/controlplane_types.go index 8dfe43a6f..3b2070746 100644 --- a/internal/grpcwrapper/rawtopic/controlplane_types.go +++ b/internal/grpcwrapper/rawtopic/controlplane_types.go @@ -58,6 +58,7 @@ func (s *PartitioningSettings) FromProto(proto *Ydb_Topic.PartitioningSettings) s.MinActivePartitions = proto.MinActivePartitions s.PartitionCountLimit = proto.PartitionCountLimit + return nil } diff --git a/internal/grpcwrapper/rawtopic/rawtopiccommon/codec.go b/internal/grpcwrapper/rawtopic/rawtopiccommon/codec.go index 70f622403..34b87ebf9 100644 --- a/internal/grpcwrapper/rawtopic/rawtopiccommon/codec.go +++ b/internal/grpcwrapper/rawtopic/rawtopiccommon/codec.go @@ -53,12 +53,14 @@ func (c *SupportedCodecs) Contains(need Codec) bool { return true } } + return false } func (c *SupportedCodecs) Clone() SupportedCodecs { res := make(SupportedCodecs, len(*c)) copy(res, *c) + return res } @@ -77,6 +79,7 @@ func (c *SupportedCodecs) IsEqualsTo(other SupportedCodecs) bool { return false } } + return true } @@ -88,6 +91,7 @@ func (c *SupportedCodecs) ToProto() *Ydb_Topic.SupportedCodecs { for i := range codecs { proto.Codecs[i] = int32(codecs[i].ToProto().Number()) } + return proto } diff --git a/internal/grpcwrapper/rawtopic/rawtopicreader/messages.go b/internal/grpcwrapper/rawtopic/rawtopicreader/messages.go index a29d48f80..b7b32da1c 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicreader/messages.go +++ b/internal/grpcwrapper/rawtopic/rawtopicreader/messages.go @@ -72,8 +72,10 @@ func (offset OptionalOffset) ToInt64() int64 { func (offset OptionalOffset) ToInt64Pointer() *int64 { if offset.HasValue { v := offset.Offset.ToInt64() + return &v } + return nil } @@ -137,6 +139,7 @@ func (r *InitRequest) GetTopics() []string { for i := range res { res[i] = r.TopicsReadSettings[i].Path } + return res } @@ -198,6 +201,7 @@ func (r *ReadResponse) GetPartitionBatchMessagesCounts() (partitionDataCount, ba messagesCount += len(partitionData.Batches[batchIndex].MessageData) } } + return partitionDataCount, batchCount, messagesCount } @@ -257,6 +261,7 @@ func (r *ReadResponse) fromProto(p *Ydb_Topic.StreamReadMessage_ReadResponse) er } } } + return nil } @@ -314,6 +319,7 @@ func (r *CommitOffsetRequest) toProto() *Ydb_Topic.StreamReadMessage_CommitOffse dstCommitOffset.Offsets[offsetIndex] = srcPartitionCommitOffset.Offsets[offsetIndex].ToProto() } } + return res } @@ -334,6 +340,7 @@ func (r *OffsetRange) FromProto(p *Ydb_Topic.OffsetsRange) error { r.Start.FromInt64(p.Start) r.End.FromInt64(p.End) + return nil } @@ -407,6 +414,7 @@ func (r *PartitionSessionStatusResponse) fromProto( return err } r.WriteTimeHighWatermark = p.GetWriteTimeHighWatermark().AsTime() + return nil } @@ -461,6 +469,7 @@ func (r *StartPartitionSessionResponse) toProto() *Ydb_Topic.StreamReadMessage_S ReadOffset: r.ReadOffset.ToInt64Pointer(), CommitOffset: r.CommitOffset.ToInt64Pointer(), } + return res } @@ -485,6 +494,7 @@ func (r *StopPartitionSessionRequest) fromProto(proto *Ydb_Topic.StreamReadMessa r.PartitionSessionID.FromInt64(proto.PartitionSessionId) r.Graceful = proto.Graceful r.CommittedOffset.FromInt64(proto.CommittedOffset) + return nil } diff --git a/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go b/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go index 12124f1de..8baad01a0 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go +++ b/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go @@ -32,6 +32,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { grpcMess, err := s.Stream.Recv() if err != nil { err = xerrors.Transport(err) + return nil, err } @@ -48,6 +49,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { resp := &InitResponse{} resp.ServerMessageMetadata = meta resp.fromProto(m.InitResponse) + return resp, nil case *Ydb_Topic.StreamReadMessage_FromServer_ReadResponse: resp := &ReadResponse{} @@ -55,6 +57,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { if err = resp.fromProto(m.ReadResponse); err != nil { return nil, err } + return resp, nil case *Ydb_Topic.StreamReadMessage_FromServer_StartPartitionSessionRequest: resp := &StartPartitionSessionRequest{} @@ -62,6 +65,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { if err = resp.fromProto(m.StartPartitionSessionRequest); err != nil { return nil, err } + return resp, nil case *Ydb_Topic.StreamReadMessage_FromServer_StopPartitionSessionRequest: req := &StopPartitionSessionRequest{} @@ -69,6 +73,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { if err = req.fromProto(m.StopPartitionSessionRequest); err != nil { return nil, err } + return req, nil case *Ydb_Topic.StreamReadMessage_FromServer_CommitOffsetResponse: resp := &CommitOffsetResponse{} @@ -76,6 +81,7 @@ func (s StreamReader) Recv() (ServerMessage, error) { if err = resp.fromProto(m.CommitOffsetResponse); err != nil { return nil, err } + return resp, nil case *Ydb_Topic.StreamReadMessage_FromServer_PartitionSessionStatusResponse: resp := &PartitionSessionStatusResponse{} @@ -83,11 +89,13 @@ func (s StreamReader) Recv() (ServerMessage, error) { if err = resp.fromProto(m.PartitionSessionStatusResponse); err != nil { return nil, err } + return resp, nil case *Ydb_Topic.StreamReadMessage_FromServer_UpdateTokenResponse: resp := &UpdateTokenResponse{} resp.ServerMessageMetadata = meta resp.MustFromProto(m.UpdateTokenResponse) + return resp, nil default: return nil, xerrors.WithStackTrace(fmt.Errorf( @@ -107,11 +115,13 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ ClientMessage: &Ydb_Topic.StreamReadMessage_FromClient_InitRequest{InitRequest: m.toProto()}, } + return s.Stream.Send(grpcMess) case *ReadRequest: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ ClientMessage: &Ydb_Topic.StreamReadMessage_FromClient_ReadRequest{ReadRequest: m.toProto()}, } + return s.Stream.Send(grpcMess) case *StartPartitionSessionResponse: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ @@ -119,6 +129,7 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { StartPartitionSessionResponse: m.toProto(), }, } + return s.Stream.Send(grpcMess) case *StopPartitionSessionResponse: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ @@ -126,6 +137,7 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { StopPartitionSessionResponse: m.toProto(), }, } + return s.Stream.Send(grpcMess) case *CommitOffsetRequest: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ @@ -133,6 +145,7 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { CommitOffsetRequest: m.toProto(), }, } + return s.Stream.Send(grpcMess) case *PartitionSessionStatusRequest: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ @@ -140,6 +153,7 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { PartitionSessionStatusRequest: m.toProto(), }, } + return s.Stream.Send(grpcMess) case *UpdateTokenRequest: grpcMess := &Ydb_Topic.StreamReadMessage_FromClient{ @@ -147,6 +161,7 @@ func (s StreamReader) Send(msg ClientMessage) (err error) { UpdateTokenRequest: m.ToProto(), }, } + return s.Stream.Send(grpcMess) default: return xerrors.WithStackTrace(fmt.Errorf("ydb: send unexpected message type: %v", reflect.TypeOf(msg))) diff --git a/internal/grpcwrapper/rawtopic/rawtopicwriter/messages.go b/internal/grpcwrapper/rawtopic/rawtopicwriter/messages.go index c943506fa..5f89a2f6b 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicwriter/messages.go +++ b/internal/grpcwrapper/rawtopic/rawtopicwriter/messages.go @@ -217,6 +217,7 @@ func (r *WriteResult) fromProto(response *Ydb_Topic.StreamWriteMessage_WriteResp } } r.PartitionID = response.PartitionId + return r.WriteStatistics.fromProto(response.WriteStatistics) } @@ -230,6 +231,7 @@ func (wa *WriteAck) fromProto(pb *Ydb_Topic.StreamWriteMessage_WriteResponse_Wri return xerrors.WithStackTrace(errWriteResultResponseWriteAckIsNil) } wa.SeqNo = pb.SeqNo + return wa.MessageWriteStatus.fromProto(pb.MessageWriteStatus) } @@ -247,10 +249,12 @@ func (s *MessageWriteStatus) fromProto(status interface{}) error { case *Ydb_Topic.StreamWriteMessage_WriteResponse_WriteAck_Written_: s.Type = WriteStatusTypeWritten s.WrittenOffset = v.Written.Offset + return nil case *Ydb_Topic.StreamWriteMessage_WriteResponse_WriteAck_Skipped_: s.Type = WriteStatusTypeSkipped s.SkippedReason = WriteStatusSkipReason(v.Skipped.Reason) + return nil default: return xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf("ydb: unexpected write status type: %v", reflect.TypeOf(v)))) @@ -288,6 +292,7 @@ func (s *WriteStatistics) fromProto(statistics *Ydb_Topic.StreamWriteMessage_Wri s.MinQueueWaitTime = statistics.MinQueueWaitTime.AsDuration() s.MaxQueueWaitTime = statistics.MaxQueueWaitTime.AsDuration() s.TopicQuotaWaitTime = statistics.TopicQuotaWaitTime.AsDuration() + return nil } diff --git a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go index 3b62de655..829fb1b66 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go +++ b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go @@ -42,6 +42,7 @@ func (w *StreamWriter) Recv() (ServerMessage, error) { grpcMsg, err := w.Stream.Recv() if err != nil { err = xerrors.Transport(err) + return nil, xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf( "ydb: failed to read grpc message from writer stream: %w", err, @@ -61,6 +62,7 @@ func (w *StreamWriter) Recv() (ServerMessage, error) { var res InitResult res.ServerMessageMetadata = meta res.mustFromProto(v.InitResponse) + return &res, nil case *Ydb_Topic.StreamWriteMessage_FromServer_WriteResponse: var res WriteResult @@ -69,10 +71,12 @@ func (w *StreamWriter) Recv() (ServerMessage, error) { if err != nil { return nil, err } + return &res, nil case *Ydb_Topic.StreamWriteMessage_FromServer_UpdateTokenResponse: var res UpdateTokenResponse res.MustFromProto(v.UpdateTokenResponse) + return &res, nil default: return nil, xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf( @@ -104,6 +108,7 @@ func (w *StreamWriter) Send(rawMsg ClientMessage) (err error) { if writeErr != nil { return writeErr } + return sendWriteRequest(w.Stream.Send, writeReqProto) case *UpdateTokenRequest: protoMsg.ClientMessage = &Ydb_Topic.StreamWriteMessage_FromClient_UpdateTokenRequest{ @@ -120,6 +125,7 @@ func (w *StreamWriter) Send(rawMsg ClientMessage) (err error) { if err != nil { return xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf("ydb: failed to send grpc message to writer stream: %w", err))) } + return nil } @@ -182,5 +188,6 @@ func sendWriteRequest(send sendFunc, req *Ydb_Topic.StreamWriteMessage_FromClien } req.WriteRequest.Messages = lastMessages + return sendWriteRequest(send, req) } diff --git a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter_test.go b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter_test.go index 4233529d7..e8b1957b1 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter_test.go +++ b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter_test.go @@ -26,6 +26,7 @@ func TestSendWriteRequest(t *testing.T) { var send sendFunc = func(req *Ydb_Topic.StreamWriteMessage_FromClient) error { sendCounter++ require.Equal(t, expected, req.ClientMessage) + return nil } err := sendWriteRequest(send, expected) @@ -81,6 +82,7 @@ func TestSendWriteRequest(t *testing.T) { switch sendCounter { case 1: require.Equal(t, originalMessage, req) + return grpcStatus.Error(codes.ResourceExhausted, "test resource exhausted") case 2: require.Equal(t, split1, req) @@ -89,6 +91,7 @@ func TestSendWriteRequest(t *testing.T) { default: t.Fatal() } + return nil } diff --git a/internal/grpcwrapper/rawydb/issues.go b/internal/grpcwrapper/rawydb/issues.go index d2522dc96..09ed1b3e3 100644 --- a/internal/grpcwrapper/rawydb/issues.go +++ b/internal/grpcwrapper/rawydb/issues.go @@ -20,6 +20,7 @@ func (issuesPointer *Issues) FromProto(p []*Ydb_Issue.IssueMessage) error { return err } } + return nil } @@ -29,6 +30,7 @@ func (issuesPointer *Issues) String() string { for i := range issues { issuesStrings[i] = issues[i].String() } + return strings.Join(issuesStrings, ", ") } diff --git a/internal/grpcwrapper/rawydb/operation.go b/internal/grpcwrapper/rawydb/operation.go index 3c6dcafca..05635a214 100644 --- a/internal/grpcwrapper/rawydb/operation.go +++ b/internal/grpcwrapper/rawydb/operation.go @@ -21,6 +21,7 @@ func (o *Operation) FromProto(proto *Ydb_Operations.Operation) error { if err := o.Status.FromProto(proto.GetStatus()); err != nil { return err } + return o.Issues.FromProto(proto.Issues) } @@ -28,6 +29,7 @@ func (o *Operation) OperationStatusToError() error { if !o.Status.IsSuccess() { return xerrors.WithStackTrace(fmt.Errorf("ydb: create topic error [%v]: %v", o.Status, o.Issues)) } + return nil } @@ -35,5 +37,6 @@ func (o *Operation) FromProtoWithStatusCheck(proto *Ydb_Operations.Operation) er if err := o.FromProto(proto); err != nil { return err } + return o.OperationStatusToError() } diff --git a/internal/grpcwrapper/rawydb/operation_params.go b/internal/grpcwrapper/rawydb/operation_params.go index b2fc9aeba..21d80eba1 100644 --- a/internal/grpcwrapper/rawydb/operation_params.go +++ b/internal/grpcwrapper/rawydb/operation_params.go @@ -19,6 +19,7 @@ func (p *OperationParams) ToProto() *Ydb_Operations.OperationParams { } res.OperationTimeout = p.OperationTimeout.ToProto() res.CancelAfter = p.CancelAfter.ToProto() + return res } diff --git a/internal/grpcwrapper/rawydb/status.go b/internal/grpcwrapper/rawydb/status.go index f31482ac7..e6263b27c 100644 --- a/internal/grpcwrapper/rawydb/status.go +++ b/internal/grpcwrapper/rawydb/status.go @@ -11,6 +11,7 @@ const ( func (s *StatusCode) FromProto(p Ydb.StatusIds_StatusCode) error { *s = StatusCode(p) + return nil } diff --git a/internal/meta/context.go b/internal/meta/context.go index 2df7010c8..be6a9cf7a 100644 --- a/internal/meta/context.go +++ b/internal/meta/context.go @@ -11,6 +11,7 @@ func WithTraceID(ctx context.Context, traceID string) context.Context { if md, has := metadata.FromOutgoingContext(ctx); !has || len(md[HeaderTraceID]) == 0 { return metadata.AppendToOutgoingContext(ctx, HeaderTraceID, traceID) } + return ctx } @@ -18,6 +19,7 @@ func traceID(ctx context.Context) (string, bool) { if md, has := metadata.FromOutgoingContext(ctx); has && len(md[HeaderTraceID]) > 0 { return md[HeaderTraceID][0], true } + return "", false } @@ -37,5 +39,6 @@ func WithAllowFeatures(ctx context.Context, features []string) context.Context { for _, feature := range features { kv = append(kv, HeaderClientCapabilities, feature) } + return metadata.AppendToOutgoingContext(ctx, kv...) } diff --git a/internal/meta/incoming.go b/internal/meta/incoming.go index c4e95e384..940547d2a 100644 --- a/internal/meta/incoming.go +++ b/internal/meta/incoming.go @@ -20,6 +20,7 @@ func WithTrailerCallback(ctx context.Context, callback MetadataCallback) context }, )) } + return context.WithValue(ctx, metadataCallbackKey{}, callback) } diff --git a/internal/meta/meta.go b/internal/meta/meta.go index fbe4f4603..4f1564732 100644 --- a/internal/meta/meta.go +++ b/internal/meta/meta.go @@ -29,6 +29,7 @@ func New( o(m) } } + return m } @@ -118,6 +119,7 @@ func (m *Meta) meta(ctx context.Context) (_ metadata.MD, err error) { if stringer, ok := m.credentials.(fmt.Stringer); ok { return nil, xerrors.WithStackTrace(fmt.Errorf("%w: %s", err, stringer.String())) } + return nil, xerrors.WithStackTrace(err) } @@ -131,5 +133,6 @@ func (m *Meta) Context(ctx context.Context) (_ context.Context, err error) { if err != nil { return ctx, xerrors.WithStackTrace(err) } + return metadata.NewOutgoingContext(ctx, md), nil } diff --git a/internal/meta/trace_id.go b/internal/meta/trace_id.go index e93792c35..926722579 100644 --- a/internal/meta/trace_id.go +++ b/internal/meta/trace_id.go @@ -26,5 +26,6 @@ func TraceID(ctx context.Context, opts ...func(opts *newTraceIDOpts)) (context.C return ctx, "", xerrors.WithStackTrace(err) } id := uuid.String() + return metadata.AppendToOutgoingContext(ctx, HeaderTraceID, id), id, nil } diff --git a/internal/mock/conn.go b/internal/mock/conn.go index 1b9a66523..ac57f6c41 100644 --- a/internal/mock/conn.go +++ b/internal/mock/conn.go @@ -67,11 +67,13 @@ func (c *Conn) GetState() conn.State { func (c *Conn) SetState(ctx context.Context, state conn.State) conn.State { c.State = state + return c.State } func (c *Conn) Unban(ctx context.Context) conn.State { c.SetState(ctx, conn.Online) + return conn.Online } @@ -115,6 +117,7 @@ func (e *Endpoint) String() string { func (e *Endpoint) Copy() endpoint.Endpoint { c := *e + return &c } diff --git a/internal/operation/context.go b/internal/operation/context.go index b82d505b4..3ce2e1ee5 100644 --- a/internal/operation/context.go +++ b/internal/operation/context.go @@ -17,6 +17,7 @@ func WithTimeout(ctx context.Context, operationTimeout time.Duration) context.Co // The current cancelation timeout is already smaller than the new one. return ctx } + return context.WithValue(ctx, ctxOperationTimeoutKey{}, operationTimeout) } @@ -28,6 +29,7 @@ func WithCancelAfter(ctx context.Context, operationCancelAfter time.Duration) co // The current cancelation timeout is already smaller than the new one. return ctx } + return context.WithValue(ctx, ctxOperationCancelAfterKey{}, operationCancelAfter) } @@ -35,6 +37,7 @@ func WithCancelAfter(ctx context.Context, operationCancelAfter time.Duration) co // YDB should try to cancel operation and return result regardless of the cancelation. func Timeout(ctx context.Context) (d time.Duration, ok bool) { d, ok = ctx.Value(ctxOperationTimeoutKey{}).(time.Duration) + return } @@ -42,6 +45,7 @@ func Timeout(ctx context.Context) (d time.Duration, ok bool) { // YDB should try to cancel operation and return result regardless of the cancellation. func CancelAfter(ctx context.Context) (d time.Duration, ok bool) { d, ok = ctx.Value(ctxOperationCancelAfterKey{}).(time.Duration) + return } @@ -50,5 +54,6 @@ func untilDeadline(ctx context.Context) (time.Duration, bool) { if ok { return time.Until(deadline), true } + return 0, false } diff --git a/internal/operation/params.go b/internal/operation/params.go index 2ca1c3c01..f45e941f8 100644 --- a/internal/operation/params.go +++ b/internal/operation/params.go @@ -25,6 +25,7 @@ func Params( if timeout == 0 && cancelAfter == 0 && mode == 0 { return nil } + return &Ydb_Operations.OperationParams{ OperationMode: mode.toYDB(), OperationTimeout: timeoutParam(timeout), diff --git a/internal/operation/params_test.go b/internal/operation/params_test.go index 256dd1cb9..93ac17c5d 100644 --- a/internal/operation/params_test.go +++ b/internal/operation/params_test.go @@ -224,6 +224,7 @@ func TestParams(t *testing.T) { ), time.Second*5, ), time.Second*10) + return ctx }(), timeout: time.Second * 2, @@ -244,6 +245,7 @@ func TestParams(t *testing.T) { ), time.Second*5, ), time.Second*1) + return ctx }(), timeout: time.Second * 2, @@ -264,6 +266,7 @@ func TestParams(t *testing.T) { ), time.Second*5, ), time.Second*1) + return ctx }(), preferContextTimeout: true, @@ -279,6 +282,7 @@ func TestParams(t *testing.T) { { ctx: func() context.Context { ctx, _ := xcontext.WithTimeout(context.Background(), time.Second*1) + return ctx }(), preferContextTimeout: true, @@ -306,6 +310,7 @@ func TestParams(t *testing.T) { tt.exp, ) } + return } if !reflect.DeepEqual(got.OperationMode, tt.exp.OperationMode) { diff --git a/internal/operation/timeout.go b/internal/operation/timeout.go index dc62bdddb..a29dbe76b 100644 --- a/internal/operation/timeout.go +++ b/internal/operation/timeout.go @@ -10,5 +10,6 @@ func timeoutParam(d time.Duration) *durationpb.Duration { if d > 0 { return durationpb.New(d) } + return nil } diff --git a/internal/ratelimiter/client.go b/internal/ratelimiter/client.go index 8705d7897..206cbf5f9 100644 --- a/internal/ratelimiter/client.go +++ b/internal/ratelimiter/client.go @@ -33,6 +33,7 @@ func (c *Client) Close(ctx context.Context) error { if c == nil { return xerrors.WithStackTrace(errNilClient) } + return nil } @@ -57,6 +58,7 @@ func (c *Client) CreateResource( if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -87,6 +89,7 @@ func (c *Client) createResource( operation.ModeSync, ), }) + return } @@ -104,6 +107,7 @@ func (c *Client) AlterResource( if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -134,6 +138,7 @@ func (c *Client) alterResource( operation.ModeSync, ), }) + return } @@ -151,6 +156,7 @@ func (c *Client) DropResource( if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -173,6 +179,7 @@ func (c *Client) dropResource( operation.ModeSync, ), }) + return } @@ -187,10 +194,12 @@ func (c *Client) ListResource( } call := func(ctx context.Context) (err error) { list, err = c.listResource(ctx, coordinationNodePath, resourcePath, recursive) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err := call(ctx) + return list, err } err := retry.Retry(ctx, call, @@ -198,6 +207,7 @@ func (c *Client) ListResource( retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return list, err } @@ -229,6 +239,7 @@ func (c *Client) listResource( if err != nil { return nil, xerrors.WithStackTrace(err) } + return result.GetResourcePaths(), nil } @@ -242,10 +253,12 @@ func (c *Client) DescribeResource( } call := func(ctx context.Context) error { resource, err = c.describeResource(ctx, coordinationNodePath, resourcePath) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err = call(ctx) + return } err = retry.Retry(ctx, call, @@ -253,6 +266,7 @@ func (c *Client) DescribeResource( retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return } @@ -315,6 +329,7 @@ func (c *Client) AcquireResource( if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), diff --git a/internal/ratelimiter/config/config.go b/internal/ratelimiter/config/config.go index 8f9aca3c7..a3f2f48e6 100644 --- a/internal/ratelimiter/config/config.go +++ b/internal/ratelimiter/config/config.go @@ -44,5 +44,6 @@ func New(opts ...Option) Config { o(&c) } } + return c } diff --git a/internal/ratelimiter/errors/errors.go b/internal/ratelimiter/errors/errors.go index 277b93371..761cf25c7 100644 --- a/internal/ratelimiter/errors/errors.go +++ b/internal/ratelimiter/errors/errors.go @@ -33,6 +33,7 @@ func NewAcquire(amoount uint64, err error) ratelimiter.AcquireError { func IsAcquireError(err error) bool { var ae *acquireError + return xerrors.As(err, &ae) } @@ -41,5 +42,6 @@ func ToAcquireError(err error) ratelimiter.AcquireError { if xerrors.As(err, &ae) { return ae } + return nil } diff --git a/internal/ratelimiter/options/acquire.go b/internal/ratelimiter/options/acquire.go index 395ccf8d3..d1f91d64f 100644 --- a/internal/ratelimiter/options/acquire.go +++ b/internal/ratelimiter/options/acquire.go @@ -79,5 +79,6 @@ func NewAcquire(opts ...AcquireOption) Acquire { o(h) } } + return h } diff --git a/internal/repeater/repeater.go b/internal/repeater/repeater.go index bb24c2f2c..4085a4690 100644 --- a/internal/repeater/repeater.go +++ b/internal/repeater/repeater.go @@ -78,6 +78,7 @@ func EventType(ctx context.Context) Event { if eventType, ok := ctx.Value(ctxEventTypeKey{}).(Event); ok { return eventType } + return EventUnknown } diff --git a/internal/repeater/repeater_test.go b/internal/repeater/repeater_test.go index c6af53a58..6749ac19a 100644 --- a/internal/repeater/repeater_test.go +++ b/internal/repeater/repeater_test.go @@ -20,6 +20,7 @@ func TestRepeaterNoWakeUpsAfterStop(t *testing.T) { r := New(context.Background(), interval, func(ctx context.Context) (err error) { wakeUpStart <- struct{}{} <-wakeUpDone + return nil }, WithClock(fakeClock)) @@ -83,6 +84,7 @@ func TestRepeaterForceLogBackoff(t *testing.T) { } lastWakeUp = fakeClock.Now() wakeUps++ + return fmt.Errorf("special error for force with log backoff") }, WithClock(fakeClock)) defer r.Stop() diff --git a/internal/scheme/client.go b/internal/scheme/client.go index 22428fe41..f9dd3a621 100644 --- a/internal/scheme/client.go +++ b/internal/scheme/client.go @@ -34,6 +34,7 @@ func (c *Client) Close(_ context.Context) error { if c == nil { return xerrors.WithStackTrace(errNilClient) } + return nil } @@ -58,6 +59,7 @@ func (c *Client) MakeDirectory(ctx context.Context, path string) (finalErr error if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -78,6 +80,7 @@ func (c *Client) makeDirectory(ctx context.Context, path string) (err error) { ), }, ) + return xerrors.WithStackTrace(err) } @@ -95,6 +98,7 @@ func (c *Client) RemoveDirectory(ctx context.Context, path string) (finalErr err if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -115,6 +119,7 @@ func (c *Client) removeDirectory(ctx context.Context, path string) (err error) { ), }, ) + return xerrors.WithStackTrace(err) } @@ -125,10 +130,12 @@ func (c *Client) ListDirectory(ctx context.Context, path string) (d scheme.Direc }() call := func(ctx context.Context) (err error) { d, err = c.listDirectory(ctx, path) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err := call(ctx) + return d, xerrors.WithStackTrace(err) } err := retry.Retry(ctx, call, @@ -136,6 +143,7 @@ func (c *Client) ListDirectory(ctx context.Context, path string) (d scheme.Direc retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return d, xerrors.WithStackTrace(err) } @@ -168,6 +176,7 @@ func (c *Client) listDirectory(ctx context.Context, path string) (scheme.Directo d.From(result.Self) d.Children = make([]scheme.Entry, len(result.Children)) putEntry(d.Children, result.Children) + return d, nil } @@ -184,10 +193,12 @@ func (c *Client) DescribePath(ctx context.Context, path string) (e scheme.Entry, if err != nil { return xerrors.WithStackTrace(err) } + return nil } if !c.config.AutoRetry() { err := call(ctx) + return e, err } err := retry.Retry(ctx, call, @@ -195,6 +206,7 @@ func (c *Client) DescribePath(ctx context.Context, path string) (e scheme.Entry, retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return e, xerrors.WithStackTrace(err) } @@ -223,6 +235,7 @@ func (c *Client) describePath(ctx context.Context, path string) (e scheme.Entry, return e, xerrors.WithStackTrace(err) } e.From(result.Self) + return e, nil } @@ -248,6 +261,7 @@ func (c *Client) ModifyPermissions( if !c.config.AutoRetry() { return call(ctx) } + return retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithIdempotent(true), @@ -273,6 +287,7 @@ func (c *Client) modifyPermissions(ctx context.Context, path string, desc permis if err != nil { return xerrors.WithStackTrace(err) } + return nil } diff --git a/internal/scheme/config/config.go b/internal/scheme/config/config.go index ff3bd745a..87677eb48 100644 --- a/internal/scheme/config/config.go +++ b/internal/scheme/config/config.go @@ -57,5 +57,6 @@ func New(opts ...Option) Config { o(&c) } } + return c } diff --git a/internal/scheme/helpers/check_exists.go b/internal/scheme/helpers/check_exists.go index 2765ab9c7..534d12b36 100644 --- a/internal/scheme/helpers/check_exists.go +++ b/internal/scheme/helpers/check_exists.go @@ -50,8 +50,10 @@ func IsDirectoryExists(ctx context.Context, c schemeClient, directory string) ( childDirectory, parentDirectory, t.String(), )) } + return true, nil } + return false, nil } @@ -92,10 +94,12 @@ func IsEntryExists(ctx context.Context, c schemeClient, absPath string, entryTyp return true, nil } } + return false, xerrors.WithStackTrace(fmt.Errorf( "entry type of '%s' (%s) in path '%s' is not corresponds to %v", entryName, childrenType, directory, entryTypes, )) } + return false, nil } diff --git a/internal/scheme/helpers/check_exists_test.go b/internal/scheme/helpers/check_exists_test.go index 8b3086f36..265346cae 100644 --- a/internal/scheme/helpers/check_exists_test.go +++ b/internal/scheme/helpers/check_exists_test.go @@ -33,6 +33,7 @@ func (c isDirectoryExistsSchemeClient) ListDirectory(ctx context.Context, path s } if strings.HasPrefix(c.existingPath, path) { children := strings.Split(strings.TrimLeft(c.existingPath, path), "/") + return scheme.Directory{ Entry: scheme.Entry{ Name: path, @@ -46,6 +47,7 @@ func (c isDirectoryExistsSchemeClient) ListDirectory(ctx context.Context, path s }, }, nil } + return d, fmt.Errorf("path '%s' not found in '%s'", path, c) } @@ -173,6 +175,7 @@ func (c isTableExistsSchemeClient) ListDirectory(ctx context.Context, path strin }, nil } } + return d, fmt.Errorf("path '%s' not found in '%s'", path, c) } diff --git a/internal/scripting/client.go b/internal/scripting/client.go index b73f3c75f..bf57a3edd 100644 --- a/internal/scripting/client.go +++ b/internal/scripting/client.go @@ -47,16 +47,19 @@ func (c *Client) Execute( } call := func(ctx context.Context) error { r, err = c.execute(ctx, query, params) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err = call(ctx) + return } err = retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return r, xerrors.WithStackTrace(err) } @@ -97,6 +100,7 @@ func (c *Client) execute( if err != nil { return nil, xerrors.WithStackTrace(err) } + return scanner.NewUnary(result.GetResultSets(), result.GetQueryStats()), nil } @@ -121,10 +125,12 @@ func (c *Client) Explain( } call := func(ctx context.Context) error { e, err = c.explain(ctx, query, mode) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err = call(ctx) + return } err = retry.Retry(ctx, call, @@ -132,6 +138,7 @@ func (c *Client) Explain( retry.WithIdempotent(true), retry.WithTrace(c.config.TraceRetry()), ) + return e, xerrors.WithStackTrace(err) } @@ -179,6 +186,7 @@ func (c *Client) explain( for k, v := range result.GetParametersTypes() { e.ParameterTypes[k] = value.TypeFromYDB(v) } + return e, nil } @@ -192,16 +200,19 @@ func (c *Client) StreamExecute( } call := func(ctx context.Context) error { r, err = c.streamExecute(ctx, query, params) + return xerrors.WithStackTrace(err) } if !c.config.AutoRetry() { err = call(ctx) + return } err = retry.Retry(ctx, call, retry.WithStackTrace(), retry.WithTrace(c.config.TraceRetry()), ) + return r, xerrors.WithStackTrace(err) } @@ -239,6 +250,7 @@ func (c *Client) streamExecute( stream, err := c.service.StreamExecuteYql(ctx, request) if err != nil { cancel() + return nil, xerrors.WithStackTrace(err) } @@ -261,12 +273,14 @@ func (c *Client) streamExecute( if result == nil || err != nil { return nil, nil, xerrors.WithStackTrace(err) } + return result.GetResultSet(), result.GetQueryStats(), nil } }, func(err error) error { cancel() onIntermediate(xerrors.HideEOF(err))(xerrors.HideEOF(err)) + return err }, ) @@ -280,6 +294,7 @@ func (c *Client) Close(ctx context.Context) (err error) { defer func() { onDone(err) }() + return nil } diff --git a/internal/scripting/config/config.go b/internal/scripting/config/config.go index 52fc846ae..1b8ee0ff3 100644 --- a/internal/scripting/config/config.go +++ b/internal/scripting/config/config.go @@ -41,5 +41,6 @@ func New(opts ...Option) Config { o(&c) } } + return c } diff --git a/internal/secret/password.go b/internal/secret/password.go index 79a004984..2b6bdd1ba 100644 --- a/internal/secret/password.go +++ b/internal/secret/password.go @@ -19,5 +19,6 @@ func Password(password string) string { bytes[i] = '*' } } + return xstring.FromBytes(bytes) } diff --git a/internal/secret/token.go b/internal/secret/token.go index 70fab0eca..dc90e0c59 100644 --- a/internal/secret/token.go +++ b/internal/secret/token.go @@ -16,5 +16,6 @@ func Token(token string) string { mask.WriteString("****") } mask.WriteString(fmt.Sprintf("(CRC-32c: %08X)", crc32.Checksum([]byte(token), crc32.IEEETable))) + return mask.String() } diff --git a/internal/stack/function_id.go b/internal/stack/function_id.go index 518551e5b..bbd0f17f3 100644 --- a/internal/stack/function_id.go +++ b/internal/stack/function_id.go @@ -16,5 +16,6 @@ func FunctionID(id string) caller { if id != "" { return functionID(id) } + return Call(1) } diff --git a/internal/stack/record.go b/internal/stack/record.go index c47097a5c..3ae77866f 100644 --- a/internal/stack/record.go +++ b/internal/stack/record.go @@ -72,6 +72,7 @@ type call struct { func Call(depth int) (c call) { c.function, c.file, c.line, _ = runtime.Caller(depth + 1) + return c } @@ -166,6 +167,7 @@ func (c call) Record(opts ...recordOption) string { buffer.WriteByte(')') } } + return buffer.String() } diff --git a/internal/table/client.go b/internal/table/client.go index 1a3fceeeb..505a66f01 100644 --- a/internal/table/client.go +++ b/internal/table/client.go @@ -63,6 +63,7 @@ func newClient( waitChPool: sync.Pool{ New: func() interface{} { ch := make(chan *session) + return &ch }, }, @@ -217,6 +218,7 @@ func (c *Client) createSession(ctx context.Context, opts ...createSessionOption) if r.err != nil { return nil, xerrors.WithStackTrace(r.err) } + return r.s, nil } } @@ -234,6 +236,7 @@ func (c *Client) CreateSession(ctx context.Context, opts ...table.Option) (_ tab if err != nil { return nil, xerrors.WithStackTrace(err) } + return s, nil } if !c.config.AutoRetry() { @@ -241,6 +244,7 @@ func (c *Client) CreateSession(ctx context.Context, opts ...table.Option) (_ tab if err != nil { return nil, xerrors.WithStackTrace(err) } + return s, nil } err = retry.Retry(ctx, @@ -249,6 +253,7 @@ func (c *Client) CreateSession(ctx context.Context, opts ...table.Option) (_ tab if err != nil { return xerrors.WithStackTrace(err) } + return nil }, append( @@ -257,8 +262,10 @@ func (c *Client) CreateSession(ctx context.Context, opts ...table.Option) (_ tab retry.WithTrace(&trace.Retry{ OnRetry: func(info trace.RetryLoopStartInfo) func(trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { onIntermediate := trace.TableOnCreateSession(c.config.Trace(), info.Context, stack.FunctionID("")) + return func(info trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { onDone := onIntermediate(info.Error) + return func(info trace.RetryLoopDoneInfo) { onDone(s, info.Attempts, info.Error) } @@ -268,6 +275,7 @@ func (c *Client) CreateSession(ctx context.Context, opts ...table.Option) (_ tab }, c.retryOptions(opts...).RetryOptions..., )..., ) + return s, xerrors.WithStackTrace(err) } @@ -389,6 +397,7 @@ func (c *Client) internalPoolGet(ctx context.Context, opts ...getOption) (s *ses if c.nodeChecker != nil && !c.nodeChecker.HasNode(s.NodeID()) { _ = s.Close(ctx) s = nil + continue } @@ -437,6 +446,7 @@ func (c *Client) internalPoolGet(ctx context.Context, opts ...getOption) (s *ses idle = c.idle.Len() createInProgress = c.createInProgress }) + return s, xerrors.WithStackTrace( fmt.Errorf("failed to get session from pool ("+ "attempts: %d, latency: %v, pool have %d sessions (%d busy, %d idle, %d create_in_progress): %w", @@ -444,6 +454,7 @@ func (c *Client) internalPoolGet(ctx context.Context, opts ...getOption) (s *ses ), ) } + return s, nil } @@ -481,6 +492,7 @@ func (c *Client) internalPoolWaitFromCh(ctx context.Context, t *trace.Table) (s c.mu.WithLock(func() { c.waitQ.Remove(el) }) + return nil, xerrors.WithStackTrace(errClosedClient) case s, ok = <-*ch: @@ -496,18 +508,21 @@ func (c *Client) internalPoolWaitFromCh(ctx context.Context, t *trace.Table) (s // for the next waiter – session could be lost for a long time. c.internalPoolPutWaitCh(ch) } + return s, nil case <-createSessionTimeoutCh: c.mu.WithLock(func() { c.waitQ.Remove(el) }) + return nil, nil //nolint:nilnil case <-ctx.Done(): c.mu.WithLock(func() { c.waitQ.Remove(el) }) + return nil, xerrors.WithStackTrace(ctx.Err()) } } @@ -700,6 +715,7 @@ func (c *Client) DoTx(ctx context.Context, op table.TxOperation, opts ...table.O } }() } + return op(xcontext.MarkRetryCall(ctx), tx) }() @@ -779,6 +795,7 @@ func (c *Client) internalPoolGetWaitCh() *chan *session { //nolint:gocritic if !ok { panic(fmt.Sprintf("%T is not a chan of sessions", ch)) } + return s } @@ -801,6 +818,7 @@ func (c *Client) internalPoolPeekFirstIdle() (s *session, touched time.Time) { if !has || el != info.idle { panic("inconsistent session client index") } + return s, info.touched } @@ -814,6 +832,7 @@ func (c *Client) internalPoolRemoveFirstIdle() *session { info := c.internalPoolRemoveIdle(s) c.index[s] = info } + return s } @@ -848,6 +867,7 @@ func (c *Client) internalPoolNotify(s *session) (notified bool) { close(*ch) } } + return false } @@ -869,6 +889,7 @@ func (c *Client) internalPoolRemoveIdle(s *session) sessionInfo { c.idle.Remove(info.idle) info.idle = nil c.index[s] = info + return info } diff --git a/internal/table/client_test.go b/internal/table/client_test.go index ee0137bfc..a04672a4c 100644 --- a/internal/table/client_test.go +++ b/internal/table/client_test.go @@ -123,6 +123,7 @@ func TestSessionPoolCloseWhenWaiting(t *testing.T) { &trace.Table{ OnPoolWait: func(trace.TablePoolWaitStartInfo) func(trace.TablePoolWaitDoneInfo) { wait <- struct{}{} + return nil }, }, @@ -140,6 +141,7 @@ func TestSessionPoolCloseWhenWaiting(t *testing.T) { withTrace(&trace.Table{ OnPoolGet: func(trace.TablePoolGetStartInfo) func(trace.TablePoolGetDoneInfo) { get <- struct{}{} + return nil }, }), @@ -347,10 +349,12 @@ func TestSessionPoolDeleteReleaseWait(t *testing.T) { &trace.Table{ OnPoolGet: func(trace.TablePoolGetStartInfo) func(trace.TablePoolGetDoneInfo) { get <- struct{}{} + return nil }, OnPoolWait: func(trace.TablePoolWaitStartInfo) func(trace.TablePoolWaitDoneInfo) { wait <- struct{}{} + return nil }, }, @@ -416,6 +420,7 @@ func TestSessionPoolRacyGet(t *testing.T) { } create <- req <-req.release + return req.session, nil }, }).createSession, @@ -437,10 +442,12 @@ func TestSessionPoolRacyGet(t *testing.T) { s, e := p.Get(context.Background()) if e != nil { err = e + return } if s != expSession { err = fmt.Errorf("unexpected session: %v; want %v", s, expSession) + return } mustPutSession(t, p, s) @@ -554,10 +561,12 @@ func TestSessionPoolSizeLimitOverflow(t *testing.T) { withTrace(&trace.Table{ OnPoolGet: func(trace.TablePoolGetStartInfo) func(trace.TablePoolGetDoneInfo) { get <- struct{}{} + return nil }, OnPoolWait: func(trace.TablePoolWaitStartInfo) func(trace.TablePoolWaitDoneInfo) { wait <- struct{}{} + return nil }, }), @@ -629,12 +638,14 @@ func TestSessionPoolGetPut(t *testing.T) { testutil.InvokeHandlers{ testutil.TableCreateSession: func(interface{}) (proto.Message, error) { created++ + return &Ydb_Table.CreateSessionResult{ SessionId: testutil.SessionID(), }, nil }, testutil.TableDeleteSession: func(interface{}) (proto.Message, error) { deleted++ + return nil, nil }, }, @@ -678,6 +689,7 @@ func TestSessionPoolCloseIdleSessions(t *testing.T) { testutil.TableDeleteSession: okHandler, testutil.TableCreateSession: func(interface{}) (proto.Message, error) { closedCount.Add(1) + return &Ydb_Table.CreateSessionResult{ SessionId: testutil.SessionID(), }, nil @@ -758,6 +770,7 @@ func mustGetSession(t testing.TB, p *Client) *session { t.Helper() t.Fatalf("%s: %v", caller(), err) } + return s } @@ -781,6 +794,7 @@ func mustClose(t testing.TB, p closer.Closer) { func caller() string { _, file, line, _ := runtime.Caller(2) + return fmt.Sprintf("%s:%d", path.Base(file), line) } @@ -837,6 +851,7 @@ func simpleSession(t *testing.T) *session { if err != nil { t.Fatalf("newSession unexpected error: %v", err) } + return s } @@ -868,6 +883,7 @@ func newClientWithStubBuilder( config.New(options...), ) require.NoError(t, err) + return c } @@ -913,6 +929,7 @@ func whenWantWaitCh(p *Client) <-chan struct{} { p.testHookGetWaitCh = prev close(ch) } + return ch } @@ -933,6 +950,7 @@ func TestDeadlockOnUpdateNodes(t *testing.T) { return nil, err } nodes = append(nodes, nodeID) + return &Ydb_Table.CreateSessionResult{ SessionId: sessionID, }, nil @@ -975,6 +993,7 @@ func TestDeadlockOnInternalPoolGCTick(t *testing.T) { return nil, err } nodes = append(nodes, nodeID) + return &Ydb_Table.CreateSessionResult{ SessionId: sessionID, }, nil diff --git a/internal/table/config/config.go b/internal/table/config/config.go index 6b8540f81..5013ab332 100644 --- a/internal/table/config/config.go +++ b/internal/table/config/config.go @@ -32,6 +32,7 @@ func New(opts ...Option) *Config { o(c) } } + return c } diff --git a/internal/table/data_query.go b/internal/table/data_query.go index c5063a30e..f918b7192 100644 --- a/internal/table/data_query.go +++ b/internal/table/data_query.go @@ -36,6 +36,7 @@ func (q textDataQuery) YQL() string { func (q textDataQuery) toYDB(a *allocator.Allocator) *Ydb_Table.Query { query := a.TableQuery() query.Query = a.TableQueryYqlText(string(q)) + return query } @@ -54,6 +55,7 @@ func (q preparedDataQuery) YQL() string { func (q preparedDataQuery) toYDB(a *allocator.Allocator) *Ydb_Table.Query { query := a.TableQuery() query.Query = a.TableQueryID(q.id) + return query } diff --git a/internal/table/params.go b/internal/table/params.go index a4efeee38..bb1f1e327 100644 --- a/internal/table/params.go +++ b/internal/table/params.go @@ -36,5 +36,6 @@ func GenerateDeclareSection(params *table.QueryParameters) (string, error) { } buf.WriteString(declares[name]) } + return buf.String(), nil } diff --git a/internal/table/retry.go b/internal/table/retry.go index d04408094..d6577d7ad 100644 --- a/internal/table/retry.go +++ b/internal/table/retry.go @@ -46,6 +46,7 @@ func do( } }() } + return op(xcontext.MarkRetryCall(ctx), s) }() @@ -80,6 +81,7 @@ func retryBackoff( if err = op(ctx, s); err != nil { s.checkError(err) + return xerrors.WithStackTrace(err) } @@ -107,5 +109,6 @@ func (c *Client) retryOptions(opts ...table.Option) *table.Options { if options.Trace == nil { options.Trace = &trace.Table{} } + return options } diff --git a/internal/table/retry_test.go b/internal/table/retry_test.go index 43a1c865e..008633786 100644 --- a/internal/table/retry_test.go +++ b/internal/table/retry_test.go @@ -51,6 +51,7 @@ func TestRetryerBackoffRetryCancelation(t *testing.T) { testutil.BackoffFunc(func(n int) <-chan time.Time { ch := make(chan time.Time) backoff <- ch + return ch }), ), @@ -58,6 +59,7 @@ func TestRetryerBackoffRetryCancelation(t *testing.T) { testutil.BackoffFunc(func(n int) <-chan time.Time { ch := make(chan time.Time) backoff <- ch + return ch }), ), @@ -84,12 +86,14 @@ func TestRetryerBadSession(t *testing.T) { s.onClose = append(s.onClose, func(s *session) { closed[s] = true }) + return s, nil }, OnPut: func(ctx context.Context, s *session) error { if s.isClosing() { return s.Close(ctx) } + return nil }, } @@ -106,6 +110,7 @@ func TestRetryerBadSession(t *testing.T) { if i > maxRetryes { cancel() } + return xerrors.Operation( xerrors.WithStatusCode(Ydb.StatusIds_BAD_SESSION), ) @@ -136,12 +141,14 @@ func TestRetryerSessionClosing(t *testing.T) { s.onClose = append(s.onClose, func(s *session) { closed[s] = true }) + return s, nil }, OnPut: func(ctx context.Context, s *session) error { if s.isClosing() { return s.Close(ctx) } + return nil }, } @@ -154,6 +161,7 @@ func TestRetryerSessionClosing(t *testing.T) { func(ctx context.Context, s table.Session) error { sessions = append(sessions, s) s.(*session).SetStatus(table.SessionClosing) + return nil }, nil, @@ -444,6 +452,7 @@ func TestRetryWithCustomErrors(t *testing.T) { if i < limit { return test.error } + return nil }, nil, @@ -486,6 +495,7 @@ func (f SessionProviderFunc) Get(ctx context.Context) (*session, error) { if f.OnGet == nil { return nil, xerrors.WithStackTrace(errNoSession) } + return f.OnGet(ctx) } @@ -493,6 +503,7 @@ func (f SessionProviderFunc) Put(ctx context.Context, s *session) error { if f.OnPut == nil { return xerrors.WithStackTrace(testutil.ErrNotImplemented) } + return f.OnPut(ctx, s) } @@ -512,6 +523,7 @@ func (s *singleSession) Get(context.Context) (*session, error) { return nil, xerrors.WithStackTrace(errNoSession) } s.empty = true + return s.s, nil } @@ -523,6 +535,7 @@ func (s *singleSession) Put(_ context.Context, x *session) error { return xerrors.WithStackTrace(errSessionOverflow) } s.empty = false + return nil } diff --git a/internal/table/scanner/result.go b/internal/table/scanner/result.go index e620e19bd..8cf05cf8e 100644 --- a/internal/table/scanner/result.go +++ b/internal/table/scanner/result.go @@ -40,6 +40,7 @@ func (r *streamResult) Err() error { if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -56,6 +57,7 @@ func (r *unaryResult) Err() error { if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -64,6 +66,7 @@ func (r *unaryResult) Close() error { if r.closed.CompareAndSwap(false, true) { return nil } + return xerrors.WithStackTrace(errAlreadyClosed) } @@ -121,6 +124,7 @@ func NewStream( if err := r.nextResultSetErr(ctx); err != nil { return nil, xerrors.WithStackTrace(err) } + return r, nil } @@ -136,6 +140,7 @@ func NewUnary(sets []*Ydb.ResultSet, stats *Ydb_TableStats.QueryStats, opts ...o o(&r.baseResult) } } + return r } @@ -155,6 +160,7 @@ func (r *unaryResult) NextResultSetErr(ctx context.Context, columns ...string) ( } r.Reset(r.sets[r.nextSet], columns...) r.nextSet++ + return ctx.Err() } @@ -166,6 +172,7 @@ func (r *streamResult) nextResultSetErr(ctx context.Context, columns ...string) // skipping second recv because first call of recv is from New Stream(), second call is from user if r.nextResultSetCounter.Add(1) == 2 { r.setColumnIndexes(columns) + return ctx.Err() } s, stats, err := r.recv(ctx) @@ -174,6 +181,7 @@ func (r *streamResult) nextResultSetErr(ctx context.Context, columns ...string) if xerrors.Is(err, io.EOF) { return err } + return r.errorf(1, "streamResult.NextResultSetErr(): %w", err) } r.Reset(s, columns...) @@ -182,6 +190,7 @@ func (r *streamResult) nextResultSetErr(ctx context.Context, columns ...string) r.stats = stats }) } + return ctx.Err() } @@ -196,8 +205,10 @@ func (r *streamResult) NextResultSetErr(ctx context.Context, columns ...string) if xerrors.Is(err, io.EOF) { return io.EOF } + return xerrors.WithStackTrace(err) } + return nil } @@ -229,6 +240,7 @@ func (r *streamResult) Close() (err error) { if r.closed.CompareAndSwap(false, true) { return r.close(r.Err()) } + return xerrors.WithStackTrace(errAlreadyClosed) } @@ -252,5 +264,6 @@ func (r *unaryResult) HasNextResultSet() bool { if r.inactive() || r.nextSet >= len(r.sets) { return false } + return true } diff --git a/internal/table/scanner/result_test.go b/internal/table/scanner/result_test.go index e7eb25e36..e3f71b62e 100644 --- a/internal/table/scanner/result_test.go +++ b/internal/table/scanner/result_test.go @@ -201,6 +201,7 @@ func NewResultSet(a *allocator.Allocator, opts ...ResultSetOption) *Ydb.ResultSe opt(&d, a) } } + return (*Ydb.ResultSet)(&d) } @@ -218,6 +219,7 @@ func TestNewStreamWithRecvFirstResultSet(t *testing.T) { ctx: func() context.Context { ctx, cancel := context.WithCancel(context.Background()) cancel() + return ctx }(), err: context.Canceled, @@ -226,6 +228,7 @@ func TestNewStreamWithRecvFirstResultSet(t *testing.T) { ctx: func() context.Context { ctx, cancel := context.WithTimeout(context.Background(), 0) cancel() + return ctx }(), err: context.DeadlineExceeded, @@ -234,6 +237,7 @@ func TestNewStreamWithRecvFirstResultSet(t *testing.T) { ctx: func() context.Context { ctx, cancel := context.WithTimeout(context.Background(), time.Hour) cancel() + return ctx }(), err: context.Canceled, @@ -246,6 +250,7 @@ func TestNewStreamWithRecvFirstResultSet(t *testing.T) { if tt.recvCounter > 1000 { return nil, nil, io.EOF } + return &Ydb.ResultSet{}, nil, ctx.Err() }, func(err error) error { diff --git a/internal/table/scanner/scan_raw.go b/internal/table/scanner/scan_raw.go index b9e7732d9..1a0c8be98 100644 --- a/internal/table/scanner/scan_raw.go +++ b/internal/table/scanner/scan_raw.go @@ -22,6 +22,7 @@ type rawConverter struct { func (s *rawConverter) String() (v []byte) { s.unwrap() + return s.bytes() } @@ -36,6 +37,7 @@ func (s *rawConverter) HasNextItem() bool { func (s *rawConverter) Path() string { var buf bytes.Buffer _, _ = s.WritePathTo(&buf) + return buf.String() } @@ -61,6 +63,7 @@ func (s *rawConverter) WritePathTo(w io.Writer) (n int64, err error) { } n += int64(m) } + return n, nil } @@ -73,6 +76,7 @@ func (s *rawConverter) Bool() (v bool) { return } s.unwrap() + return s.bool() } @@ -81,6 +85,7 @@ func (s *rawConverter) Int8() (v int8) { return } s.unwrap() + return s.int8() } @@ -89,6 +94,7 @@ func (s *rawConverter) Uint8() (v uint8) { return } s.unwrap() + return s.uint8() } @@ -97,6 +103,7 @@ func (s *rawConverter) Int16() (v int16) { return } s.unwrap() + return s.int16() } @@ -105,6 +112,7 @@ func (s *rawConverter) Uint16() (v uint16) { return } s.unwrap() + return s.uint16() } @@ -113,6 +121,7 @@ func (s *rawConverter) Int32() (v int32) { return } s.unwrap() + return s.int32() } @@ -121,6 +130,7 @@ func (s *rawConverter) Uint32() (v uint32) { return } s.unwrap() + return s.uint32() } @@ -129,6 +139,7 @@ func (s *rawConverter) Int64() (v int64) { return } s.unwrap() + return s.int64() } @@ -137,6 +148,7 @@ func (s *rawConverter) Uint64() (v uint64) { return } s.unwrap() + return s.uint64() } @@ -145,6 +157,7 @@ func (s *rawConverter) Float() (v float32) { return } s.unwrap() + return s.float() } @@ -153,26 +166,31 @@ func (s *rawConverter) Double() (v float64) { return } s.unwrap() + return s.double() } func (s *rawConverter) Date() (v time.Time) { s.unwrap() + return value.DateToTime(s.uint32()) } func (s *rawConverter) Datetime() (v time.Time) { s.unwrap() + return value.DatetimeToTime(s.uint32()) } func (s *rawConverter) Timestamp() (v time.Time) { s.unwrap() + return value.TimestampToTime(s.uint64()) } func (s *rawConverter) Interval() (v time.Duration) { s.unwrap() + return value.IntervalToDuration(s.int64()) } @@ -185,6 +203,7 @@ func (s *rawConverter) TzDate() (v time.Time) { if err != nil { _ = s.errorf(0, "rawConverter.TzDate(): %w", err) } + return src } @@ -197,6 +216,7 @@ func (s *rawConverter) TzDatetime() (v time.Time) { if err != nil { _ = s.errorf(0, "rawConverter.TzDatetime(): %w", err) } + return src } @@ -209,6 +229,7 @@ func (s *rawConverter) TzTimestamp() (v time.Time) { if err != nil { _ = s.errorf(0, "rawConverter.TzTimestamp(): %w", err) } + return src } @@ -217,21 +238,25 @@ func (s *rawConverter) UTF8() (v string) { return } s.unwrap() + return s.text() } func (s *rawConverter) YSON() (v []byte) { s.unwrap() + return s.bytes() } func (s *rawConverter) JSON() (v []byte) { s.unwrap() + return xstring.ToBytes(s.text()) } func (s *rawConverter) JSONDocument() (v []byte) { s.unwrap() + return xstring.ToBytes(s.text()) } @@ -240,6 +265,7 @@ func (s *rawConverter) UUID() (v [16]byte) { return } s.unwrap() + return s.uint128() } @@ -248,6 +274,7 @@ func (s *rawConverter) DyNumber() (v string) { return } s.unwrap() + return s.text() } @@ -261,6 +288,7 @@ func (s *rawConverter) Value() types.Value { return nil } s.unwrap() + return s.value() } @@ -279,6 +307,7 @@ func (s *rawConverter) IsNull() bool { if s.Err() != nil { return false } + return s.isNull() } @@ -286,6 +315,7 @@ func (s *rawConverter) IsOptional() bool { if s.Err() != nil { return false } + return s.isCurrentTypeOptional() } @@ -299,6 +329,7 @@ func (s *rawConverter) ListIn() (size int) { if s.assertTypeList(x.t) != nil { return s.itemsIn() } + return 0 } @@ -337,6 +368,7 @@ func (s *rawConverter) TupleIn() (size int) { if s.assertTypeTuple(x.t) != nil { return s.itemsIn() } + return 0 } @@ -375,6 +407,7 @@ func (s *rawConverter) StructIn() (size int) { if s.assertTypeStruct(x.t) != nil { return s.itemsIn() } + return 0 } @@ -396,6 +429,7 @@ func (s *rawConverter) StructField(i int) (name string) { v: p.v.Items[i], }) } + return } @@ -417,6 +451,7 @@ func (s *rawConverter) DictIn() (size int) { if s.assertTypeDict(x.t) != nil { return s.pairsIn() } + return 0 } @@ -485,6 +520,7 @@ func (s *rawConverter) Variant() (name string, index uint32) { t: typ, v: v, }) + return name, index } @@ -517,6 +553,7 @@ func (s *rawConverter) Decimal(t types.Type) (v [16]byte) { if !s.assertCurrentTypeDecimal(t) { return } + return s.uint128() } @@ -529,6 +566,7 @@ func (s *rawConverter) UnwrapDecimal() (v types.Decimal) { if d == nil { return } + return types.Decimal{ Bytes: s.uint128(), Precision: d.DecimalType.Precision, @@ -540,17 +578,20 @@ func (s *rawConverter) IsDecimal() bool { if s.Err() != nil { return false } + return s.isCurrentTypeDecimal() } func isEqualDecimal(d *Ydb.DecimalType, t types.Type) bool { w := t.(*value.DecimalType) + return d.Precision == w.Precision && d.Scale == w.Scale } func (s *rawConverter) isCurrentTypeDecimal() bool { c := s.stack.current() _, ok := c.t.Type.(*Ydb.Type_DecimalType) + return ok } @@ -560,16 +601,20 @@ func (s *rawConverter) unwrapVariantType(typ *Ydb.Type_VariantType, index uint32 case *Ydb.VariantType_TupleItems: if i >= len(x.TupleItems.Elements) { _ = s.errorf(0, "unimplemented") + return } + return "", x.TupleItems.Elements[i] case *Ydb.VariantType_StructItems: if i >= len(x.StructItems.Members) { _ = s.errorf(0, "unimplemented") + return } m := x.StructItems.Members[i] + return m.Name, m.Type default: @@ -584,6 +629,7 @@ func (s *rawConverter) variant() (v *Ydb.Value, index uint32) { } x := s.stack.current() // Is not nil if unwrapValue succeeded. index = x.v.VariantIndex + return } @@ -593,6 +639,7 @@ func (s *rawConverter) itemsIn() int { return -1 } s.stack.enter() + return len(x.v.Items) } @@ -610,6 +657,7 @@ func (s *rawConverter) pairsIn() int { return -1 } s.stack.enter() + return len(x.v.Pairs) } @@ -624,8 +672,10 @@ func (s *rawConverter) pairsBoundsCheck(xs []*Ydb.ValuePair, i int) bool { func (s *rawConverter) boundsCheck(n, i int) bool { if i < 0 || n <= i { s.boundsError(n, i) + return false } + return true } @@ -634,6 +684,7 @@ func (s *scanner) assertTypeOptional(typ *Ydb.Type) (t *Ydb.Type_OptionalType) { if t, _ = x.(*Ydb.Type_OptionalType); t == nil { s.typeError(x, t) } + return } @@ -655,6 +706,7 @@ func (s *rawConverter) assertCurrentTypeNullable() bool { c.t, p.t, ) + return false } @@ -670,8 +722,10 @@ func (s *rawConverter) assertCurrentTypeIs(t types.Type) bool { act, t, ) + return false } + return true } @@ -682,8 +736,10 @@ func (s *rawConverter) assertCurrentTypeDecimal(t types.Type) bool { } if !isEqualDecimal(d.DecimalType, t) { s.decimalTypeError(t) + return false } + return true } @@ -692,6 +748,7 @@ func (s *rawConverter) assertTypeList(typ *Ydb.Type) (t *Ydb.Type_ListType) { if t, _ = x.(*Ydb.Type_ListType); t == nil { s.typeError(x, t) } + return } @@ -700,6 +757,7 @@ func (s *rawConverter) assertTypeTuple(typ *Ydb.Type) (t *Ydb.Type_TupleType) { if t, _ = x.(*Ydb.Type_TupleType); t == nil { s.typeError(x, t) } + return } @@ -708,6 +766,7 @@ func (s *rawConverter) assertTypeStruct(typ *Ydb.Type) (t *Ydb.Type_StructType) if t, _ = x.(*Ydb.Type_StructType); t == nil { s.typeError(x, t) } + return } @@ -716,6 +775,7 @@ func (s *rawConverter) assertTypeDict(typ *Ydb.Type) (t *Ydb.Type_DictType) { if t, _ = x.(*Ydb.Type_DictType); t == nil { s.typeError(x, t) } + return } @@ -724,6 +784,7 @@ func (s *rawConverter) assertTypeDecimal(typ *Ydb.Type) (t *Ydb.Type_DecimalType if t, _ = x.(*Ydb.Type_DecimalType); t == nil { s.typeError(x, t) } + return } @@ -732,6 +793,7 @@ func (s *rawConverter) assertTypeVariant(typ *Ydb.Type) (t *Ydb.Type_VariantType if t, _ = x.(*Ydb.Type_VariantType); t == nil { s.typeError(x, t) } + return } @@ -759,5 +821,6 @@ func nameIface(v interface{}) string { s = strings.TrimSuffix(s, "Value") s = strings.TrimPrefix(s, "*Ydb.Type_") s = strings.TrimSuffix(s, "Type") + return s } diff --git a/internal/table/scanner/scanner.go b/internal/table/scanner/scanner.go index 7334dc4d5..415ebd669 100644 --- a/internal/table/scanner/scanner.go +++ b/internal/table/scanner/scanner.go @@ -43,6 +43,7 @@ func (s *scanner) ColumnCount() int { if s.set == nil { return 0 } + return len(s.set.Columns) } @@ -64,6 +65,7 @@ func (s *scanner) RowCount() int { if s.set == nil { return 0 } + return len(s.set.Rows) } @@ -72,6 +74,7 @@ func (s *scanner) ItemCount() int { if s.row == nil { return 0 } + return len(s.row.Items) } @@ -113,6 +116,7 @@ func (s *scanner) preScanChecks(lenValues int) (err error) { if s.nextItem != 0 { panic("scan row failed: double scan per row") } + return s.Err() } @@ -140,6 +144,7 @@ func (s *scanner) ScanWithDefaults(values ...indexed.Required) (err error) { } } s.nextItem += len(values) + return s.Err() } @@ -167,6 +172,7 @@ func (s *scanner) Scan(values ...indexed.RequiredOrOptional) (err error) { } } s.nextItem += len(values) + return s.Err() } @@ -196,6 +202,7 @@ func (s *scanner) ScanNamed(namedValues ...named.Value) error { } } s.nextItem += len(namedValues) + return s.Err() } @@ -203,8 +210,10 @@ func (s *scanner) ScanNamed(namedValues ...named.Value) error { func (s *scanner) Truncated() bool { if s.set == nil { _ = s.errorf(0, "there are no sets in the scanner") + return false } + return s.set.Truncated } @@ -213,6 +222,7 @@ func (s *scanner) truncated() bool { if s.set == nil { return false } + return s.set.Truncated } @@ -230,8 +240,10 @@ func (s *scanner) Err() error { if s.markTruncatedAsRetryable { err = xerrors.Retryable(err) } + return xerrors.WithStackTrace(err) } + return nil } @@ -253,6 +265,7 @@ func (s *scanner) path() string { buf := xstring.Buffer() defer buf.Free() _, _ = s.writePathTo(buf) + return buf.String() } @@ -264,6 +277,7 @@ func (s *scanner) writePathTo(w io.Writer) (n int64, err error) { return n, xerrors.WithStackTrace(err) } n += int64(m) + return n, nil } @@ -272,6 +286,7 @@ func (s *scanner) getType() types.Type { if x.isEmpty() { return nil } + return value.TypeFromYDB(x.t) } @@ -287,6 +302,7 @@ func (s *scanner) seekItemByID(id int) error { s.stack.scanItem.name = col.Name s.stack.scanItem.t = col.Type s.stack.scanItem.v = s.row.Items[id] + return nil } @@ -301,14 +317,17 @@ func (s *scanner) seekItemByName(name string) error { s.stack.scanItem.name = c.Name s.stack.scanItem.t = c.Type s.stack.scanItem.v = s.row.Items[i] + return s.Err() } + return s.notFoundColumnName(name) } func (s *scanner) setColumnIndexes(columns []string) { if columns == nil { s.columnIndexes = nil + return } s.columnIndexes = make([]int, len(columns)) @@ -318,11 +337,13 @@ func (s *scanner) setColumnIndexes(columns []string) { if c.Name == col { s.columnIndexes[i] = j found = true + break } } if !found { _ = s.noColumnError(col) + return } } @@ -408,18 +429,21 @@ func (s *scanner) any() interface{} { if err != nil { _ = s.errorf(0, "scanner.any(): %w", err) } + return src case value.TypeTzDatetime: src, err := value.TzDatetimeToTime(s.text()) if err != nil { _ = s.errorf(0, "scanner.any(): %w", err) } + return src case value.TypeTzTimestamp: src, err := value.TzTimestampToTime(s.text()) if err != nil { _ = s.errorf(0, "scanner.any(): %w", err) } + return src case value.TypeText, value.TypeDyNumber: return s.text() @@ -430,6 +454,7 @@ func (s *scanner) any() interface{} { return xstring.ToBytes(s.text()) default: _ = s.errorf(0, "unknown primitive types") + return nil } } @@ -437,16 +462,19 @@ func (s *scanner) any() interface{} { // Value returns current item under scan as ydb.Value types. func (s *scanner) value() types.Value { x := s.stack.current() + return value.FromYDB(x.t, x.v) } func (s *scanner) isCurrentTypeOptional() bool { c := s.stack.current() + return isOptional(c.t) } func (s *scanner) isNull() bool { _, yes := s.stack.currentValue().(*Ydb.Value_NullFlagValue) + return yes } @@ -472,8 +500,10 @@ func (s *scanner) unwrapValue() (v *Ydb.Value) { x, _ := s.stack.currentValue().(*Ydb.Value_NestedValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.NestedValue } @@ -486,6 +516,7 @@ func (s *scanner) unwrapDecimal() (v types.Decimal) { if d == nil { return } + return types.Decimal{ Bytes: s.uint128(), Precision: d.DecimalType.Precision, @@ -498,6 +529,7 @@ func (s *scanner) assertTypeDecimal(typ *Ydb.Type) (t *Ydb.Type_DecimalType) { if t, _ = x.(*Ydb.Type_DecimalType); t == nil { s.typeError(x, t) } + return } @@ -505,8 +537,10 @@ func (s *scanner) bool() (v bool) { x, _ := s.stack.currentValue().(*Ydb.Value_BoolValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.BoolValue } @@ -514,8 +548,10 @@ func (s *scanner) int8() (v int8) { d := s.int32() if d < math.MinInt8 || math.MaxInt8 < d { _ = s.overflowError(d, v) + return } + return int8(d) } @@ -523,8 +559,10 @@ func (s *scanner) uint8() (v uint8) { d := s.uint32() if d > math.MaxUint8 { _ = s.overflowError(d, v) + return } + return uint8(d) } @@ -532,8 +570,10 @@ func (s *scanner) int16() (v int16) { d := s.int32() if d < math.MinInt16 || math.MaxInt16 < d { _ = s.overflowError(d, v) + return } + return int16(d) } @@ -541,8 +581,10 @@ func (s *scanner) uint16() (v uint16) { d := s.uint32() if d > math.MaxUint16 { _ = s.overflowError(d, v) + return } + return uint16(d) } @@ -550,8 +592,10 @@ func (s *scanner) int32() (v int32) { x, _ := s.stack.currentValue().(*Ydb.Value_Int32Value) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.Int32Value } @@ -559,8 +603,10 @@ func (s *scanner) uint32() (v uint32) { x, _ := s.stack.currentValue().(*Ydb.Value_Uint32Value) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.Uint32Value } @@ -568,8 +614,10 @@ func (s *scanner) int64() (v int64) { x, _ := s.stack.currentValue().(*Ydb.Value_Int64Value) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.Int64Value } @@ -577,8 +625,10 @@ func (s *scanner) uint64() (v uint64) { x, _ := s.stack.currentValue().(*Ydb.Value_Uint64Value) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.Uint64Value } @@ -586,8 +636,10 @@ func (s *scanner) float() (v float32) { x, _ := s.stack.currentValue().(*Ydb.Value_FloatValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.FloatValue } @@ -595,8 +647,10 @@ func (s *scanner) double() (v float64) { x, _ := s.stack.currentValue().(*Ydb.Value_DoubleValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.DoubleValue } @@ -604,8 +658,10 @@ func (s *scanner) bytes() (v []byte) { x, _ := s.stack.currentValue().(*Ydb.Value_BytesValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.BytesValue } @@ -613,8 +669,10 @@ func (s *scanner) text() (v string) { x, _ := s.stack.currentValue().(*Ydb.Value_TextValue) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.TextValue } @@ -622,8 +680,10 @@ func (s *scanner) low128() (v uint64) { x, _ := s.stack.currentValue().(*Ydb.Value_Low_128) if x == nil { s.valueTypeError(s.stack.currentValue(), x) + return } + return x.Low_128 } @@ -631,10 +691,12 @@ func (s *scanner) uint128() (v [16]byte) { c := s.stack.current() if c.isEmpty() { _ = s.errorf(0, "not implemented convert to [16]byte") + return } lo := s.low128() hi := c.v.High_128 + return value.BigEndianUint128(hi, lo) } @@ -715,6 +777,7 @@ func (s *scanner) trySetByteArray(v interface{}, optional, def bool) bool { } if s.isNull() { rv.Set(reflect.Zero(rv.Type())) + return true } if rv.IsZero() { @@ -731,6 +794,7 @@ func (s *scanner) trySetByteArray(v interface{}, optional, def bool) bool { } if def { rv.Set(reflect.Zero(rv.Type())) + return true } var dst []byte @@ -739,6 +803,7 @@ func (s *scanner) trySetByteArray(v interface{}, optional, def bool) bool { return false } reflect.Copy(rv, reflect.ValueOf(dst)) + return true } @@ -827,6 +892,7 @@ func (s *scanner) scanOptional(v interface{}, defaultValueForOptional bool) { s.unwrap() s.scanRequired(v) } + return } switch v := v.(type) { @@ -1100,6 +1166,7 @@ func (s *scanner) errorf(depth int, f string, args ...interface{}) error { return s.err } s.err = xerrors.WithStackTrace(fmt.Errorf(f, args...), xerrors.WithSkipDepth(depth+1)) + return s.err } @@ -1182,6 +1249,7 @@ func (s *scanStack) size() int { if !s.scanItem.isEmpty() { s.set(s.scanItem) } + return s.p + 1 } @@ -1222,6 +1290,7 @@ func (s *scanStack) parent() item { if s.p == 0 { return emptyItem } + return s.v[s.p-1] } @@ -1232,6 +1301,7 @@ func (s *scanStack) current() item { if s.v == nil { return emptyItem } + return s.v[s.p] } @@ -1239,6 +1309,7 @@ func (s *scanStack) currentValue() interface{} { if v := s.current().v; v != nil { return v.Value } + return nil } @@ -1246,6 +1317,7 @@ func (s *scanStack) currentType() interface{} { if t := s.current().t; t != nil { return t.Type } + return nil } @@ -1254,5 +1326,6 @@ func isOptional(typ *Ydb.Type) bool { return false } _, yes := typ.Type.(*Ydb.Type_OptionalType) + return yes } diff --git a/internal/table/scanner/scanner_data_test.go b/internal/table/scanner/scanner_data_test.go index c3d7c73a2..396dd3d28 100644 --- a/internal/table/scanner/scanner_data_test.go +++ b/internal/table/scanner/scanner_data_test.go @@ -29,6 +29,7 @@ func (s *intIncScanner) Scan(src interface{}) error { return fmt.Errorf("wrong type: %T, exp: int64", src) } *s = intIncScanner(v + 10) + return nil } @@ -40,6 +41,7 @@ func (s *dateScanner) Scan(src interface{}) error { return fmt.Errorf("wrong type: %T, exp: time.Time", src) } *s = dateScanner(v) + return nil } @@ -485,6 +487,7 @@ func initScanner() *scanner { columnIndexes: nil, err: nil, } + return &res } @@ -543,5 +546,6 @@ func PrepareScannerPerformanceTest(count int) *scanner { }) } res.converter = &rawConverter{res} + return res } diff --git a/internal/table/scanner/scanner_test.go b/internal/table/scanner/scanner_test.go index c0dcb4c5f..cc595229a 100644 --- a/internal/table/scanner/scanner_test.go +++ b/internal/table/scanner/scanner_test.go @@ -31,8 +31,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_INT8: v := int8(rv) @@ -43,8 +45,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_UINT8: if c.nilValue { @@ -53,9 +57,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv uint8 + return ydbval, &dv } var dv *uint8 + return ydbval, &dv } v := uint8(rv) @@ -66,8 +72,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_INT16: v := int16(rv) @@ -78,8 +86,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_UINT16: v := uint16(rv) @@ -90,8 +100,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_INT32: if c.nilValue { @@ -100,9 +112,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv int32 + return ydbval, &dv } var dv *int32 + return ydbval, &dv } v := int32(rv) @@ -113,8 +127,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_UINT32: v := uint32(rv) @@ -125,8 +141,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_INT64: v := rv @@ -137,16 +155,20 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.ydbvalue { vp := types.Int64Value(v) + return ydbval, &vp } if c.scanner { s := intIncScanner(v + 10) + return ydbval, &s } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_UINT64: v := uint64(rv) @@ -157,8 +179,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_FLOAT: v := float32(rv) @@ -169,12 +193,15 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.ydbvalue { vp := types.FloatValue(v) + return ydbval, &vp } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_DOUBLE: v := float64(rv) @@ -185,8 +212,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_DATE: v := uint32(rv) @@ -198,12 +227,15 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := value.DateToTime(v) if c.scanner { s := dateScanner(src) + return ydbval, &s } if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_DATETIME: v := uint32(rv) @@ -215,8 +247,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := value.DatetimeToTime(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_TIMESTAMP: v := uint64(rv) @@ -228,8 +262,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := value.TimestampToTime(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_INTERVAL: if c.nilValue { @@ -238,9 +274,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv time.Duration + return ydbval, &dv } var dv *time.Duration + return ydbval, &dv } rv %= time.Now().Unix() @@ -253,8 +291,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := value.IntervalToDuration(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_TZ_DATE: v := time.Now().Format(value.LayoutDate) + ",Europe/Berlin" @@ -266,8 +306,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src, _ := value.TzDateToTime(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_TZ_DATETIME: if c.nilValue { @@ -276,9 +318,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv time.Time + return ydbval, &dv } var dv *time.Time + return ydbval, &dv } rv %= time.Now().Unix() @@ -291,8 +335,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src, _ := value.TzDatetimeToTime(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_TZ_TIMESTAMP: rv %= time.Now().Unix() @@ -305,8 +351,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src, _ := value.TzTimestampToTime(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_STRING: if c.nilValue { @@ -315,9 +363,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv []byte + return ydbval, &dv } var dv *[]byte + return ydbval, &dv } v := make([]byte, 16) @@ -331,8 +381,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := v if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_UTF8: v := strconv.FormatUint(uint64(rv), 10) @@ -343,8 +395,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_YSON: if c.nilValue { @@ -353,9 +407,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv []byte + return ydbval, &dv } var dv *[]byte + return ydbval, &dv } v := strconv.FormatUint(uint64(rv), 10) @@ -367,8 +423,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := []byte(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_JSON: v := strconv.FormatUint(uint64(rv), 10) @@ -379,13 +437,16 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.ydbvalue { vp := types.JSONValue(v) + return ydbval, &vp } src := []byte(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_UUID: if c.nilValue { @@ -394,9 +455,11 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.testDefault { var dv [16]byte + return ydbval, &dv } var dv *[16]byte + return ydbval, &dv } v := [16]byte{} @@ -410,8 +473,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v case Ydb.Type_JSON_DOCUMENT: v := strconv.FormatUint(uint64(rv), 10) @@ -423,8 +488,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) src := []byte(v) if c.optional && !c.testDefault { vp := &src + return ydbval, &vp } + return ydbval, &src case Ydb.Type_DYNUMBER: v := strconv.FormatUint(uint64(rv), 10) @@ -435,8 +502,10 @@ func valueFromPrimitiveTypeID(c *column, r xrand.Rand) (*Ydb.Value, interface{}) } if c.optional && !c.testDefault { vp := &v + return ydbval, &vp } + return ydbval, &v default: panic("ydb: unexpected types") @@ -484,6 +553,7 @@ func getResultSet(count int, col []*column) (result *Ydb.ResultSet, testValues [ }) testValues[i] = vals } + return result, testValues } @@ -499,6 +569,7 @@ func TestScanSqlTypes(t *testing.T) { for _, v := range test.values { values = append(values, v) } + return values }()...); err != nil { t.Fatalf("test: %s; error: %s", test.name, err) @@ -527,6 +598,7 @@ func TestScanNamed(t *testing.T) { if columns == nil { return defaultValue } + return columns[i] } for _, test := range scannerData { @@ -602,6 +674,7 @@ type jsonUnmarshaller struct { func (json *jsonUnmarshaller) UnmarshalJSON(bytes []byte) error { json.bytes = bytes + return nil } diff --git a/internal/table/scanner/stats.go b/internal/table/scanner/stats.go index cfe3295aa..250205c5b 100644 --- a/internal/table/scanner/stats.go +++ b/internal/table/scanner/stats.go @@ -23,6 +23,7 @@ func (s *queryStats) Compilation() (c *stats.CompilationStats) { if s.stats == nil || s.stats.Compilation == nil { return nil } + return &stats.CompilationStats{ FromCache: s.stats.Compilation.FromCache, Duration: time.Microsecond * time.Duration(s.stats.Compilation.DurationUs), @@ -57,6 +58,7 @@ func (s *queryStats) NextPhase() (p stats.QueryPhase, ok bool) { return } s.pos++ + return &queryPhase{ tables: x.TableAccess, pos: 0, @@ -87,6 +89,7 @@ func (q *queryPhase) NextTableAccess() (t *stats.TableAccess, ok bool) { } x := q.tables[q.pos] q.pos++ + return &stats.TableAccess{ Name: x.Name, Reads: initOperationStats(x.Reads), @@ -115,6 +118,7 @@ func initOperationStats(x *Ydb_TableStats.OperationStats) stats.OperationStats { if x == nil { return stats.OperationStats{} } + return stats.OperationStats{ Rows: x.Rows, Bytes: x.Bytes, diff --git a/internal/table/session.go b/internal/table/session.go index 045ebc00d..7c904b247 100644 --- a/internal/table/session.go +++ b/internal/table/session.go @@ -70,6 +70,7 @@ func nodeID(sessionID string) (uint32, error) { if err != nil { return 0, err } + return uint32(id), err } @@ -85,6 +86,7 @@ func (s *session) NodeID() uint32 { return 0 } s.nodeID.Store(id) + return id } @@ -94,6 +96,7 @@ func (s *session) Status() table.SessionStatus { } s.statusMtx.RLock() defer s.statusMtx.RUnlock() + return s.status } @@ -166,6 +169,7 @@ func (s *session) ID() string { if s == nil { return "" } + return s.id } @@ -262,6 +266,7 @@ func (s *session) KeepAlive(ctx context.Context) (err error) { case Ydb_Table.KeepAliveResult_SESSION_STATUS_BUSY: s.SetStatus(table.SessionBusy) } + return nil } @@ -294,6 +299,7 @@ func (s *session) CreateTable( if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -472,6 +478,7 @@ func (s *session) DropTable( } } _, err = s.tableService.DropTable(ctx, &request) + return xerrors.WithStackTrace(err) } @@ -510,6 +517,7 @@ func (s *session) AlterTable( } } _, err = s.tableService.AlterTable(ctx, &request) + return xerrors.WithStackTrace(err) } @@ -539,6 +547,7 @@ func (s *session) CopyTable( if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -575,6 +584,7 @@ func copyTables( if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -587,6 +597,7 @@ func (s *session) CopyTables( if err != nil { return xerrors.WithStackTrace(err) } + return nil } @@ -770,6 +781,7 @@ func (s *session) executeQueryResult( tx.state.Store(txStateInitialized) tx.control = table.TxControl(table.WithTxID(tx.id)) } + return tx, scanner.NewUnary( res.GetResultSets(), res.GetQueryStats(), @@ -825,6 +837,7 @@ func (s *session) ExecuteSchemeQuery( } } _, err = s.tableService.ExecuteSchemeQuery(ctx, &request) + return xerrors.WithStackTrace(err) } @@ -1001,6 +1014,7 @@ func (s *session) StreamReadTable( stream, err = s.tableService.StreamReadTable(ctx, &request) if err != nil { cancel() + return nil, xerrors.WithStackTrace(err) } @@ -1023,12 +1037,14 @@ func (s *session) StreamReadTable( if result == nil || err != nil { return nil, nil, xerrors.WithStackTrace(err) } + return result.GetResultSet(), nil, nil } }, func(err error) error { cancel() onIntermediate(xerrors.HideEOF(err))(xerrors.HideEOF(err)) + return err }, scanner.WithIgnoreTruncated(true), // stream read table always returns truncated flag on last result set @@ -1125,6 +1141,7 @@ func (s *session) StreamExecuteScanQuery( stream, err = s.tableService.StreamExecuteScanQuery(ctx, &request, callOptions...) if err != nil { cancel() + return nil, xerrors.WithStackTrace(err) } @@ -1147,12 +1164,14 @@ func (s *session) StreamExecuteScanQuery( if result == nil || err != nil { return nil, nil, xerrors.WithStackTrace(err) } + return result.GetResultSet(), result.GetQueryStats(), nil } }, func(err error) error { cancel() onIntermediate(xerrors.HideEOF(err))(xerrors.HideEOF(err)) + return err }, scanner.WithIgnoreTruncated(s.config.IgnoreTruncated()), @@ -1246,5 +1265,6 @@ func (s *session) BeginTransaction( control: table.TxControl(table.WithTxID(result.GetTxMeta().GetId())), } tx.state.Store(txStateInitialized) + return tx, nil } diff --git a/internal/table/session_test.go b/internal/table/session_test.go index d841c5fd4..cd581a9fd 100644 --- a/internal/table/session_test.go +++ b/internal/table/session_test.go @@ -106,6 +106,7 @@ func TestSessionDescribeTable(t *testing.T) { testutil.TableDescribeTable: func(interface{}) (proto.Message, error) { r := &Ydb_Table.DescribeTableResult{} proto.Merge(r, result) + return r, e }, }, @@ -466,6 +467,7 @@ func TestCreateTableRegression(t *testing.T) { //nolint:revive return nil, fmt.Errorf("proto's not equal: \n\nact: %v\n\nexp: %s\n\n", act, exp) } + return &Ydb_Table.CreateTableResponse{}, nil }, }, @@ -577,6 +579,7 @@ func TestDescribeTableRegression(t *testing.T) { err = client.Do(ctx, func(ctx context.Context, s table.Session) (err error) { act, err = s.DescribeTable(ctx, "episodes") + return err }) @@ -637,6 +640,7 @@ func (mock *copyTablesMock) CopyTables( if in.String() == mock.String() { return &Ydb_Table.CopyTablesResponse{}, nil } + return nil, fmt.Errorf("%w: %s, exp: %s", errUnexpectedRequest, in, mock.String()) } diff --git a/internal/table/statement.go b/internal/table/statement.go index e59f07b5a..d0cf27c54 100644 --- a/internal/table/statement.go +++ b/internal/table/statement.go @@ -84,6 +84,7 @@ func (s *statement) execute( if err != nil { return nil, nil, xerrors.WithStackTrace(err) } + return s.session.executeQueryResult(res, txControl, request.IgnoreTruncated) } diff --git a/internal/table/transaction_test.go b/internal/table/transaction_test.go index c08d19e25..cc4e88489 100644 --- a/internal/table/transaction_test.go +++ b/internal/table/transaction_test.go @@ -31,6 +31,7 @@ func TestTxSkipRollbackForCommitted(t *testing.T) { t.Fatalf("cannot cast request '%T' to *Ydb_Table.BeginTransactionRequest", request) } begin++ + return &Ydb_Table.BeginTransactionResult{ TxMeta: &Ydb_Table.TransactionMeta{ Id: "", @@ -43,6 +44,7 @@ func TestTxSkipRollbackForCommitted(t *testing.T) { t.Fatalf("cannot cast request '%T' to *Ydb_Table.CommitTransactionRequest", request) } commit++ + return &Ydb_Table.CommitTransactionResult{}, nil }, testutil.TableRollbackTransaction: func(request interface{}) (proto.Message, error) { @@ -51,6 +53,7 @@ func TestTxSkipRollbackForCommitted(t *testing.T) { t.Fatalf("cannot cast request '%T' to *Ydb_Table.RollbackTransactionRequest", request) } rollback++ + return &Ydb_Table.RollbackTransactionResponse{ Operation: &Ydb_Operations.Operation{ Ready: true, diff --git a/internal/table/ttl.go b/internal/table/ttl.go index c734847d9..a91e9729f 100644 --- a/internal/table/ttl.go +++ b/internal/table/ttl.go @@ -26,6 +26,7 @@ func NewTimeToLiveSettings(settings *Ydb_Table.TtlSettings) *options.TimeToLiveS Mode: options.TimeToLiveModeValueSinceUnixEpoch, } } + return nil } @@ -45,5 +46,6 @@ func timeToLiveUnit(unit Ydb_Table.ValueSinceUnixEpochModeSettings_Unit) *option default: panic("ydb: unknown Ydb unit for value since epoch") } + return &res } diff --git a/internal/topic/retriable_error.go b/internal/topic/retriable_error.go index 43cf81a0c..23ef3c49c 100644 --- a/internal/topic/retriable_error.go +++ b/internal/topic/retriable_error.go @@ -49,6 +49,7 @@ func CheckResetReconnectionCounters(lastTry, now time.Time, connectionTimeout ti if connectionTimeout == value.InfiniteDuration { return now.Sub(lastTry) > connectionEstablishedTimeout } + return now.Sub(lastTry) > connectionTimeout*resetAttemptEmpiricalCoefficient } diff --git a/internal/topic/topicclientinternal/client.go b/internal/topic/topicclientinternal/client.go index d774a30fb..a023b1471 100644 --- a/internal/topic/topicclientinternal/client.go +++ b/internal/topic/topicclientinternal/client.go @@ -57,6 +57,7 @@ func newTopicConfig(opts ...topicoptions.TopicOption) topic.Config { o(&c) } } + return c } @@ -78,6 +79,7 @@ func (c *Client) Alter(ctx context.Context, path string, opts ...topicoptions.Al call := func(ctx context.Context) error { _, alterErr := c.rawClient.AlterTopic(ctx, req) + return alterErr } @@ -109,6 +111,7 @@ func (c *Client) Create( call := func(ctx context.Context) error { _, createErr := c.rawClient.CreateTopic(ctx, req) + return createErr } @@ -143,6 +146,7 @@ func (c *Client) Describe( call := func(ctx context.Context) (describeErr error) { rawRes, describeErr = c.rawClient.DescribeTopic(ctx, req) + return describeErr } @@ -162,6 +166,7 @@ func (c *Client) Describe( } res.FromRaw(&rawRes) + return res, nil } @@ -179,6 +184,7 @@ func (c *Client) Drop(ctx context.Context, path string, opts ...topicoptions.Dro call := func(ctx context.Context) error { _, removeErr := c.rawClient.DropTopic(ctx, req) + return removeErr } @@ -215,6 +221,7 @@ func (c *Client) StartReader( internalReader := topicreaderinternal.NewReader(connector, consumer, readSelectors, opts...) trace.TopicOnReaderStart(internalReader.Tracer(), internalReader.ID(), consumer) + return topicreader.NewReader(internalReader), nil } @@ -240,5 +247,6 @@ func (c *Client) StartWriter(topicPath string, opts ...topicoptions.WriterOption if err != nil { return nil, err } + return topicwriter.NewWriter(writer), nil } diff --git a/internal/topic/topicreaderinternal/batch.go b/internal/topic/topicreaderinternal/batch.go index 14283d0fe..e8e00ad01 100644 --- a/internal/topic/topicreaderinternal/batch.go +++ b/internal/topic/topicreaderinternal/batch.go @@ -143,6 +143,7 @@ func (m *PublicBatch) append(b *PublicBatch) (*PublicBatch, error) { res.Messages = append(res.Messages, b.Messages...) res.commitRange.commitOffsetEnd = b.commitRange.commitOffsetEnd + return res, nil } @@ -157,6 +158,7 @@ func (m *PublicBatch) cutMessages(count int) (head, rest *PublicBatch) { // explicit 0 need for prevent typos, when type slice[count:count] instead of slice[:count:count] head, _ = newBatch(m.commitRange.partitionSession, m.Messages[0:count:count]) rest, _ = newBatch(m.commitRange.partitionSession, m.Messages[count:]) + return head, rest } } @@ -175,9 +177,11 @@ func splitBytesByMessagesInBatches(batches []*PublicBatch, totalBytesCount int) case want >= restBytes: res := restBytes restBytes = 0 + return res default: restBytes -= want + return want } } diff --git a/internal/topic/topicreaderinternal/batcher.go b/internal/topic/topicreaderinternal/batcher.go index 1d6b7ee27..deebbb209 100644 --- a/internal/topic/topicreaderinternal/batcher.go +++ b/internal/topic/topicreaderinternal/batcher.go @@ -46,6 +46,7 @@ func (b *batcher) Close(err error) error { b.closed = true b.closeErr = err close(b.closeChan) + return nil } @@ -126,6 +127,7 @@ func (o batcherGetOptions) cutBatchItemsHead(items batcherMessageOrderItems) ( head = newBatcherItemBatch(batchHead) rest = items.ReplaceHeadItem(newBatcherItemBatch(batchRest)) + return head, rest, true } @@ -146,6 +148,7 @@ func (o batcherGetOptions) splitBatch(batch *PublicBatch) (head, rest *PublicBat } head, rest = batch.cutMessages(o.MaxCount) + return head, rest, true } @@ -174,6 +177,7 @@ func (b *batcher) Pop(ctx context.Context, opts batcherGetOptions) (_ batcherMes findRes = b.findNeedLock(opts) if findRes.Ok { b.applyNeedLock(findRes) + return } }) @@ -271,6 +275,7 @@ func (b *batcher) applyForceFlagToOptions(options batcherGetOptions) batcherGetO res := options res.MinCount = 1 + return res } @@ -310,6 +315,7 @@ func (items batcherMessageOrderItems) Append(item batcherMessageOrderItem) (batc } else { return nil, err } + return items, nil } @@ -328,6 +334,7 @@ func (items batcherMessageOrderItems) ReplaceHeadItem(item batcherMessageOrderIt res := make(batcherMessageOrderItems, len(items)) res[0] = item copy(res[1:], items[1:]) + return res } diff --git a/internal/topic/topicreaderinternal/batcher_test.go b/internal/topic/topicreaderinternal/batcher_test.go index e048ef9f2..83ebd4d08 100644 --- a/internal/topic/topicreaderinternal/batcher_test.go +++ b/internal/topic/topicreaderinternal/batcher_test.go @@ -502,5 +502,6 @@ func mustNewBatch(session *partitionSession, messages []*PublicMessage) *PublicB if err != nil { panic(err) } + return batch } diff --git a/internal/topic/topicreaderinternal/commit_range.go b/internal/topic/topicreaderinternal/commit_range.go index 0f1554780..c744cd49b 100644 --- a/internal/topic/topicreaderinternal/commit_range.go +++ b/internal/topic/topicreaderinternal/commit_range.go @@ -32,6 +32,7 @@ func (r *CommitRanges) GetCommitsInfo() []trace.TopicReaderStreamCommitInfo { EndOffset: r.ranges[i].commitOffsetEnd.ToInt64(), } } + return res } @@ -45,6 +46,7 @@ func NewCommitRangesFromPublicCommits(ranges []PublicCommitRange) CommitRanges { for i := 0; i < len(res.ranges); i++ { res.ranges[i] = ranges[i].priv } + return res } @@ -84,6 +86,7 @@ func (r *CommitRanges) toPartitionsOffsets() []rawtopicreader.PartitionCommitOff } r.optimize() + return r.toRawPartitionCommitOffset() } @@ -149,6 +152,7 @@ func (r *CommitRanges) toRawPartitionCommitOffset() []rawtopicreader.PartitionCo } partition.Offsets = append(partition.Offsets, offsetsRange) } + return partitionOffsets } diff --git a/internal/topic/topicreaderinternal/commit_range_test.go b/internal/topic/topicreaderinternal/commit_range_test.go index d0d95cb60..2ba8e1e02 100644 --- a/internal/topic/topicreaderinternal/commit_range_test.go +++ b/internal/topic/topicreaderinternal/commit_range_test.go @@ -284,5 +284,6 @@ func TestCommitsToRawPartitionCommitOffset(t *testing.T) { func testNewCommitRanges(commitable ...PublicCommitRangeGetter) *CommitRanges { var res CommitRanges res.Append(commitable...) + return &res } diff --git a/internal/topic/topicreaderinternal/committer.go b/internal/topic/topicreaderinternal/committer.go index 4f614ce14..c3f22849f 100644 --- a/internal/topic/topicreaderinternal/committer.go +++ b/internal/topic/topicreaderinternal/committer.go @@ -62,6 +62,7 @@ func newCommitter(tracer *trace.Topic, lifeContext context.Context, mode PublicC } res.initChannels() res.start() + return res } @@ -100,6 +101,7 @@ func (c *committer) pushCommit(commitRange commitRange) (commitWaiter, error) { c.m.WithLock(func() { if err := c.backgroundWorker.Context().Err(); err != nil { resErr = err + return } @@ -170,6 +172,7 @@ func (c *committer) waitSendTrigger(ctx context.Context) { case <-ctxDone: case <-finish: } + return } @@ -260,6 +263,7 @@ var commitWaiterLastID int64 func newCommitWaiter(session *partitionSession, endOffset rawtopicreader.Offset) commitWaiter { id := atomic.AddInt64(&commitWaiterLastID, 1) + return commitWaiter{ ID: id, Session: session, @@ -272,5 +276,6 @@ func sendCommitMessage(send sendMessageToServerFunc, batch CommitRanges) error { req := &rawtopicreader.CommitOffsetRequest{ CommitOffsets: batch.toPartitionsOffsets(), } + return send(req) } diff --git a/internal/topic/topicreaderinternal/committer_test.go b/internal/topic/topicreaderinternal/committer_test.go index b9545fe1e..7bf444d62 100644 --- a/internal/topic/topicreaderinternal/committer_test.go +++ b/internal/topic/topicreaderinternal/committer_test.go @@ -23,6 +23,7 @@ func TestCommitterCommit(t *testing.T) { c := newTestCommitter(ctx, t) c.send = func(msg rawtopicreader.ClientMessage) error { t.Fatalf("must not call") + return nil } @@ -65,6 +66,7 @@ func TestCommitterCommitAsync(t *testing.T) { CommitOffsets: testNewCommitRanges(&cRange).toPartitionsOffsets(), }, msg) + return nil } require.NoError(t, c.Commit(ctx, cRange)) @@ -97,6 +99,7 @@ func TestCommitterCommitSync(t *testing.T) { }, msg) c.OnCommitNotify(session, cRange.commitOffsetEnd) + return nil } require.NoError(t, c.Commit(ctx, cRange)) @@ -121,6 +124,7 @@ func TestCommitterCommitSync(t *testing.T) { c.mode = CommitModeSync c.send = func(msg rawtopicreader.ClientMessage) error { close(commitSended) + return nil } @@ -201,6 +205,7 @@ func TestCommitterBuffer(t *testing.T) { c.clock = clock c.send = func(msg rawtopicreader.ClientMessage) error { close(sendCalled) + return nil } @@ -229,6 +234,7 @@ func TestCommitterBuffer(t *testing.T) { commitMess := msg.(*rawtopicreader.CommitOffsetRequest) require.Len(t, commitMess.CommitOffsets, 2) close(sendCalled) + return nil } @@ -261,6 +267,7 @@ func TestCommitterBuffer(t *testing.T) { commitMess := msg.(*rawtopicreader.CommitOffsetRequest) require.Len(t, commitMess.CommitOffsets, 4) close(sendCalled) + return nil } c.commits.appendCommitRanges([]commitRange{ @@ -295,6 +302,7 @@ func TestCommitterBuffer(t *testing.T) { commitMess := msg.(*rawtopicreader.CommitOffsetRequest) require.Len(t, commitMess.CommitOffsets, 4) close(sendCalled) + return nil } @@ -330,6 +338,7 @@ func TestCommitterBuffer(t *testing.T) { sendCalled := make(empty.Chan) c.send = func(msg rawtopicreader.ClientMessage) error { close(sendCalled) + return nil } _, err := c.pushCommit(commitRange{partitionSession: &partitionSession{}}) @@ -344,6 +353,7 @@ func TestCommitterBuffer(t *testing.T) { c := newTestCommitter(ctx, t) c.send = func(msg rawtopicreader.ClientMessage) error { t.Fatal() + return nil } c.commitLoopSignal <- empty.Struct{} // to buffer @@ -357,6 +367,7 @@ func TestCommitterBuffer(t *testing.T) { sendCalled := false c.send = func(msg rawtopicreader.ClientMessage) error { sendCalled = true + return nil } c.commits.appendCommitRange(commitRange{partitionSession: &partitionSession{}}) @@ -374,5 +385,6 @@ func newTestCommitter(ctx context.Context, t testing.TB) *committer { require.ErrorIs(t, err, background.ErrAlreadyClosed) } }) + return res } diff --git a/internal/topic/topicreaderinternal/decoders.go b/internal/topic/topicreaderinternal/decoders.go index 21456e97f..a4598192c 100644 --- a/internal/topic/topicreaderinternal/decoders.go +++ b/internal/topic/topicreaderinternal/decoders.go @@ -34,6 +34,7 @@ func (m *decoderMap) Decode(codec rawtopiccommon.Codec, input io.Reader) (io.Rea if f := m.m[codec]; f != nil { return f(input) } + return nil, xerrors.WithStackTrace(xerrors.Wrap( fmt.Errorf("ydb: failed decompress message with codec %v: %w", codec, PublicErrUnexpectedCodec), )) diff --git a/internal/topic/topicreaderinternal/message.go b/internal/topic/topicreaderinternal/message.go index 57aa89c5a..fd37be761 100644 --- a/internal/topic/topicreaderinternal/message.go +++ b/internal/topic/topicreaderinternal/message.go @@ -63,6 +63,7 @@ func (m *PublicMessage) UnmarshalTo(dst PublicMessageContentUnmarshaler) error { } m.dataConsumed = true + return callbackOnReaderContent(globalReadMessagePool, m, m.UncompressedSize, dst) } @@ -71,6 +72,7 @@ func (m *PublicMessage) UnmarshalTo(dst PublicMessageContentUnmarshaler) error { // return topicreader.UnexpectedCodec if message compressed with unknown codec func (m *PublicMessage) Read(p []byte) (n int, err error) { m.dataConsumed = true + return m.data.Read(p) } @@ -108,6 +110,7 @@ type PublicMessageBuilder struct { func NewPublicMessageBuilder() *PublicMessageBuilder { res := &PublicMessageBuilder{} res.initMessage() + return res } @@ -128,12 +131,14 @@ func (pmb *PublicMessageBuilder) initMessage() { // Seqno set message Seqno func (pmb *PublicMessageBuilder) Seqno(seqNo int64) *PublicMessageBuilder { pmb.mess.SeqNo = seqNo + return pmb } // CreatedAt set message CreatedAt func (pmb *PublicMessageBuilder) CreatedAt(createdAt time.Time) *PublicMessageBuilder { pmb.mess.CreatedAt = createdAt + return pmb } @@ -142,36 +147,42 @@ func (pmb *PublicMessageBuilder) Metadata(metadata map[string][]byte) *PublicMes for key, val := range metadata { pmb.mess.Metadata[key] = xbytes.Clone(val) } + return pmb } // MessageGroupID set message MessageGroupID func (pmb *PublicMessageBuilder) MessageGroupID(messageGroupID string) *PublicMessageBuilder { pmb.mess.MessageGroupID = messageGroupID + return pmb } // WriteSessionMetadata set message WriteSessionMetadata func (pmb *PublicMessageBuilder) WriteSessionMetadata(writeSessionMetadata map[string]string) *PublicMessageBuilder { pmb.mess.WriteSessionMetadata = writeSessionMetadata + return pmb } // Offset set message Offset func (pmb *PublicMessageBuilder) Offset(offset int64) *PublicMessageBuilder { pmb.mess.Offset = offset + return pmb } // WrittenAt set message WrittenAt func (pmb *PublicMessageBuilder) WrittenAt(writtenAt time.Time) *PublicMessageBuilder { pmb.mess.WrittenAt = writtenAt + return pmb } // ProducerID set message ProducerID func (pmb *PublicMessageBuilder) ProducerID(producerID string) *PublicMessageBuilder { pmb.mess.ProducerID = producerID + return pmb } @@ -183,12 +194,14 @@ func (pmb *PublicMessageBuilder) DataAndUncompressedSize(data []byte) *PublicMes pmb.mess.dataConsumed = false pmb.mess.rawDataLen = len(copyData) pmb.mess.UncompressedSize = len(copyData) + return pmb } // UncompressedSize set message UncompressedSize func (pmb *PublicMessageBuilder) UncompressedSize(uncompressedSize int) *PublicMessageBuilder { pmb.mess.UncompressedSize = uncompressedSize + return pmb } @@ -211,5 +224,6 @@ func (pmb *PublicMessageBuilder) PartitionID(partitionID int64) { func (pmb *PublicMessageBuilder) Build() *PublicMessage { mess := pmb.mess pmb.initMessage() + return mess } diff --git a/internal/topic/topicreaderinternal/message_content_pool.go b/internal/topic/topicreaderinternal/message_content_pool.go index 5554cf17b..73b561cae 100644 --- a/internal/topic/topicreaderinternal/message_content_pool.go +++ b/internal/topic/topicreaderinternal/message_content_pool.go @@ -63,5 +63,6 @@ func callbackOnReaderContent( if err := consumer.UnmarshalYDBTopicMessage(buf.Bytes()); err != nil { return xerrors.WithStackTrace(fmt.Errorf("ydb: error unmarshal data: %w", err)) } + return nil } diff --git a/internal/topic/topicreaderinternal/message_content_pool_test.go b/internal/topic/topicreaderinternal/message_content_pool_test.go index 63b13df97..60a6477f5 100644 --- a/internal/topic/topicreaderinternal/message_content_pool_test.go +++ b/internal/topic/topicreaderinternal/message_content_pool_test.go @@ -48,6 +48,7 @@ func TestCallbackOnReaderContent(t *testing.T) { err := callbackOnReaderContent(p, newReader(), 0, testFuncConsumer(func(data []byte) error { called = true require.Equal(t, expectedData, data) + return nil })) require.NoError(t, err) @@ -76,6 +77,7 @@ func TestCallbackOnReaderContent(t *testing.T) { // first call with empty reader - for check internal capacity without reallocation _ = callbackOnReaderContent(p, ErrReader(io.EOF), estimatedSize, testFuncConsumer(func(data []byte) error { require.Empty(t, data) + return nil })) @@ -84,6 +86,7 @@ func TestCallbackOnReaderContent(t *testing.T) { err := callbackOnReaderContent(p, newReader(), estimatedSize, testFuncConsumer(func(data []byte) error { require.Equal(t, expectedData, data) called = true + return nil })) require.NoError(t, err) @@ -103,6 +106,7 @@ func TestCallbackOnReaderContent(t *testing.T) { err := callbackOnReaderContent(p, newReader(), maxInitialBufferSize+10, testFuncConsumer(func(data []byte) error { require.Equal(t, expectedData, data) called = true + return nil })) require.NoError(t, err) @@ -121,6 +125,7 @@ func TestCallbackOnReaderContent(t *testing.T) { err := callbackOnReaderContent(p, newReader(), 0, testFuncConsumer(func(data []byte) error { require.Equal(t, expectedData, data) called = true + return nil })) require.NoError(t, err) diff --git a/internal/topic/topicreaderinternal/partition_session.go b/internal/topic/topicreaderinternal/partition_session.go index 9eca843bb..215caec44 100644 --- a/internal/topic/topicreaderinternal/partition_session.go +++ b/internal/topic/topicreaderinternal/partition_session.go @@ -54,6 +54,7 @@ func newPartitionSession( } res.committedOffsetVal.Store(committedOffset.ToInt64()) res.lastReceivedOffsetEndVal.Store(committedOffset.ToInt64() - 1) + return res } @@ -70,6 +71,7 @@ func (s *partitionSession) committedOffset() rawtopicreader.Offset { var res rawtopicreader.Offset res.FromInt64(v) + return res } @@ -82,6 +84,7 @@ func (s *partitionSession) lastReceivedMessageOffset() rawtopicreader.Offset { var res rawtopicreader.Offset res.FromInt64(v) + return res } @@ -112,6 +115,7 @@ func (c *partitionSessionStorage) Add(session *partitionSession) error { return xerrors.WithStackTrace(fmt.Errorf("session id already existed: %v", session.partitionSessionID)) } c.sessions[session.partitionSessionID] = &sessionInfo{Session: session} + return nil } @@ -135,6 +139,7 @@ func (c *partitionSessionStorage) Remove(id partitionSessionID) (*partitionSessi c.removeIndex++ if partitionInfo, ok := c.sessions[id]; ok { partitionInfo.RemoveTime = now + return partitionInfo.Session, nil } diff --git a/internal/topic/topicreaderinternal/reader.go b/internal/topic/topicreaderinternal/reader.go index 31144d6fc..030a5ca4b 100644 --- a/internal/topic/topicreaderinternal/reader.go +++ b/internal/topic/topicreaderinternal/reader.go @@ -73,6 +73,7 @@ type readExplicitMessagesCount int func (count readExplicitMessagesCount) Apply(options ReadMessageBatchOptions) ReadMessageBatchOptions { options.MinCount = int(count) options.MaxCount = int(count) + return options } @@ -276,5 +277,6 @@ type PublicReadSelector struct { // Clone create deep clone of the selector func (s PublicReadSelector) Clone() *PublicReadSelector { //nolint:gocritic s.Partitions = clone.Int64Slice(s.Partitions) + return &s } diff --git a/internal/topic/topicreaderinternal/reader_test.go b/internal/topic/topicreaderinternal/reader_test.go index 56f7e1de9..4b73a9559 100644 --- a/internal/topic/topicreaderinternal/reader_test.go +++ b/internal/topic/topicreaderinternal/reader_test.go @@ -62,6 +62,7 @@ func TestReader_Close(t *testing.T) { callCompleted: make(empty.Chan), } allStates = append(allStates, state) + return state } diff --git a/internal/topic/topicreaderinternal/stream_reader_impl.go b/internal/topic/topicreaderinternal/stream_reader_impl.go index b85899040..a77bf4fb3 100644 --- a/internal/topic/topicreaderinternal/stream_reader_impl.go +++ b/internal/topic/topicreaderinternal/stream_reader_impl.go @@ -160,6 +160,7 @@ func newTopicStreamReaderStopped( res.committer.BufferCountTrigger = cfg.CommitterBatchCounterTrigger res.sessionController.init() res.freeBytes <- cfg.BufferSizeProtoBytes + return res } @@ -167,6 +168,7 @@ func (r *topicStreamReaderImpl) WaitInit(_ context.Context) error { if !r.started { return errors.New("not started: can be started only after initialize from constructor") } + return nil } @@ -263,6 +265,7 @@ func (r *topicStreamReaderImpl) consumeRawMessageFromBuffer(ctx context.Context) case *rawtopicreader.StartPartitionSessionRequest: if err := r.onStartPartitionSessionRequestFromBuffer(m); err != nil { _ = r.CloseWithError(ctx, err) + return } case *rawtopicreader.StopPartitionSessionRequest: @@ -270,6 +273,7 @@ func (r *topicStreamReaderImpl) consumeRawMessageFromBuffer(ctx context.Context) _ = r.CloseWithError(ctx, xerrors.WithStackTrace( fmt.Errorf("ydb: unexpected error on stop partition handler: %w", err), )) + return } case *rawtopicreader.PartitionSessionStatusResponse: @@ -366,6 +370,7 @@ func (r *topicStreamReaderImpl) Commit(ctx context.Context, commitRange commitRa if err = r.checkCommitRange(commitRange); err != nil { return err } + return r.committer.Commit(ctx, commitRange) } @@ -400,6 +405,7 @@ func (r *topicStreamReaderImpl) send(msg rawtopicreader.ClientMessage) error { trace.TopicOnReaderError(r.cfg.Trace, r.readConnectionID, err) _ = r.CloseWithError(r.ctx, err) } + return err } @@ -426,6 +432,7 @@ func (r *topicStreamReaderImpl) setStarted() error { } r.started = true + return nil } @@ -465,6 +472,7 @@ func (r *topicStreamReaderImpl) addRestBufferBytes(delta int) int { if val <= 0 { r.batcher.IgnoreMinRestrictionsOnNextPop() } + return int(val) } @@ -487,6 +495,7 @@ func (r *topicStreamReaderImpl) readMessagesLoop(ctx context.Context) { continue } _ = r.CloseWithError(ctx, err) + return } @@ -507,16 +516,19 @@ func (r *topicStreamReaderImpl) readMessagesLoop(ctx context.Context) { case *rawtopicreader.StartPartitionSessionRequest: if err = r.onStartPartitionSessionRequest(m); err != nil { _ = r.CloseWithError(ctx, err) + return } case *rawtopicreader.StopPartitionSessionRequest: if err = r.onStopPartitionSessionRequest(m); err != nil { _ = r.CloseWithError(ctx, err) + return } case *rawtopicreader.CommitOffsetResponse: if err = r.onCommitResponse(m); err != nil { _ = r.CloseWithError(ctx, err) + return } @@ -546,6 +558,7 @@ func (r *topicStreamReaderImpl) dataRequestLoop(ctx context.Context) { select { case <-doneChan: _ = r.CloseWithError(ctx, r.ctx.Err()) + return case free := <-r.freeBytes: @@ -686,6 +699,7 @@ func (r *topicStreamReaderImpl) CloseWithError(ctx context.Context, reason error if closeErr == nil { closeErr = bgCloseErr } + return closeErr } @@ -741,6 +755,7 @@ func (r *topicStreamReaderImpl) onStartPartitionSessionRequest(m *rawtopicreader if err := r.sessionController.Add(session); err != nil { return err } + return r.batcher.PushRawMessage(session, m) } diff --git a/internal/topic/topicreaderinternal/stream_reader_impl_test.go b/internal/topic/topicreaderinternal/stream_reader_impl_test.go index 4cf05a21c..a518c2058 100644 --- a/internal/topic/topicreaderinternal/stream_reader_impl_test.go +++ b/internal/topic/topicreaderinternal/stream_reader_impl_test.go @@ -391,6 +391,7 @@ func TestStreamReaderImpl_OnPartitionCloseHandle(t *testing.T) { require.NoError(t, info.PartitionContext.Err()) readMessagesCtxCancel() + return nil } @@ -434,6 +435,7 @@ func TestStreamReaderImpl_OnPartitionCloseHandle(t *testing.T) { require.Error(t, info.PartitionContext.Err()) readMessagesCtxCancel() + return nil } @@ -577,6 +579,7 @@ func TestTopicStreamReaderImpl_ReadMessages(t *testing.T) { _, err := writer.Write([]byte(msg)) require.NoError(t, writer.Close()) require.NoError(t, err) + return b.Bytes() } @@ -842,6 +845,7 @@ func TestTopicStreamReadImpl_BatchReaderWantMoreMessagesThenBufferCanHold(t *tes }, }, }) + return nextDataRequested } @@ -935,6 +939,7 @@ func TestTopicStreamReadImpl_CommitWithBadSession(t *testing.T) { sleep() require.False(t, e.reader.closed) + return commitErr } t.Run("CommitModeNone", func(t *testing.T) { @@ -1109,6 +1114,7 @@ readMessages: e.m.WithLock(func() { e.nextMessageNeedCallback = res.nextMessageCallback }) + return res.msg, res.err } } diff --git a/internal/topic/topicreaderinternal/stream_reconnector.go b/internal/topic/topicreaderinternal/stream_reconnector.go index 6bae747f0..fa3ba6594 100644 --- a/internal/topic/topicreaderinternal/stream_reconnector.go +++ b/internal/topic/topicreaderinternal/stream_reconnector.go @@ -115,6 +115,7 @@ func (r *readerReconnector) ReadMessageBatch(ctx context.Context, opts ReadMessa case r.isRetriableError(err): r.fireReconnectOnRetryableError(stream, err) runtime.Gosched() + continue case err != nil: return nil, err @@ -126,8 +127,10 @@ func (r *readerReconnector) ReadMessageBatch(ctx context.Context, opts ReadMessa if r.isRetriableError(err) { r.fireReconnectOnRetryableError(stream, err) runtime.Gosched() + continue } + return res, err } } @@ -140,6 +143,7 @@ func (r *readerReconnector) Commit(ctx context.Context, commitRange commitRange) err = stream.Commit(ctx, commitRange) r.fireReconnectOnRetryableError(stream, err) + return err } @@ -166,6 +170,7 @@ func (r *readerReconnector) CloseWithError(ctx context.Context, err error) error } }) }) + return closeErr } @@ -292,11 +297,13 @@ func (r *readerReconnector) reconnect(ctx context.Context, reason error, oldRead } } }) + return err } func (r *readerReconnector) isRetriableError(err error) bool { _, res := topic.CheckRetryMode(err, r.retrySettings, 0) + return res } @@ -341,6 +348,7 @@ func (r *readerReconnector) connectWithTimeout() (_ batchedStreamReader, err err if res.err == nil { return res.stream, nil } + return nil, res.err } @@ -383,6 +391,7 @@ func (r *readerReconnector) stream(ctx context.Context) (batchedStreamReader, er connectionChan = r.streamConnectionInProgress if r.closedErr != nil { err = r.closedErr + return } }) @@ -402,6 +411,7 @@ func (r *readerReconnector) stream(ctx context.Context) (batchedStreamReader, er err = r.streamErr }) r.fireReconnectOnRetryableError(reader, err) + return reader, err } } diff --git a/internal/topic/topicreaderinternal/stream_reconnector_test.go b/internal/topic/topicreaderinternal/stream_reconnector_test.go index 57b0f00dc..d9034066e 100644 --- a/internal/topic/topicreaderinternal/stream_reconnector_test.go +++ b/internal/topic/topicreaderinternal/stream_reconnector_test.go @@ -61,6 +61,7 @@ func TestTopicReaderReconnectorReadMessageBatch(t *testing.T) { if connectCalled > 1 { return nil, errors.New("unexpected call test connect function") } + return baseReader, nil }, streamErr: errUnconnected, @@ -103,6 +104,7 @@ func TestTopicReaderReconnectorReadMessageBatch(t *testing.T) { reader := &readerReconnector{ readerConnect: func(ctx context.Context) (batchedStreamReader, error) { connectCalled++ + return readers[connectCalled-1], nil }, streamErr: errUnconnected, @@ -218,6 +220,7 @@ func TestTopicReaderReconnectorConnectionLoop(t *testing.T) { { callback: func(ctx context.Context) (batchedStreamReader, error) { close(stream1Ready) + return newStream1, nil }, }, @@ -227,12 +230,14 @@ func TestTopicReaderReconnectorConnectionLoop(t *testing.T) { { callback: func(ctx context.Context) (batchedStreamReader, error) { close(stream2Ready) + return newStream2, nil }, }, { callback: func(ctx context.Context) (batchedStreamReader, error) { t.Fatal() + return nil, errors.New("unexpected call") }, }, @@ -288,10 +293,12 @@ func TestTopicReaderReconnectorStart(t *testing.T) { reconnector.readerConnect = readerConnectFuncMock([]readerConnectFuncAnswer{ {callback: func(ctx context.Context) (batchedStreamReader, error) { close(connectionRequested) + return stream, nil }}, {callback: func(ctx context.Context) (batchedStreamReader, error) { t.Error() + return nil, errors.New("unexpected call") }}, }...) @@ -345,6 +352,7 @@ func TestTopicReaderReconnectorWaitInit(t *testing.T) { reconnector.readerConnect = readerConnectFuncMock(readerConnectFuncAnswer{ callback: func(ctx context.Context) (batchedStreamReader, error) { cancel() + return stream, nil }, }) diff --git a/internal/topic/topicwriterinternal/encoders.go b/internal/topic/topicwriterinternal/encoders.go index 60eb3e2dc..7ae89d534 100644 --- a/internal/topic/topicwriterinternal/encoders.go +++ b/internal/topic/topicwriterinternal/encoders.go @@ -42,6 +42,7 @@ func (e *EncoderMap) CreateLazyEncodeWriter(codec rawtopiccommon.Codec, target i if encoderCreator, ok := e.m[codec]; ok { return encoderCreator(target) } + return nil, xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf("ydb: unexpected codec '%v' for encode message", codec))) } @@ -50,11 +51,13 @@ func (e *EncoderMap) GetSupportedCodecs() rawtopiccommon.SupportedCodecs { for codec := range e.m { res = append(res, codec) } + return res } func (e *EncoderMap) IsSupported(codec rawtopiccommon.Codec) bool { _, ok := e.m[codec] + return ok } @@ -122,6 +125,7 @@ func (s *EncoderSelector) CompressMessages(messages []messageWithDataContent) (r err = cacheMessages(messages, codec, s.parallelCompressors) onCompressDone(err) } + return codec, err } @@ -257,6 +261,7 @@ func cacheMessages(messages []messageWithDataContent, codec rawtopiccommon.Codec resErrMutex.WithLock(func() { resErr = localErr }) + return } } diff --git a/internal/topic/topicwriterinternal/message.go b/internal/topic/topicwriterinternal/message.go index 9b1088b95..e1590a20b 100644 --- a/internal/topic/topicwriterinternal/message.go +++ b/internal/topic/topicwriterinternal/message.go @@ -38,6 +38,7 @@ func (p PublicFuturePartitioning) ToRaw() rawtopicwriter.Partitioning { if p.hasPartitionID { return rawtopicwriter.NewPartitioningPartitionID(p.partitionID) } + return rawtopicwriter.NewPartitioningMessageGroup(p.messageGroupID) } @@ -97,6 +98,7 @@ func (m *messageWithDataContent) cacheMetadata() { func (m *messageWithDataContent) CacheMessageData(codec rawtopiccommon.Codec) error { m.cacheMetadata() _, err := m.GetEncodedBytes(codec) + return err } @@ -128,6 +130,7 @@ func (m *messageWithDataContent) encodeRawContent(codec rawtopiccommon.Codec) ([ } m.bufCodec = codec + return m.bufEncoded.Bytes(), nil } @@ -142,6 +145,7 @@ func (m *messageWithDataContent) readDataToRawBuf() error { m.BufUncompressedSize = int(writtenBytes) m.Data = nil } + return nil } @@ -173,6 +177,7 @@ func (m *messageWithDataContent) readDataToTargetCodec(codec rawtopiccommon.Code } m.BufUncompressedSize = int(bytesCount) m.Data = nil + return nil } @@ -188,6 +193,7 @@ func (m *messageWithDataContent) getRawBytes() ([]byte, error) { if err != nil { return nil, err } + return m.rawBuf.Bytes(), nil } @@ -204,6 +210,7 @@ func (m *messageWithDataContent) getEncodedBytes(codec rawtopiccommon.Codec) ([] if err != nil { return nil, err } + return m.bufEncoded.Bytes(), nil } } diff --git a/internal/topic/topicwriterinternal/queue.go b/internal/topic/topicwriterinternal/queue.go index ab5ff7e56..8e15833fc 100644 --- a/internal/topic/topicwriterinternal/queue.go +++ b/internal/topic/topicwriterinternal/queue.go @@ -57,6 +57,7 @@ func newMessageQueue() messageQueue { func (q *messageQueue) AddMessages(messages []messageWithDataContent) error { _, err := q.addMessages(messages, false) + return err } @@ -136,6 +137,7 @@ func (q *messageQueue) addMessageNeedLock( q.messagesByOrder[messageIndex] = mess q.seqNoToOrderID[mess.SeqNo] = messageIndex q.lastSeqNo = mess.SeqNo + return messageIndex } @@ -158,6 +160,7 @@ func (q *messageQueue) AcksReceived(acks []rawtopicwriter.WriteAck) error { } q.acksReceivedEvent.Broadcast() + return nil } @@ -169,6 +172,7 @@ func (q *messageQueue) ackReceivedNeedLock(seqNo int64) error { delete(q.seqNoToOrderID, seqNo) delete(q.messagesByOrder, orderID) + return nil } @@ -270,6 +274,7 @@ func (q *messageQueue) getMessagesForSendWithLock() []messageWithDataContent { res = append(res, msg) } } + return res } @@ -288,6 +293,7 @@ func (q *messageQueue) Wait(ctx context.Context, waiter MessageQueueAckWaiter) e checkMessageIndex := waiter.sequenseNumbers[0] if _, ok := q.messagesByOrder[checkMessageIndex]; ok { hasWaited = true + return } waiter.sequenseNumbers = waiter.sequenseNumbers[1:] diff --git a/internal/topic/topicwriterinternal/queue_test.go b/internal/topic/topicwriterinternal/queue_test.go index af2c26033..e39070d05 100644 --- a/internal/topic/topicwriterinternal/queue_test.go +++ b/internal/topic/topicwriterinternal/queue_test.go @@ -159,6 +159,7 @@ func TestMessageQueue_GetMessages(t *testing.T) { for _, mess := range messages { if lastReadSeqNo.Load()+1 != mess.SeqNo { fatalChan <- string(debug.Stack()) + return } lastReadSeqNo.Store(mess.SeqNo) @@ -491,5 +492,6 @@ func getSeqNumbers(messages []messageWithDataContent) []int64 { for i := range messages { res = append(res, messages[i].SeqNo) } + return res } diff --git a/internal/topic/topicwriterinternal/writer_reconnector.go b/internal/topic/topicwriterinternal/writer_reconnector.go index e048486ae..f4dfc8e71 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector.go +++ b/internal/topic/topicwriterinternal/writer_reconnector.go @@ -69,6 +69,7 @@ func (cfg *WriterReconnectorConfig) validate() error { cfg.producerID != cfg.defaultPartitioning.MessageGroupID { return xerrors.WithStackTrace(errProducerIDNotEqualMessageGroupID) } + return nil } @@ -139,6 +140,7 @@ func newWriterReconnector( ) *WriterReconnector { res := newWriterReconnectorStopped(cfg) res.start() + return res } @@ -288,6 +290,7 @@ func (w *WriterReconnector) checkMessages(messages []messageWithDataContent) err return xerrors.WithStackTrace(fmt.Errorf("message size bytes %v: %w", size, errLargeMessage)) } } + return nil } @@ -321,6 +324,7 @@ func (w *WriterReconnector) createMessagesWithContent(messages []PublicMessage) if err != nil { return nil, err } + return res, nil } @@ -339,6 +343,7 @@ func (w *WriterReconnector) close(ctx context.Context, reason error) (resErr err if resErr == nil { resErr = bgErr } + return resErr } @@ -388,6 +393,7 @@ func (w *WriterReconnector) connectionLoop(ctx context.Context) { } } else { _ = w.close(ctx, reconnectReason) + return } } @@ -424,11 +430,13 @@ func (w *WriterReconnector) startWriteStream(ctx, streamCtx context.Context, att } w.queue.ResetSentProgress() + return NewSingleStreamWriter(ctx, w.createWriterStreamConfig(stream)) } func (w *WriterReconnector) needReceiveLastSeqNo() bool { res := !w.firstConnectionHandled.Load() + return res } @@ -462,11 +470,13 @@ func (w *WriterReconnector) connectWithTimeout(streamLifetimeContext context.Con select { case <-timer.C: connectCancel() + return nil, xerrors.WithStackTrace(errConnTimeout) case res := <-resCh: // force no cancel connect context - because it will break stream // context will cancel by cancel streamLifetimeContext while reconnect or stop connection _ = connectCancel + return res.stream, res.err } } @@ -480,6 +490,7 @@ func (w *WriterReconnector) onWriterChange(writerStream *SingleStreamWriter) { w.m.WithLock(func() { if writerStream == nil { w.sessionID = "" + return } w.sessionID = writerStream.SessionID @@ -561,6 +572,7 @@ func (w *WriterReconnector) createWriterStreamConfig(stream RawTopicWriterStream w.needReceiveLastSeqNo(), w.writerInstanceID, ) + return cfg } @@ -581,6 +593,7 @@ func sendMessagesToStream( if err != nil { return xerrors.WithStackTrace(fmt.Errorf("ydb: failed send write request: %w", err)) } + return nil } @@ -614,6 +627,7 @@ func splitMessagesByBufCodec(messages []messageWithDataContent) (res [][]message } } res = append(res, messages[currentGroupStart:len(messages):len(messages)]) + return res } @@ -674,6 +688,7 @@ func calculateAllowedCodecs(forceCodec rawtopiccommon.Codec, encoderMap *Encoder if serverCodecs.AllowedByCodecsList(forceCodec) && encoderMap.IsSupported(forceCodec) { return rawtopiccommon.SupportedCodecs{forceCodec} } + return nil } @@ -692,6 +707,7 @@ func calculateAllowedCodecs(forceCodec rawtopiccommon.Codec, encoderMap *Encoder if len(res) == 0 { res = nil } + return res } @@ -702,5 +718,6 @@ func createPublicCodecsFromRaw(codecs rawtopiccommon.SupportedCodecs) []topictyp for i, v := range codecs { res[i] = topictypes.Codec(v) } + return res } diff --git a/internal/topic/topicwriterinternal/writer_reconnector_test.go b/internal/topic/topicwriterinternal/writer_reconnector_test.go index 39e019e4e..2b6fef701 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector_test.go +++ b/internal/topic/topicwriterinternal/writer_reconnector_test.go @@ -282,6 +282,7 @@ func TestWriterReconnector_Write_QueueLimit(t *testing.T) { waitStartQueueWait := func(targetWaiters int) { xtest.SpinWaitCondition(t, nil, func() bool { res := getWaitersCount(w.semaphore) == targetWaiters + return res }) } @@ -407,6 +408,7 @@ func TestWriterImpl_Reconnect(t *testing.T) { close(connectCalledChan) connectCalled = true require.NotEqual(t, ctx, streamCtxArg) + return strm, nil } @@ -466,6 +468,7 @@ func TestWriterImpl_Reconnect(t *testing.T) { xtest.WaitChannelClosed(t, streamClosed) t.Logf("channel closed: %v", name) }).Return(nil, errors.New("test stream closed")).MaxTimes(1) + return strm } @@ -758,6 +761,7 @@ func TestCalculateAllowedCodecs(t *testing.T) { func newTestMessageWithDataContent(num int) messageWithDataContent { res := newMessageDataWithContent(PublicMessage{SeqNo: int64(num)}, testCommonEncoders) + return res } @@ -766,6 +770,7 @@ func newTestMessages(numbers ...int) []PublicMessage { for i, num := range numbers { messages[i].SeqNo = int64(num) } + return messages } @@ -774,6 +779,7 @@ func newTestMessagesWithContent(numbers ...int) []messageWithDataContent { for _, num := range numbers { messages = append(messages, newTestMessageWithDataContent(num)) } + return messages } @@ -808,6 +814,7 @@ func isClosed(ch <-chan struct{}) bool { if existVal { panic("value, when not expected") } + return true default: return false @@ -851,6 +858,7 @@ func newTestEnv(t testing.TB, options *testEnvOptions) *testEnv { if connectNum > 1 { t.Fatalf("test: default env support most one connection") } + return res.stream, nil })) writerOptions = append(writerOptions, options.writerOptions...) @@ -888,6 +896,7 @@ func newTestEnv(t testing.TB, options *testEnvOptions) *testEnv { close(res.stopReadEvents) <-streamClosed }) + return res } @@ -915,5 +924,6 @@ type sendFromServerResponse struct { func testCreateInitRequest(w *WriterReconnector) rawtopicwriter.InitRequest { req := newSingleStreamWriterStopped(context.Background(), w.createWriterStreamConfig(nil)).createInitRequest() + return req } diff --git a/internal/topic/topicwriterinternal/writer_reconnector_unsafe_test.go b/internal/topic/topicwriterinternal/writer_reconnector_unsafe_test.go index 4d0610ff3..0b0d8cd44 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector_unsafe_test.go +++ b/internal/topic/topicwriterinternal/writer_reconnector_unsafe_test.go @@ -24,5 +24,6 @@ func getWaitersCount(sem *semaphore.Weighted) int { waitersField := semVal.FieldByName("waiters") waitersPointer := unsafe.Pointer(waitersField.UnsafeAddr()) waiters := (*list.List)(waitersPointer) + return waiters.Len() } diff --git a/internal/topic/topicwriterinternal/writer_single_stream.go b/internal/topic/topicwriterinternal/writer_single_stream.go index 3e3a95d07..ba140876b 100644 --- a/internal/topic/topicwriterinternal/writer_single_stream.go +++ b/internal/topic/topicwriterinternal/writer_single_stream.go @@ -70,9 +70,11 @@ func NewSingleStreamWriter( err := res.initStream() if err != nil { _ = res.close(context.Background(), err) + return nil, err } res.start() + return res, nil } @@ -157,6 +159,7 @@ func (w *SingleStreamWriter) initStream() (err error) { w.ReceivedLastSeqNum = result.LastSeqNo w.PartitionID = result.PartitionID w.CodecsFromServer = result.SupportedCodecs + return nil } @@ -180,6 +183,7 @@ func (w *SingleStreamWriter) receiveMessagesLoop(ctx context.Context) { if err != nil { err = xerrors.WithStackTrace(fmt.Errorf("ydb: failed to receive message from write stream: %w", err)) _ = w.close(ctx, err) + return } @@ -190,6 +194,7 @@ func (w *SingleStreamWriter) receiveMessagesLoop(ctx context.Context) { closeCtx, closeCtxCancel := xcontext.WithCancel(ctx) closeCtxCancel() _ = w.close(closeCtx, reason) + return } case *rawtopicwriter.UpdateTokenResponse: @@ -213,12 +218,14 @@ func (w *SingleStreamWriter) sendMessagesFromQueueToStreamLoop(ctx context.Conte messages, err := w.cfg.queue.GetMessagesForSend(ctx) if err != nil { _ = w.close(ctx, err) + return } targetCodec, err := w.Encoder.CompressMessages(messages) if err != nil { _ = w.close(ctx, err) + return } @@ -235,6 +242,7 @@ func (w *SingleStreamWriter) sendMessagesFromQueueToStreamLoop(ctx context.Conte if err != nil { err = xerrors.WithStackTrace(fmt.Errorf("ydb: error send message to topic stream: %w", err)) _ = w.close(ctx, err) + return } } @@ -274,5 +282,6 @@ func (w *SingleStreamWriter) sendUpdateToken(ctx context.Context) (err error) { req := &rawtopicwriter.UpdateTokenRequest{} req.Token = token + return stream.Send(req) } diff --git a/internal/value/time.go b/internal/value/time.go index b840ddedc..37f7aa374 100644 --- a/internal/value/time.go +++ b/internal/value/time.go @@ -54,6 +54,7 @@ func DatetimeToTime(n uint32) time.Time { func TimestampToTime(n uint64) time.Time { sec := n / 1e6 nsec := (n - (sec * 1e6)) * 1000 + return time.Unix(int64(sec), int64(nsec)) } @@ -70,6 +71,7 @@ func TzDateToTime(s string) (t time.Time, err error) { if err != nil { return t, xerrors.WithStackTrace(fmt.Errorf("parse '%s' failed: %w", s, err)) } + return t, nil } @@ -86,6 +88,7 @@ func TzDatetimeToTime(s string) (t time.Time, err error) { if err != nil { return t, xerrors.WithStackTrace(fmt.Errorf("parse '%s' failed: %w", s, err)) } + return t, nil } @@ -106,5 +109,6 @@ func TzTimestampToTime(s string) (t time.Time, err error) { if err != nil { return t, xerrors.WithStackTrace(fmt.Errorf("parse '%s' failed: %w", s, err)) } + return t, nil } diff --git a/internal/value/time_test.go b/internal/value/time_test.go index f9d93ac37..a1e0cfca2 100644 --- a/internal/value/time_test.go +++ b/internal/value/time_test.go @@ -20,6 +20,7 @@ func TestTzSomeToTime(t *testing.T) { time.Date(2020, time.May, 29, 0, 0, 0, 0, func() *time.Location { l, _ := time.LoadLocation("Europe/Berlin") + return l }(), ), @@ -31,6 +32,7 @@ func TestTzSomeToTime(t *testing.T) { time.Date(2020, time.May, 29, 11, 22, 54, 0, func() *time.Location { l, _ := time.LoadLocation("Europe/Berlin") + return l }(), ), @@ -42,6 +44,7 @@ func TestTzSomeToTime(t *testing.T) { time.Date(2020, time.May, 29, 11, 22, 54, 123456000, func() *time.Location { l, _ := time.LoadLocation("Europe/Berlin") + return l }(), ), @@ -53,6 +56,7 @@ func TestTzSomeToTime(t *testing.T) { time.Date(2020, time.May, 29, 11, 22, 54, 0, func() *time.Location { l, _ := time.LoadLocation("Europe/Berlin") + return l }(), ), diff --git a/internal/value/type.go b/internal/value/type.go index 11ccb19b1..dd2cc3b07 100644 --- a/internal/value/type.go +++ b/internal/value/type.go @@ -34,14 +34,17 @@ func TypeFromYDB(x *Ydb.Type) Type { case *Ydb.Type_DecimalType: d := v.DecimalType + return Decimal(d.Precision, d.Scale) case *Ydb.Type_TupleType: t := v.TupleType + return Tuple(TypesFromYDB(t.Elements)...) case *Ydb.Type_StructType: s := v.StructType + return Struct(StructFields(s.Members)...) case *Ydb.Type_DictType: @@ -49,6 +52,7 @@ func TypeFromYDB(x *Ydb.Type) Type { if valueType.equalsTo(Void()) { return Set(keyType) } + return Dict(keyType, valueType) case *Ydb.Type_VariantType: @@ -135,6 +139,7 @@ func TypesFromYDB(es []*Ydb.Type) []Type { for i, el := range es { ts[i] = TypeFromYDB(el) } + return ts } @@ -161,6 +166,7 @@ func (v *DecimalType) Yql() string { func (v *DecimalType) equalsTo(rhs Type) bool { vv, ok := rhs.(*DecimalType) + return ok && *v == *vv } @@ -203,6 +209,7 @@ func (v *dictType) Yql() string { buffer.WriteByte(',') buffer.WriteString(v.valueType.Yql()) buffer.WriteByte('>') + return buffer.String() } @@ -217,6 +224,7 @@ func (v *dictType) equalsTo(rhs Type) bool { if !v.valueType.equalsTo(vv.valueType) { return false } + return true } @@ -254,6 +262,7 @@ func (v emptyListType) String() string { func (emptyListType) equalsTo(rhs Type) bool { _, ok := rhs.(emptyListType) + return ok } @@ -281,6 +290,7 @@ func (v emptyDictType) Yql() string { func (emptyDictType) equalsTo(rhs Type) bool { _, ok := rhs.(emptyDictType) + return ok } @@ -317,6 +327,7 @@ func (v *listType) equalsTo(rhs Type) bool { if !ok { return false } + return v.itemType.equalsTo(vv.itemType) } @@ -358,6 +369,7 @@ func (v *setType) equalsTo(rhs Type) bool { if !ok { return false } + return v.itemType.equalsTo(vv.itemType) } @@ -405,6 +417,7 @@ func (v optionalType) equalsTo(rhs Type) bool { if !ok { return false } + return v.innerType.equalsTo(vv.innerType) } @@ -529,6 +542,7 @@ func (v PrimitiveType) equalsTo(rhs Type) bool { if !ok { return false } + return v == vv } @@ -563,6 +577,7 @@ func (v *StructType) Yql() string { buffer.WriteString(v.fields[i].T.Yql()) } buffer.WriteByte('>') + return buffer.String() } @@ -582,6 +597,7 @@ func (v *StructType) equalsTo(rhs Type) bool { return false } } + return true } @@ -621,6 +637,7 @@ func StructFields(ms []*Ydb.StructMember) []StructField { T: TypeFromYDB(m.Type), } } + return fs } @@ -643,6 +660,7 @@ func (v *TupleType) Yql() string { buffer.WriteString(t.Yql()) } buffer.WriteByte('>') + return buffer.String() } @@ -659,6 +677,7 @@ func (v *TupleType) equalsTo(rhs Type) bool { return false } } + return true } @@ -705,6 +724,7 @@ func (v *variantStructType) Yql() string { buffer.WriteString(v.fields[i].T.Yql()) } buffer.WriteByte('>') + return buffer.String() } @@ -757,6 +777,7 @@ func (v *variantTupleType) Yql() string { buffer.WriteString(t.Yql()) } buffer.WriteByte('>') + return buffer.String() } @@ -810,6 +831,7 @@ var _voidType = &Ydb.Type{ func (v voidType) equalsTo(rhs Type) bool { _, ok := rhs.(voidType) + return ok } @@ -837,6 +859,7 @@ var _nullType = &Ydb.Type{ func (v nullType) equalsTo(rhs Type) bool { _, ok := rhs.(nullType) + return ok } diff --git a/internal/value/value.go b/internal/value/value.go index cd8b2079e..4c8e3cbdd 100644 --- a/internal/value/value.go +++ b/internal/value/value.go @@ -39,6 +39,7 @@ func ToYDB(v Value, a *allocator.Allocator) *Ydb.TypedValue { func BigEndianUint128(hi, lo uint64) (v [16]byte) { binary.BigEndian.PutUint64(v[0:8], hi) binary.BigEndian.PutUint64(v[8:16], lo) + return v } @@ -47,6 +48,7 @@ func FromYDB(t *Ydb.Type, v *Ydb.Value) Value { if err != nil { panic(err) } + return vv } @@ -184,6 +186,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { if nestedValue, ok := v.Value.(*Ydb.Value_NestedValue); ok { return OptionalValue(FromYDB(t, nestedValue.NestedValue)), nil } + return OptionalValue(FromYDB(t, v)), nil case *listType: @@ -194,6 +197,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { for i, vvv := range v.GetItems() { vv[i] = FromYDB(ttt.itemType.toYDB(a), vvv) } + return vv }()...), nil @@ -205,6 +209,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { for i, vvv := range v.GetItems() { vv[i] = FromYDB(ttt.items[i].toYDB(a), vvv) } + return vv }()...), nil @@ -219,6 +224,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { V: FromYDB(ttt.fields[i].T.toYDB(a), vvv), } } + return vv }()...), nil @@ -233,6 +239,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { V: FromYDB(ttt.valueType.toYDB(a), vvv.Payload), } } + return vv }()...), nil @@ -244,12 +251,14 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { for i, vvv := range v.GetPairs() { vv[i] = FromYDB(ttt.itemType.toYDB(a), vvv.Key) } + return vv }()...), nil case *variantStructType: a := allocator.New() defer a.Free() + return VariantValueStruct( FromYDB( ttt.StructType.fields[v.VariantIndex].T.toYDB(a), @@ -262,6 +271,7 @@ func fromYDB(t *Ydb.Type, v *Ydb.Value) (Value, error) { case *variantTupleType: a := allocator.New() defer a.Free() + return VariantValueTuple( FromYDB( ttt.TupleType.items[v.VariantIndex].toYDB(a), @@ -282,9 +292,11 @@ func (v boolValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *bool: *vv = bool(v) + return nil case *string: *vv = strconv.FormatBool(bool(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -320,15 +332,19 @@ func (v dateValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *time.Time: *vv = DateToTime(uint32(v)) + return nil case *uint64: *vv = uint64(v) + return nil case *int64: *vv = int64(v) + return nil case *int32: *vv = int32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -369,15 +385,19 @@ func (v datetimeValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *time.Time: *vv = DatetimeToTime(uint32(v)) + return nil case *uint64: *vv = uint64(v) + return nil case *int64: *vv = int64(v) + return nil case *uint32: *vv = uint32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -454,6 +474,7 @@ func (v *decimalValue) Yql() string { buffer.WriteByte(',') buffer.WriteString(strconv.FormatUint(uint64(v.innerType.Scale), 10)) buffer.WriteByte(')') + return buffer.String() } @@ -478,6 +499,7 @@ func (v *decimalValue) toYDB(a *allocator.Allocator) *Ydb.Value { func DecimalValueFromBigInt(v *big.Int, precision, scale uint32) *decimalValue { b := decimal.BigIntToByte(v, precision, scale) + return DecimalValue(b, precision, scale) } @@ -507,6 +529,7 @@ func (v *dictValue) DictValues() map[Value]Value { for i := range v.values { values[v.values[i].K] = v.values[i].V } + return values } @@ -527,6 +550,7 @@ func (v *dictValue) Yql() string { buffer.WriteString(v.values[i].V.Yql()) } buffer.WriteByte('}') + return buffer.String() } @@ -564,6 +588,7 @@ func DictValue(values ...DictValueField) *dictValue { default: t = EmptyDict() } + return &dictValue{ t: t, values: values, @@ -578,12 +603,15 @@ func (v *doubleValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatFloat(v.value, 'f', -1, 64) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatFloat(v.value, 'f', -1, 64)) + return nil case *float64: *vv = v.value + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -620,9 +648,11 @@ func (v dyNumberValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -659,15 +689,19 @@ func (v *floatValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatFloat(float64(v.value), 'f', -1, 32) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatFloat(float64(v.value), 'f', -1, 32)) + return nil case *float64: *vv = float64(v.value) + return nil case *float32: *vv = v.value + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -704,27 +738,35 @@ func (v int8Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *int64: *vv = int64(v) + return nil case *int32: *vv = int32(v) + return nil case *int16: *vv = int16(v) + return nil case *int8: *vv = int8(v) + return nil case *float64: *vv = float64(v) + return nil case *float32: *vv = float32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -759,24 +801,31 @@ func (v int16Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *int64: *vv = int64(v) + return nil case *int32: *vv = int32(v) + return nil case *int16: *vv = int16(v) + return nil case *float64: *vv = float64(v) + return nil case *float32: *vv = float32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -811,24 +860,31 @@ func (v int32Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *int64: *vv = int64(v) + return nil case *int: *vv = int(v) + return nil case *int32: *vv = int32(v) + return nil case *float64: *vv = float64(v) + return nil case *float32: *vv = float32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -863,15 +919,19 @@ func (v int64Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *int64: *vv = int64(v) + return nil case *float64: *vv = float64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -906,9 +966,11 @@ func (v intervalValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *time.Duration: *vv = IntervalToDuration(int64(v)) + return nil case *int64: *vv = int64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -952,6 +1014,7 @@ func (v intervalValue) Yql() string { } buffer.WriteByte('"') buffer.WriteByte(')') + return buffer.String() } @@ -984,9 +1047,11 @@ func (v jsonValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1021,9 +1086,11 @@ func (v jsonDocumentValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1076,6 +1143,7 @@ func (v *listValue) Yql() string { buffer.WriteString(item.Yql()) } buffer.WriteByte(']') + return buffer.String() } @@ -1105,6 +1173,7 @@ func ListValue(items ...Value) *listValue { default: t = EmptyList() } + return &listValue{ t: t, items: items, @@ -1131,6 +1200,7 @@ func (v *setValue) Yql() string { buffer.WriteString(item.Yql()) } buffer.WriteByte('}') + return buffer.String() } @@ -1190,6 +1260,7 @@ func (v *optionalValue) castTo(dst interface{}) error { if v.value == nil { return xerrors.WithStackTrace(errOptionalNilValue) } + return v.value.castTo(dst) } @@ -1197,6 +1268,7 @@ func (v *optionalValue) Yql() string { if v.value == nil { return fmt.Sprintf("Nothing(%s)", v.Type().Yql()) } + return fmt.Sprintf("Just(%s)", v.value.Yql()) } @@ -1217,6 +1289,7 @@ func (v *optionalValue) toYDB(a *allocator.Allocator) *Ydb.Value { vv.Value = a.NullFlag() } } + return vv } @@ -1243,6 +1316,7 @@ func (v *structValue) StructFields() map[string]Value { for i := range v.fields { fields[v.fields[i].Name] = v.fields[i].V } + return fields } @@ -1262,6 +1336,7 @@ func (v *structValue) Yql() string { buffer.WriteString(v.fields[i].V.Yql()) } buffer.WriteString("|>") + return buffer.String() } @@ -1287,6 +1362,7 @@ func StructValue(fields ...StructValueField) *structValue { for i := range fields { structFields = append(structFields, StructField{fields[i].Name, fields[i].V.Type()}) } + return &structValue{ t: Struct(structFields...), fields: fields, @@ -1299,9 +1375,11 @@ func (v timestampValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *time.Time: *vv = TimestampToTime(uint64(v)) + return nil case *uint64: *vv = uint64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1348,6 +1426,7 @@ func (v *tupleValue) castTo(dst interface{}) error { if len(v.items) == 1 { return v.items[0].castTo(dst) } + return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' to '%T' destination", v, dst)) } @@ -1362,6 +1441,7 @@ func (v *tupleValue) Yql() string { buffer.WriteString(item.Yql()) } buffer.WriteByte(')') + return buffer.String() } @@ -1388,6 +1468,7 @@ func TupleValue(values ...Value) *tupleValue { for _, v := range values { tupleItems = append(tupleItems, v.Type()) } + return &tupleValue{ t: Tuple(tupleItems...), items: values, @@ -1400,9 +1481,11 @@ func (v tzDateValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1441,9 +1524,11 @@ func (v tzDatetimeValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1482,9 +1567,11 @@ func (v tzTimestampValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1523,36 +1610,47 @@ func (v uint8Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *uint64: *vv = uint64(v) + return nil case *int64: *vv = int64(v) + return nil case *uint32: *vv = uint32(v) + return nil case *int32: *vv = int32(v) + return nil case *uint16: *vv = uint16(v) + return nil case *int16: *vv = int16(v) + return nil case *uint8: *vv = uint8(v) + return nil case *float64: *vv = float64(v) + return nil case *float32: *vv = float32(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1587,30 +1685,39 @@ func (v uint16Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *uint64: *vv = uint64(v) + return nil case *int64: *vv = int64(v) + return nil case *uint32: *vv = uint32(v) + return nil case *int32: *vv = int32(v) + return nil case *uint16: *vv = uint16(v) + return nil case *float32: *vv = float32(v) + return nil case *float64: *vv = float64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1645,21 +1752,27 @@ func (v uint32Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *uint64: *vv = uint64(v) + return nil case *int64: *vv = int64(v) + return nil case *uint32: *vv = uint32(v) + return nil case *float64: *vv = float64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1694,12 +1807,15 @@ func (v uint64Value) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = strconv.FormatInt(int64(v), 10) + return nil case *[]byte: *vv = xstring.ToBytes(strconv.FormatInt(int64(v), 10)) + return nil case *uint64: *vv = uint64(v) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1734,9 +1850,11 @@ func (v textValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v) + return nil case *[]byte: *vv = xstring.ToBytes(string(v)) + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1773,12 +1891,15 @@ func (v *uuidValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = string(v.value[:]) + return nil case *[]byte: *vv = v.value[:] + return nil case *[16]byte: *vv = v.value + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -1794,6 +1915,7 @@ func (v *uuidValue) Yql() string { buffer.WriteString(uuid.UUID(v.value).String()) buffer.WriteByte('"') buffer.WriteByte(')') + return buffer.String() } @@ -1858,6 +1980,7 @@ func (v *variantValue) Yql() string { buffer.WriteByte(',') buffer.WriteString(v.Type().Yql()) buffer.WriteByte(')') + return buffer.String() } @@ -1881,6 +2004,7 @@ func VariantValueTuple(v Value, idx uint32, t Type) *variantValue { if tt, has := t.(*TupleType); has { t = VariantTuple(tt.items...) } + return &variantValue{ innerType: t, value: v, @@ -1907,6 +2031,7 @@ func VariantValueStruct(v Value, name string, t Type) *variantValue { return tt.fields[i].Name >= name }) } + return &variantValue{ innerType: t, value: v, @@ -1949,9 +2074,11 @@ func (v ysonValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = xstring.FromBytes(v) + return nil case *[]byte: *vv = v + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) @@ -2097,6 +2224,7 @@ func ZeroValue(t Type) Value { for i, tt := range t.items { values[i] = ZeroValue(tt) } + return values }()...) case *StructType: @@ -2108,6 +2236,7 @@ func ZeroValue(t Type) Value { V: ZeroValue(t.fields[i].T), } } + return fields }()...) case *DecimalType: @@ -2124,9 +2253,11 @@ func (v bytesValue) castTo(dst interface{}) error { switch vv := dst.(type) { case *string: *vv = xstring.FromBytes(v) + return nil case *[]byte: *vv = v + return nil default: return xerrors.WithStackTrace(fmt.Errorf("cannot cast '%+v' (type '%s') to '%T' destination", v, v.Type().Yql(), vv)) diff --git a/internal/value/value_test.go b/internal/value/value_test.go index f2ea1fbe3..e8b283fb1 100644 --- a/internal/value/value_test.go +++ b/internal/value/value_test.go @@ -290,6 +290,7 @@ func TestValueYql(t *testing.T) { { value: DateValue(func() uint32 { v, _ := time.Parse("2006-01-02", "2022-06-17") + return uint32(v.Sub(time.Unix(0, 0)) / time.Hour / 24) }()), literal: `Date("2022-06-17")`, @@ -297,6 +298,7 @@ func TestValueYql(t *testing.T) { { value: DatetimeValue(func() uint32 { v, _ := time.Parse("2006-01-02 15:04:05", "2022-06-17 05:19:20") + return uint32(v.UTC().Sub(time.Unix(0, 0)).Seconds()) }()), literal: `Datetime("2022-06-17T05:19:20Z")`, @@ -317,6 +319,7 @@ func TestValueYql(t *testing.T) { value: TimestampValueFromTime(func() time.Time { tt, err := time.Parse(LayoutTimestamp, "1997-12-14T03:09:42.123456Z") require.NoError(t, err) + return tt.UTC() }()), literal: `Timestamp("1997-12-14T03:09:42.123456Z")`, diff --git a/internal/version/parse.go b/internal/version/parse.go index f088defdb..e901ed031 100644 --- a/internal/version/parse.go +++ b/internal/version/parse.go @@ -33,6 +33,7 @@ func (lhs version) Less(rhs version) bool { if lhs.Patch > rhs.Patch { return false } + return lhs.Suffix < rhs.Suffix } @@ -46,6 +47,7 @@ func Lt(lhs, rhs string) bool { if err != nil { return false } + return v1.Less(v2) } @@ -62,6 +64,7 @@ func Gte(lhs, rhs string) bool { if v1.Less(v2) { return false } + return true } @@ -89,5 +92,6 @@ func parse(s string) (v version, err error) { return version{}, xerrors.WithStackTrace(err) } } + return v, nil } diff --git a/internal/wait/wait.go b/internal/wait/wait.go index cdf41e355..11a01dee6 100644 --- a/internal/wait/wait.go +++ b/internal/wait/wait.go @@ -22,6 +22,7 @@ func waitBackoff(ctx context.Context, b backoff.Backoff, i int) error { if err := ctx.Err(); err != nil { return xerrors.WithStackTrace(err) } + return nil } } @@ -33,6 +34,7 @@ func Wait(ctx context.Context, fastBackoff, slowBackoff backoff.Backoff, t backo if err := ctx.Err(); err != nil { return xerrors.WithStackTrace(err) } + return nil case backoff.TypeFast: if fastBackoff == nil { @@ -45,5 +47,6 @@ func Wait(ctx context.Context, fastBackoff, slowBackoff backoff.Backoff, t backo } b = slowBackoff } + return waitBackoff(ctx, b, i) } diff --git a/internal/xcontext/context_with_cancel.go b/internal/xcontext/context_with_cancel.go index 7f983442c..1deeac4bb 100644 --- a/internal/xcontext/context_with_cancel.go +++ b/internal/xcontext/context_with_cancel.go @@ -11,6 +11,7 @@ func WithCancel(ctx context.Context) (context.Context, context.CancelFunc) { parentCtx: ctx, } childCtx.ctx, childCtx.ctxCancel = context.WithCancel(ctx) + return childCtx, childCtx.cancel } @@ -60,6 +61,7 @@ func (ctx *cancelCtx) cancel() { if err := ctx.parentCtx.Err(); err != nil { ctx.err = err + return } ctx.err = errAt(context.Canceled, 1) diff --git a/internal/xcontext/context_with_cancel_test.go b/internal/xcontext/context_with_cancel_test.go index 515d1a7a7..55251b671 100644 --- a/internal/xcontext/context_with_cancel_test.go +++ b/internal/xcontext/context_with_cancel_test.go @@ -46,6 +46,7 @@ func TestContextWithCancelError(t *testing.T) { childCtx, childCancel := WithCancel(parentCtx) parentCancel() childCancel() + return childCtx.Err() }(), str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithCancelError.func1(context_with_cancel_test.go:47)`", //nolint:lll @@ -54,24 +55,27 @@ func TestContextWithCancelError(t *testing.T) { err: func() error { ctx, cancel := WithCancel(context.Background()) cancel() + return ctx.Err() }(), - str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithCancelError.func2(context_with_cancel_test.go:56)`", //nolint:lll + str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithCancelError.func2(context_with_cancel_test.go:57)`", //nolint:lll }, { err: func() error { parentCtx, _ := WithTimeout(context.Background(), 0) childCtx, cancel := WithCancel(parentCtx) cancel() + return childCtx.Err() }(), - str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithCancelError.func3(context_with_cancel_test.go:63)`", //nolint:lll + str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithCancelError.func3(context_with_cancel_test.go:65)`", //nolint:lll }, { err: func() error { parentCtx, _ := context.WithTimeout(context.Background(), 0) //nolint:govet childCtx, cancel := WithCancel(parentCtx) cancel() + return childCtx.Err() }(), str: "context deadline exceeded", diff --git a/internal/xcontext/context_with_timeout.go b/internal/xcontext/context_with_timeout.go index 72d067044..5342798fe 100644 --- a/internal/xcontext/context_with_timeout.go +++ b/internal/xcontext/context_with_timeout.go @@ -14,6 +14,7 @@ func WithTimeout(ctx context.Context, t time.Duration) (context.Context, context from: stack.Record(1), } childCtx.ctx, childCtx.ctxCancel = context.WithTimeout(ctx, t) + return childCtx, childCtx.cancel } @@ -45,11 +46,13 @@ func (ctx *timeoutCtx) Err() error { if ctx.ctx.Err() == context.DeadlineExceeded && ctx.parentCtx.Err() == nil { //nolint:errorlint ctx.err = errFrom(context.DeadlineExceeded, ctx.from) + return ctx.err } if err := ctx.parentCtx.Err(); err != nil { ctx.err = err + return ctx.err } @@ -72,6 +75,7 @@ func (ctx *timeoutCtx) cancel() { if err := ctx.parentCtx.Err(); err != nil { ctx.err = err + return } ctx.err = errAt(context.Canceled, 1) diff --git a/internal/xcontext/context_with_timeout_test.go b/internal/xcontext/context_with_timeout_test.go index 6286776b3..d29cfa2a2 100644 --- a/internal/xcontext/context_with_timeout_test.go +++ b/internal/xcontext/context_with_timeout_test.go @@ -47,6 +47,7 @@ func TestContextWithTimeoutError(t *testing.T) { childCtx, childCancel := WithTimeout(parentCtx, time.Hour) parentCancel() childCancel() + return childCtx.Err() }(), str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func1(context_with_timeout_test.go:48)`", //nolint:lll @@ -55,39 +56,44 @@ func TestContextWithTimeoutError(t *testing.T) { err: func() error { ctx, cancel := WithTimeout(context.Background(), time.Hour) cancel() + return ctx.Err() }(), - str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func2(context_with_timeout_test.go:57)`", //nolint:lll + str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func2(context_with_timeout_test.go:58)`", //nolint:lll }, { err: func() error { parentCtx, _ := WithTimeout(context.Background(), 0) childCtx, _ := WithTimeout(parentCtx, 0) + return childCtx.Err() }(), - str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func3(context_with_timeout_test.go:64)`", //nolint:lll + str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func3(context_with_timeout_test.go:66)`", //nolint:lll }, { err: func() error { ctx, _ := WithTimeout(context.Background(), 0) + return ctx.Err() }(), - str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func4(context_with_timeout_test.go:72)`", //nolint:lll + str: "'context deadline exceeded' from `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func4(context_with_timeout_test.go:75)`", //nolint:lll }, { err: func() error { parentCtx, cancel := WithCancel(context.Background()) childCtx, _ := WithTimeout(parentCtx, 0) cancel() + return childCtx.Err() }(), - str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func5(context_with_timeout_test.go:81)`", //nolint:lll + str: "'context canceled' at `github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext.TestContextWithTimeoutError.func5(context_with_timeout_test.go:85)`", //nolint:lll }, { err: func() error { parentCtx, cancel := context.WithCancel(context.Background()) childCtx, _ := WithTimeout(parentCtx, 0) cancel() + return childCtx.Err() }(), str: "context canceled", diff --git a/internal/xcontext/idempotent.go b/internal/xcontext/idempotent.go index 377b9f995..9e8c7577b 100644 --- a/internal/xcontext/idempotent.go +++ b/internal/xcontext/idempotent.go @@ -15,5 +15,6 @@ func IsIdempotent(ctx context.Context) bool { if idempotent, ok := ctx.Value(ctxIdempotentKey{}).(bool); ok { return idempotent } + return false } diff --git a/internal/xcontext/local_dc.go b/internal/xcontext/local_dc.go index d549d57da..01f0602fd 100644 --- a/internal/xcontext/local_dc.go +++ b/internal/xcontext/local_dc.go @@ -12,5 +12,6 @@ func ExtractLocalDC(ctx context.Context) string { if val := ctx.Value(localDcKey{}); val != nil { return val.(string) } + return "" } diff --git a/internal/xcontext/retry_call.go b/internal/xcontext/retry_call.go index 501895db3..e7e0789d7 100644 --- a/internal/xcontext/retry_call.go +++ b/internal/xcontext/retry_call.go @@ -14,5 +14,6 @@ func IsNestedCall(ctx context.Context) bool { if _, has := ctx.Value(markRetryCallKey{}).(bool); has { return true } + return false } diff --git a/internal/xerrors/check.go b/internal/xerrors/check.go index 68864a986..47b2b1603 100644 --- a/internal/xerrors/check.go +++ b/internal/xerrors/check.go @@ -21,6 +21,7 @@ func Check(err error) ( if As(err, &e) { return int64(e.Code()), e.Type(), e.BackoffType(), e.MustDeleteSession() } + return -1, TypeNonRetryable, // unknown errors are not retryable backoff.TypeNoBackoff, @@ -32,5 +33,6 @@ func MustDeleteSession(err error) bool { if As(err, &e) { return e.MustDeleteSession() } + return false } diff --git a/internal/xerrors/issues.go b/internal/xerrors/issues.go index f4870b685..f981207b4 100644 --- a/internal/xerrors/issues.go +++ b/internal/xerrors/issues.go @@ -51,6 +51,7 @@ func (ii issues) String() string { b.WriteByte('}') } b.WriteByte(']') + return b.String() } @@ -64,6 +65,7 @@ func NewWithIssues(text string, issues ...error) error { err.issues = append(err.issues, issues[i]) } } + return err } @@ -89,6 +91,7 @@ func (e *errorWithIssues) Error() string { b.WriteString(issue.Error()) } b.WriteString("]") + return b.String() } @@ -98,6 +101,7 @@ func (e *errorWithIssues) As(target interface{}) bool { return true } } + return false } @@ -107,6 +111,7 @@ func (e *errorWithIssues) Is(target error) bool { return true } } + return false } @@ -128,6 +133,7 @@ func (it IssueIterator) Get(i int) (issue Issue, nested IssueIterator) { if xs := x.Issues; len(xs) > 0 { nested = IssueIterator(xs) } + return Issue{ Message: x.GetMessage(), Code: x.GetIssueCode(), diff --git a/internal/xerrors/join.go b/internal/xerrors/join.go index b5b29d683..1f2e37887 100644 --- a/internal/xerrors/join.go +++ b/internal/xerrors/join.go @@ -23,6 +23,7 @@ func (errs joinError) Error() string { _, _ = fmt.Fprintf(b, "%q", err.Error()) } b.WriteByte(']') + return b.String() } @@ -32,6 +33,7 @@ func (errs joinError) As(target interface{}) bool { return true } } + return false } @@ -41,6 +43,7 @@ func (errs joinError) Is(target error) bool { return true } } + return false } diff --git a/internal/xerrors/join_test.go b/internal/xerrors/join_test.go index a3db6a55c..a9ff7e297 100644 --- a/internal/xerrors/join_test.go +++ b/internal/xerrors/join_test.go @@ -24,8 +24,12 @@ func TestJoin(t *testing.T) { { err: Join(context.Canceled, context.DeadlineExceeded, Operation()), iss: []error{context.Canceled, context.DeadlineExceeded}, - ass: []interface{}{func() interface{} { var i isYdbError; return &i }()}, - s: "[\"context canceled\",\"context deadline exceeded\",\"operation/STATUS_CODE_UNSPECIFIED (code = 0)\"]", + ass: []interface{}{func() interface{} { + var i isYdbError + + return &i + }()}, + s: "[\"context canceled\",\"context deadline exceeded\",\"operation/STATUS_CODE_UNSPECIFIED (code = 0)\"]", }, } { t.Run("", func(t *testing.T) { diff --git a/internal/xerrors/operation.go b/internal/xerrors/operation.go index 2451c8ca8..f2383077a 100644 --- a/internal/xerrors/operation.go +++ b/internal/xerrors/operation.go @@ -105,6 +105,7 @@ func Operation(opts ...oeOpt) error { opt.applyToOperationError(oe) } } + return oe } @@ -126,6 +127,7 @@ func (e *operationError) Error() string { b.WriteString(e.issues.String()) } b.WriteString(")") + return b.String() } @@ -143,6 +145,7 @@ func IsOperationError(err error, codes ...Ydb.StatusIds_StatusCode) bool { return true } } + return false } @@ -154,6 +157,7 @@ func IsOperationErrorTransactionLocksInvalidated(err error) (isTLI bool) { isTLI = isTLI || (code == issueCodeTransactionLocksInvalidated) }) } + return isTLI } @@ -208,5 +212,6 @@ func OperationError(err error) Error { if errors.As(err, &o) { return o } + return nil } diff --git a/internal/xerrors/retryable.go b/internal/xerrors/retryable.go index c2c2684ac..f37bc2eb6 100644 --- a/internal/xerrors/retryable.go +++ b/internal/xerrors/retryable.go @@ -82,6 +82,7 @@ func Retryable(err error, opts ...RetryableErrorOption) error { o(re) } } + return re } @@ -91,5 +92,6 @@ func RetryableError(err error) Error { if errors.As(err, &e) { return e } + return nil } diff --git a/internal/xerrors/stacktrace.go b/internal/xerrors/stacktrace.go index 4f2e2e6f0..d59c092e7 100644 --- a/internal/xerrors/stacktrace.go +++ b/internal/xerrors/stacktrace.go @@ -38,6 +38,7 @@ func WithStackTrace(err error, opts ...withStackTraceOption) error { status: s, } } + return &stackError{ stackRecord: stack.Record(options.skipDepth + 1), err: err, diff --git a/internal/xerrors/transport.go b/internal/xerrors/transport.go index 0a42b8b68..ad2bf00a6 100644 --- a/internal/xerrors/transport.go +++ b/internal/xerrors/transport.go @@ -58,6 +58,7 @@ func (e *transportError) Error() string { b.WriteString(fmt.Sprintf(", traceID: %q", e.traceID)) } b.WriteString(")") + return b.String() } @@ -129,6 +130,7 @@ func IsTransportError(err error, codes ...grpcCodes.Code) bool { } } } + return false } @@ -157,6 +159,7 @@ func Transport(err error, opts ...teOpt) error { opt.applyToTransportError(te) } } + return te } @@ -195,5 +198,6 @@ func TransportError(err error) Error { err: err, } } + return nil } diff --git a/internal/xerrors/xerrors.go b/internal/xerrors/xerrors.go index d0d4d0d44..a97328793 100644 --- a/internal/xerrors/xerrors.go +++ b/internal/xerrors/xerrors.go @@ -46,6 +46,7 @@ func ErrIf(cond bool, err error) error { if cond { return err } + return nil } @@ -56,6 +57,7 @@ func HideEOF(err error) error { if errors.Is(err, io.EOF) { return nil } + return err } @@ -73,6 +75,7 @@ func As(err error, targets ...interface{}) bool { return true } } + return false } @@ -87,5 +90,6 @@ func Is(err error, targets ...error) bool { return true } } + return false } diff --git a/internal/xerrors/ydb.go b/internal/xerrors/ydb.go index 1a5995948..3c168703c 100644 --- a/internal/xerrors/ydb.go +++ b/internal/xerrors/ydb.go @@ -10,6 +10,7 @@ type isYdbError interface { func IsYdb(err error) bool { var e isYdbError + return errors.As(err, &e) } diff --git a/internal/xrand/xrand.go b/internal/xrand/xrand.go index 8f2427c0d..10c974ef0 100644 --- a/internal/xrand/xrand.go +++ b/internal/xrand/xrand.go @@ -40,6 +40,7 @@ func New(opts ...option) Rand { o(r) } } + return r } diff --git a/internal/xresolver/xresolver.go b/internal/xresolver/xresolver.go index 6ce395fa8..5d78a7a55 100644 --- a/internal/xresolver/xresolver.go +++ b/internal/xresolver/xresolver.go @@ -27,6 +27,7 @@ func (c *clientConn) Endpoint() string { if endpoint == "" { endpoint = c.target.URL.Opaque } + return strings.TrimPrefix(endpoint, "/") } @@ -37,6 +38,7 @@ func (c *clientConn) UpdateState(state resolver.State) (err error) { for i := range state.Addresses { addrs = append(addrs, state.Addresses[i].Addr) } + return }(), ) diff --git a/internal/xsql/badconn/badconn.go b/internal/xsql/badconn/badconn.go index 620c674a2..0b91649ec 100644 --- a/internal/xsql/badconn/badconn.go +++ b/internal/xsql/badconn/badconn.go @@ -24,6 +24,7 @@ func (e Error) Is(err error) bool { if err == driver.ErrBadConn { //nolint:errorlint return true } + return xerrors.Is(e.err, err) } diff --git a/internal/xsql/conn.go b/internal/xsql/conn.go index b5a52fd71..03ffaa1ef 100644 --- a/internal/xsql/conn.go +++ b/internal/xsql/conn.go @@ -141,6 +141,7 @@ func newConn(ctx context.Context, c *Connector, s table.ClosableSession, opts .. } } c.attach(cc) + return cc } @@ -226,6 +227,7 @@ func (c *conn) execContext(ctx context.Context, query string, args []driver.Name if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return resultNoRows{}, nil case SchemeQueryMode: normalizedQuery, _, err := c.normalize(query) @@ -236,6 +238,7 @@ func (c *conn) execContext(ctx context.Context, query string, args []driver.Name if err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return resultNoRows{}, nil case ScriptingQueryMode: var ( @@ -259,6 +262,7 @@ func (c *conn) execContext(ctx context.Context, query string, args []driver.Name if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return resultNoRows{}, nil default: return nil, fmt.Errorf("unsupported query mode '%s' for execute query", m) @@ -272,6 +276,7 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name if c.currentTx != nil { return c.currentTx.ExecContext(ctx, query, args) } + return c.execContext(ctx, query, args) } @@ -282,6 +287,7 @@ func (c *conn) QueryContext(ctx context.Context, query string, args []driver.Nam if c.currentTx != nil { return c.currentTx.QueryContext(ctx, query, args) } + return c.queryContext(ctx, query, args) } @@ -328,6 +334,7 @@ func (c *conn) queryContext(ctx context.Context, query string, args []driver.Nam if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return &rows{ conn: c, result: res, @@ -346,6 +353,7 @@ func (c *conn) queryContext(ctx context.Context, query string, args []driver.Nam if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return &rows{ conn: c, result: res, @@ -359,6 +367,7 @@ func (c *conn) queryContext(ctx context.Context, query string, args []driver.Nam if err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return &single{ values: []sql.NamedArg{ sql.Named("AST", exp.AST), @@ -377,6 +386,7 @@ func (c *conn) queryContext(ctx context.Context, query string, args []driver.Nam if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return &rows{ conn: c, result: res, @@ -397,6 +407,7 @@ func (c *conn) Ping(ctx context.Context) (finalErr error) { if err := c.session.KeepAlive(ctx); err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return nil } @@ -417,8 +428,10 @@ func (c *conn) Close() (finalErr error) { if err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return nil } + return badconn.Map(xerrors.WithStackTrace(errConnClosedEarly)) } @@ -435,6 +448,7 @@ func (c *conn) normalize(q string, args ...driver.NamedValue) (query string, _ * for i := range args { ii = append(ii, args[i]) } + return ii }()...) } @@ -487,6 +501,7 @@ func (c *conn) BeginTx(ctx context.Context, txOptions driver.TxOptions) (_ drive func (c *conn) Version(_ context.Context) (_ string, _ error) { const version = "default" + return version, nil } @@ -506,6 +521,7 @@ func (c *conn) IsTableExists(ctx context.Context, tableName string) (tableExists if err != nil { return false, xerrors.WithStackTrace(err) } + return tableExists, nil } @@ -530,14 +546,17 @@ func (c *conn) IsColumnExists(ctx context.Context, tableName, columnName string) for i := range desc.Columns { if desc.Columns[i].Name == columnName { columnExists = true + break } } + return nil }, retry.WithIdempotent(true)) if err != nil { return false, xerrors.WithStackTrace(err) } + return columnExists, nil } @@ -562,11 +581,13 @@ func (c *conn) GetColumns(ctx context.Context, tableName string) (columns []stri for i := range desc.Columns { columns = append(columns, desc.Columns[i].Name) } + return nil }, retry.WithIdempotent(true)) if err != nil { return nil, xerrors.WithStackTrace(err) } + return columns, nil } @@ -599,14 +620,17 @@ func (c *conn) GetColumnType(ctx context.Context, tableName, columnName string) for i := range desc.Columns { if desc.Columns[i].Name == columnName { dataType = desc.Columns[i].Type.Yql() + break } } + return nil }, retry.WithIdempotent(true)) if err != nil { return "", xerrors.WithStackTrace(err) } + return dataType, nil } @@ -629,11 +653,13 @@ func (c *conn) GetPrimaryKeys(ctx context.Context, tableName string) (pkCols []s return err } pkCols = append(pkCols, desc.PrimaryKey...) + return nil }, retry.WithIdempotent(true)) if err != nil { return nil, xerrors.WithStackTrace(err) } + return pkCols, nil } @@ -665,9 +691,11 @@ func (c *conn) IsPrimaryKey(ctx context.Context, tableName, columnName string) ( for _, pkCol := range pkCols { if pkCol == columnName { ok = true + break } } + return ok, nil } @@ -684,6 +712,7 @@ func isSysDir(databaseName, dirAbsPath string) bool { return true } } + return false } @@ -697,6 +726,7 @@ func (c *conn) getTables(ctx context.Context, absPath string, recursive, exclude var d scheme.Directory err := retry.Retry(ctx, func(ctx context.Context) (err error) { d, err = c.connector.parent.Scheme().ListDirectory(ctx, absPath) + return err }, retry.WithIdempotent(true)) if err != nil { @@ -733,6 +763,7 @@ func (c *conn) GetTables(ctx context.Context, folder string, recursive, excludeS var e scheme.Entry err := retry.Retry(ctx, func(ctx context.Context) (err error) { e, err = c.connector.parent.Scheme().DescribePath(ctx, absPath) + return err }, retry.WithIdempotent(true)) if err != nil { @@ -751,6 +782,7 @@ func (c *conn) GetTables(ctx context.Context, folder string, recursive, excludeS for i := range tables { tables[i] = strings.TrimPrefix(tables[i], absPath+"/") } + return tables, nil default: return nil, xerrors.WithStackTrace( @@ -780,6 +812,7 @@ func (c *conn) GetIndexes(ctx context.Context, tableName string) (indexes []stri for i := range desc.Indexes { indexes = append(indexes, desc.Indexes[i].Name) } + return nil }, retry.WithIdempotent(true)) if err != nil { @@ -810,9 +843,11 @@ func (c *conn) GetIndexColumns(ctx context.Context, tableName, indexName string) for i := range desc.Indexes { if desc.Indexes[i].Name == indexName { columns = append(columns, desc.Indexes[i].IndexColumns...) + return nil } } + return xerrors.WithStackTrace(fmt.Errorf("index '%s' not found in table '%s'", indexName, tableName)) }, retry.WithIdempotent(true)) if err != nil { diff --git a/internal/xsql/connector.go b/internal/xsql/connector.go index 2812ac768..a00246969 100644 --- a/internal/xsql/connector.go +++ b/internal/xsql/connector.go @@ -30,6 +30,7 @@ type defaultQueryModeConnectorOption QueryMode func (mode defaultQueryModeConnectorOption) Apply(c *Connector) error { c.defaultQueryMode = QueryMode(mode) + return nil } @@ -44,6 +45,7 @@ type queryBindConnectorOption struct { func (o queryBindConnectorOption) Apply(c *Connector) error { c.Bindings = bind.Sort(append(c.Bindings, o.Bind)) + return nil } @@ -54,6 +56,7 @@ type tablePathPrefixConnectorOption struct { func (o tablePathPrefixConnectorOption) Apply(c *Connector) error { c.Bindings = bind.Sort(append(c.Bindings, o.TablePathPrefix)) c.pathNormalizer = o.TablePathPrefix + return nil } @@ -75,6 +78,7 @@ type defaultTxControlOption struct { func (opt defaultTxControlOption) Apply(c *Connector) error { c.defaultTxControl = opt.txControl + return nil } @@ -86,6 +90,7 @@ type defaultDataQueryOptionsConnectorOption []options.ExecuteDataQueryOption func (opts defaultDataQueryOptionsConnectorOption) Apply(c *Connector) error { c.defaultDataQueryOpts = append(c.defaultDataQueryOpts, opts...) + return nil } @@ -97,6 +102,7 @@ type defaultScanQueryOptionsConnectorOption []options.ExecuteScanQueryOption func (opts defaultScanQueryOptionsConnectorOption) Apply(c *Connector) error { c.defaultScanQueryOpts = append(c.defaultScanQueryOpts, opts...) + return nil } @@ -111,6 +117,7 @@ type traceConnectorOption struct { func (option traceConnectorOption) Apply(c *Connector) error { c.trace = c.trace.Compose(option.t, option.opts...) + return nil } @@ -122,6 +129,7 @@ type disableServerBalancerConnectorOption struct{} func (d disableServerBalancerConnectorOption) Apply(c *Connector) error { c.disableServerBalancer = true + return nil } @@ -133,6 +141,7 @@ type idleThresholdConnectorOption time.Duration func (idleThreshold idleThresholdConnectorOption) Apply(c *Connector) error { c.idleThreshold = time.Duration(idleThreshold) + return nil } @@ -144,6 +153,7 @@ type onCloseConnectorOption func(connector *Connector) func (f onCloseConnectorOption) Apply(c *Connector) error { c.onClose = append(c.onClose, f) + return nil } @@ -157,6 +167,7 @@ type traceRetryConnectorOption struct { func (t traceRetryConnectorOption) Apply(c *Connector) error { c.traceRetry = t.t + return nil } @@ -168,6 +179,7 @@ type fakeTxConnectorOption QueryMode func (m fakeTxConnectorOption) Apply(c *Connector) error { c.fakeTxModes = append(c.fakeTxModes, QueryMode(m)) + return nil } @@ -203,6 +215,7 @@ func Open(parent ydbDriver, opts ...ConnectorOption) (_ *Connector, err error) { if c.idleThreshold > 0 { c.idleStopper = c.idleCloser() } + return c, nil } @@ -267,6 +280,7 @@ func (c *Connector) idleCloser() (idleStopper func()) { } } }() + return idleStopper } @@ -279,6 +293,7 @@ func (c *Connector) Close() (err error) { if c.idleStopper != nil { c.idleStopper() } + return nil } diff --git a/internal/xsql/context.go b/internal/xsql/context.go index 0b694e118..af1516de0 100644 --- a/internal/xsql/context.go +++ b/internal/xsql/context.go @@ -31,6 +31,7 @@ func queryModeFromContext(ctx context.Context, defaultQueryMode QueryMode) Query if m, ok := ctx.Value(ctxModeTypeKey{}).(QueryMode); ok { return m } + return defaultQueryMode } @@ -47,6 +48,7 @@ func txControl(ctx context.Context, defaultTxControl *table.TransactionControl) if txc, ok := ctx.Value(ctxTransactionControlKey{}).(*table.TransactionControl); ok { return txc } + return defaultTxControl } @@ -64,6 +66,7 @@ func (c *conn) scanQueryOptions(ctx context.Context) []options.ExecuteScanQueryO if opts, ok := ctx.Value(ctxScanQueryOptionsKey{}).([]options.ExecuteScanQueryOption); ok { return append(c.scanOpts, opts...) } + return c.scanOpts } @@ -81,6 +84,7 @@ func (c *conn) dataQueryOptions(ctx context.Context) []options.ExecuteDataQueryO if opts, ok := ctx.Value(ctxDataQueryOptionsKey{}).([]options.ExecuteDataQueryOption); ok { return append(c.dataOpts, opts...) } + return c.dataOpts } diff --git a/internal/xsql/dsn.go b/internal/xsql/dsn.go index 5fbff80ce..508308995 100644 --- a/internal/xsql/dsn.go +++ b/internal/xsql/dsn.go @@ -79,6 +79,7 @@ func Parse(dataSourceName string) (opts []config.Option, connectorOpts []Connect } connectorOpts = append(connectorOpts, binders...) } + return opts, connectorOpts, nil } @@ -92,5 +93,6 @@ func extractTablePathPrefixFromBinderName(binderName string) (string, error) { if len(ss) != 1 || len(ss[0]) != 2 || ss[0][1] == "" { return "", xerrors.WithStackTrace(fmt.Errorf("%w: %s", errWrongTablePathPrefix, binderName)) } + return ss[0][1], nil } diff --git a/internal/xsql/dsn_test.go b/internal/xsql/dsn_test.go index 309f9bf6a..557072701 100644 --- a/internal/xsql/dsn_test.go +++ b/internal/xsql/dsn_test.go @@ -17,6 +17,7 @@ func TestParse(t *testing.T) { t.Error(err) } } + return c } compareConfigs := func(t *testing.T, lhs, rhs *config.Config) { diff --git a/internal/xsql/errors.go b/internal/xsql/errors.go index 65c36486d..9d1af54c0 100644 --- a/internal/xsql/errors.go +++ b/internal/xsql/errors.go @@ -26,6 +26,7 @@ func (err *ErrConnAlreadyHaveTx) As(target interface{}) bool { switch t := target.(type) { case *ErrConnAlreadyHaveTx: t.currentTx = err.currentTx + return true default: return false diff --git a/internal/xsql/isolation/isolation.go b/internal/xsql/isolation/isolation.go index 2b1f026cf..e7f6a7b9d 100644 --- a/internal/xsql/isolation/isolation.go +++ b/internal/xsql/isolation/isolation.go @@ -25,6 +25,7 @@ func ToYDB(opts driver.TxOptions) (txcControl table.TxOption, err error) { return table.WithSnapshotReadOnly(), nil } } + return nil, xerrors.WithStackTrace(fmt.Errorf( "unsupported transaction options: %+v", opts, )) diff --git a/internal/xsql/mode.go b/internal/xsql/mode.go index 0070020c0..298bbd64e 100644 --- a/internal/xsql/mode.go +++ b/internal/xsql/mode.go @@ -36,6 +36,7 @@ func (t QueryMode) String() string { if s, ok := typeToString[t]; ok { return s } + return fmt.Sprintf("unknown_mode_%d", t) } @@ -43,5 +44,6 @@ func QueryModeFromString(s string) QueryMode { if t, ok := stringToType[s]; ok { return t } + return UnknownQueryMode } diff --git a/internal/xsql/rows.go b/internal/xsql/rows.go index d4a1ded6e..01dccaeb3 100644 --- a/internal/xsql/rows.go +++ b/internal/xsql/rows.go @@ -50,6 +50,7 @@ func (r *rows) Columns() []string { cs = append(cs, m.Name) } }) + return cs } @@ -97,6 +98,7 @@ func (r *rows) NextResultSet() (finalErr error) { if err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return nil } @@ -131,6 +133,7 @@ func (r *rows) Next(dst []driver.Value) error { if err = r.result.Err(); err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return nil } @@ -147,6 +150,7 @@ func (r *single) Columns() (columns []string) { for i := range r.values { columns = append(columns, r.values[i].Name) } + return columns } @@ -162,5 +166,6 @@ func (r *single) Next(dst []driver.Value) error { dst[i] = r.values[i].Value } r.readAll = true + return nil } diff --git a/internal/xsql/stmt.go b/internal/xsql/stmt.go index 99d1d3131..82d80a916 100644 --- a/internal/xsql/stmt.go +++ b/internal/xsql/stmt.go @@ -76,6 +76,7 @@ func (s *stmt) Close() (finalErr error) { defer func() { onDone(finalErr) }() + return nil } diff --git a/internal/xsql/tx.go b/internal/xsql/tx.go index 5a135c0c9..24eab6e73 100644 --- a/internal/xsql/tx.go +++ b/internal/xsql/tx.go @@ -49,6 +49,7 @@ func (c *conn) beginTx(ctx context.Context, txOptions driver.TxOptions) (current txCtx: ctx, tx: transaction, } + return c.currentTx, nil } @@ -65,6 +66,7 @@ func (tx *tx) checkTxState() error { tx.ID(), tx.conn.ID(), ) } + return fmt.Errorf("broken conn state: tx=%s not related to conn=%q (conn have current tx=%q)", tx.conn.currentTx.ID(), tx.conn.ID(), tx.ID(), ) @@ -88,6 +90,7 @@ func (tx *tx) Commit() (finalErr error) { if err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return nil } @@ -109,6 +112,7 @@ func (tx *tx) Rollback() (finalErr error) { if err != nil { return badconn.Map(xerrors.WithStackTrace(err)) } + return err } @@ -147,6 +151,7 @@ func (tx *tx) QueryContext(ctx context.Context, query string, args []driver.Name if err = res.Err(); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return &rows{ conn: tx.conn, result: res, @@ -185,6 +190,7 @@ func (tx *tx) ExecContext(ctx context.Context, query string, args []driver.Named if err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return resultNoRows{}, nil } @@ -199,6 +205,7 @@ func (tx *tx) PrepareContext(ctx context.Context, query string) (_ driver.Stmt, if !tx.conn.isReady() { return nil, badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) } + return &stmt{ conn: tx.conn, processor: tx, diff --git a/internal/xsql/tx_fake.go b/internal/xsql/tx_fake.go index 1488e00b6..662fcd078 100644 --- a/internal/xsql/tx_fake.go +++ b/internal/xsql/tx_fake.go @@ -29,6 +29,7 @@ func (tx *txFake) PrepareContext(ctx context.Context, query string) (_ driver.St if !tx.conn.isReady() { return nil, badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) } + return &stmt{ conn: tx.conn, processor: tx, @@ -70,6 +71,7 @@ func (tx *txFake) Commit() (err error) { if !tx.conn.isReady() { return badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) } + return nil } @@ -87,6 +89,7 @@ func (tx *txFake) Rollback() (err error) { if !tx.conn.isReady() { return badconn.Map(xerrors.WithStackTrace(errNotReadyConn)) } + return err } @@ -105,6 +108,7 @@ func (tx *txFake) QueryContext(ctx context.Context, query string, args []driver. if err != nil { return nil, xerrors.WithStackTrace(err) } + return rows, nil } @@ -123,5 +127,6 @@ func (tx *txFake) ExecContext(ctx context.Context, query string, args []driver.N if err != nil { return nil, xerrors.WithStackTrace(err) } + return result, nil } diff --git a/internal/xsql/unwrap.go b/internal/xsql/unwrap.go index 39755e50e..5f54b0252 100644 --- a/internal/xsql/unwrap.go +++ b/internal/xsql/unwrap.go @@ -15,17 +15,21 @@ func Unwrap[T *sql.DB | *sql.Conn](v T) (connector *Connector, err error) { if dw, ok := d.(*driverWrapper); ok { return dw.c, nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("%T is not a *driverWrapper", d)) case *sql.Conn: if err = vv.Raw(func(driverConn interface{}) error { if cc, ok := driverConn.(*conn); ok { connector = cc.connector + return nil } + return xerrors.WithStackTrace(fmt.Errorf("%T is not a *conn", driverConn)) }); err != nil { return nil, badconn.Map(xerrors.WithStackTrace(err)) } + return connector, nil default: return nil, xerrors.WithStackTrace(fmt.Errorf("unknown type %T for Unwrap", vv)) diff --git a/internal/xsql/valuer.go b/internal/xsql/valuer.go index 750d52819..e99b54b0f 100644 --- a/internal/xsql/valuer.go +++ b/internal/xsql/valuer.go @@ -8,6 +8,7 @@ type valuer struct { func (v *valuer) UnmarshalYDB(raw types.RawValue) error { v.v = raw.Any() + return nil } diff --git a/internal/xstring/convert.go b/internal/xstring/convert.go index 7881a16cb..eb7ee4b05 100644 --- a/internal/xstring/convert.go +++ b/internal/xstring/convert.go @@ -11,6 +11,7 @@ func FromBytes(b []byte) string { if len(b) == 0 { return "" } + return unsafe.String(&b[0], len(b)) } @@ -18,5 +19,6 @@ func ToBytes(s string) (b []byte) { if s == "" { return nil } + return unsafe.Slice(unsafe.StringData(s), len(s)) } diff --git a/internal/xtest/context.go b/internal/xtest/context.go index 38cd0b73b..318cac0ba 100644 --- a/internal/xtest/context.go +++ b/internal/xtest/context.go @@ -17,6 +17,7 @@ func Context(t testing.TB) context.Context { pprof.SetGoroutineLabels(ctx) cancel() }) + return ctx } @@ -27,5 +28,6 @@ func ContextWithCommonTimeout(ctx context.Context, t testing.TB) context.Context ctx, ctxCancel := xcontext.WithTimeout(ctx, commonWaitTimeout) _ = ctxCancel // suppress linters, it is ok for leak for small amount of time: it will cancel by parent context + return ctx } diff --git a/internal/xtest/grpclogger.go b/internal/xtest/grpclogger.go index f42ddcc90..b36c05483 100644 --- a/internal/xtest/grpclogger.go +++ b/internal/xtest/grpclogger.go @@ -42,6 +42,7 @@ func (l GrpcLogger) UnaryClientInterceptor( req, reply, ) + return err } @@ -64,6 +65,7 @@ func (l GrpcLogger) StreamClientInterceptor( err, streamWrapper.streamID, ) + return stream, err } @@ -80,17 +82,20 @@ func newGrpcLoggerStream(stream grpc.ClientStream, t testing.TB) grpcLoggerStrea func (g grpcLoggerStream) CloseSend() error { err := g.ClientStream.CloseSend() g.t.Logf("CloseSend: %v (streamID: %v)", err, g.streamID) + return err } func (g grpcLoggerStream) SendMsg(m interface{}) error { err := g.ClientStream.SendMsg(m) g.t.Logf("SendMsg (streamID: %v) with err '%v':\n%v ", g.streamID, err, m) + return err } func (g grpcLoggerStream) RecvMsg(m interface{}) error { err := g.ClientStream.RecvMsg(m) g.t.Logf("RecvMsg (streamID: %v) with err '%v':\n%v ", g.streamID, err, m) + return err } diff --git a/internal/xtest/waiters.go b/internal/xtest/waiters.go index 1f09cb7f7..34389c1c0 100644 --- a/internal/xtest/waiters.go +++ b/internal/xtest/waiters.go @@ -64,6 +64,7 @@ func SpinWaitConditionWithTimeout(tb testing.TB, l sync.Locker, condWaitTimeout l.Lock() defer l.Unlock() } + return cond() } @@ -102,6 +103,7 @@ func SpinWaitProgressWithTimeout( SpinWaitConditionWithTimeout(tb, nil, timeout, func() bool { progressValue, finished := progress() + return finished || progressValue != currentValue }) } diff --git a/log/context.go b/log/context.go index f376f47ce..81231df01 100644 --- a/log/context.go +++ b/log/context.go @@ -13,6 +13,7 @@ func WithLevel(ctx context.Context, lvl Level) context.Context { func LevelFromContext(ctx context.Context) Level { v, _ := ctx.Value(ctxLevelKey{}).(Level) + return v } @@ -25,6 +26,7 @@ func NamesFromContext(ctx context.Context) []string { if v == nil { return []string{} } + return v } diff --git a/log/discovery.go b/log/discovery.go index 84b8d1228..452c61876 100644 --- a/log/discovery.go +++ b/log/discovery.go @@ -22,6 +22,7 @@ func internalDiscovery(l Logger, d trace.Detailer) (t trace.Discovery) { String("database", info.Database), ) start := time.Now() + return func(info trace.DiscoveryDiscoverDoneInfo) { if info.Error == nil { l.Log(WithLevel(ctx, INFO), "done", @@ -44,6 +45,7 @@ func internalDiscovery(l Logger, d trace.Detailer) (t trace.Discovery) { ctx := with(*info.Context, TRACE, "ydb", "discovery", "whoAmI") l.Log(ctx, "start") start := time.Now() + return func(info trace.DiscoveryWhoAmIDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -60,5 +62,6 @@ func internalDiscovery(l Logger, d trace.Detailer) (t trace.Discovery) { } } } + return t } diff --git a/log/driver.go b/log/driver.go index c381fa957..a94ffb262 100644 --- a/log/driver.go +++ b/log/driver.go @@ -29,6 +29,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy String("target", target), Strings("resolved", addresses), ) + return func(info trace.DriverResolveDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -59,6 +60,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Bool("secure", secure), ) start := time.Now() + return func(info trace.DriverInitDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -86,6 +88,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy ctx := with(*info.Context, TRACE, "ydb", "driver", "resolver", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.DriverCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -110,6 +113,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Stringer("endpoint", endpoint), ) start := time.Now() + return func(info trace.DriverConnDialDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -137,6 +141,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Stringer("state", info.State), ) start := time.Now() + return func(info trace.DriverConnStateChangeDoneInfo) { l.Log(ctx, "done", Stringer("endpoint", endpoint), @@ -155,6 +160,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Stringer("endpoint", endpoint), ) start := time.Now() + return func(info trace.DriverConnParkDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -181,6 +187,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Stringer("endpoint", endpoint), ) start := time.Now() + return func(info trace.DriverConnCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -209,6 +216,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy String("method", method), ) start := time.Now() + return func(info trace.DriverConnInvokeDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -247,6 +255,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy String("method", method), ) start := time.Now() + return func(info trace.DriverConnNewStreamRecvInfo) func(trace.DriverConnNewStreamDoneInfo) { if info.Error == nil { l.Log(ctx, "intermediate receive", @@ -263,6 +272,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy versionField(), ) } + return func(info trace.DriverConnNewStreamDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -296,6 +306,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy versionField(), ) start := time.Now() + return func(info trace.DriverConnBanDoneInfo) { l.Log(WithLevel(ctx, WARN), "done", Stringer("endpoint", endpoint), @@ -315,6 +326,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Stringer("endpoint", endpoint), ) start := time.Now() + return func(info trace.DriverConnAllowDoneInfo) { l.Log(ctx, "done", Stringer("endpoint", endpoint), @@ -335,6 +347,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy String("event", event), ) start := time.Now() + return func(info trace.DriverRepeaterWakeUpDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -360,6 +373,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "init") l.Log(ctx, "start") start := time.Now() + return func(info trace.DriverBalancerInitDoneInfo) { l.Log(WithLevel(ctx, INFO), "done", latencyField(start), @@ -373,6 +387,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.DriverBalancerCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -398,6 +413,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "choose", "endpoint") l.Log(ctx, "start") start := time.Now() + return func(info trace.DriverBalancerChooseEndpointDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -426,6 +442,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy Bool("needLocalDC", info.NeedLocalDC), ) start := time.Now() + return func(info trace.DriverBalancerUpdateDoneInfo) { l.Log(ctx, "done", latencyField(start), @@ -443,6 +460,7 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy ctx := with(*info.Context, TRACE, "ydb", "driver", "credentials", "get") l.Log(ctx, "start") start := time.Now() + return func(info trace.DriverGetCredentialsDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -459,5 +477,6 @@ func internalDriver(l Logger, d trace.Detailer) (t trace.Driver) { //nolint:gocy } } } + return t } diff --git a/log/field.go b/log/field.go index 605064987..af6f65598 100644 --- a/log/field.go +++ b/log/field.go @@ -51,30 +51,35 @@ func (f Field) Key() string { // StringValue is a value getter for fields with StringType type func (f Field) StringValue() string { f.checkType(StringType) + return f.vstr } // IntValue is a value getter for fields with IntType type func (f Field) IntValue() int { f.checkType(IntType) + return int(f.vint) } // Int64Value is a value getter for fields with Int64Type type func (f Field) Int64Value() int64 { f.checkType(Int64Type) + return f.vint } // BoolValue is a value getter for fields with BoolType type func (f Field) BoolValue() bool { f.checkType(BoolType) + return f.vint != 0 } // DurationValue is a value getter for fields with DurationType type func (f Field) DurationValue() time.Duration { f.checkType(DurationType) + return time.Nanosecond * time.Duration(f.vint) } @@ -84,6 +89,7 @@ func (f Field) StringsValue() []string { if f.vany == nil { return nil } + return f.vany.([]string) } @@ -93,6 +99,7 @@ func (f Field) ErrorValue() error { if f.vany == nil { return nil } + return f.vany.(error) } @@ -128,6 +135,7 @@ func (f Field) Stringer() fmt.Stringer { if f.vany == nil { return nil } + return f.vany.(fmt.Stringer) } @@ -156,6 +164,7 @@ func (f Field) String() string { if f.vany == nil || f.vany.(error) == nil { return "" } + return f.ErrorValue().Error() case AnyType: if f.vany == nil { @@ -165,8 +174,10 @@ func (f Field) String() string { if v.IsNil() { return nilPtr } + return v.Type().String() + "(" + fmt.Sprint(v.Elem()) + ")" } + return fmt.Sprint(f.vany) case StringerType: return f.Stringer().String() @@ -209,6 +220,7 @@ func Bool(key string, value bool) Field { } else { vint = 0 } + return Field{ ftype: BoolType, key: key, @@ -263,6 +275,7 @@ func Stringer(key string, value fmt.Stringer) Field { if value == nil { return Any(key, nil) } + return Field{ ftype: StringerType, key: key, @@ -327,6 +340,7 @@ func (ft FieldType) String() (typeName string) { default: panic("not implemented") } + return typeName } @@ -353,6 +367,7 @@ func (ee endpoints) String() string { b.WriteString(e.String()) } b.WriteByte(']') + return b.String() } @@ -363,6 +378,7 @@ func (m metadata) String() string { if err != nil { return fmt.Sprintf("error:%s", err) } + return xstring.FromBytes(b) } @@ -370,5 +386,6 @@ func appendFieldByCondition(condition bool, ifTrueField Field, fields ...Field) if condition { fields = append(fields, ifTrueField) } + return fields } diff --git a/log/field_test.go b/log/field_test.go index 73b3f8e49..af2dfb217 100644 --- a/log/field_test.go +++ b/log/field_test.go @@ -48,11 +48,13 @@ func TestField_String(t *testing.T) { // Known fieldType, but String() panics with it. if tt.panic { require.Panics(t, func() { _ = tt.f.String() }) + return } // Unknown fieldType, maybe a new one has been added if tt.fail { t.Fail() + return } require.Equal(t, tt.want, tt.f.String()) diff --git a/log/logger.go b/log/logger.go index c5391180a..e3981058e 100644 --- a/log/logger.go +++ b/log/logger.go @@ -36,6 +36,7 @@ func Default(w io.Writer, opts ...simpleLoggerOption) *defaultLogger { for _, o := range opts { o.applySimpleOption(l) } + return l } @@ -77,6 +78,7 @@ func (l *defaultLogger) format(namespace []string, msg string, logLevel Level) s if l.coloring { b.WriteString(colorReset) } + return b.String() } @@ -107,6 +109,7 @@ func wrapLogger(l Logger, opts ...Option) *wrapper { o.applyHolderOption(ll) } } + return ll } @@ -125,6 +128,7 @@ func (l *defaultLogger) appendFields(msg string, fields ...Field) string { fmt.Fprintf(b, `%q:%q`, fields[i].Key(), fields[i].String()) } b.WriteByte('}') + return b.String() } diff --git a/log/retry.go b/log/retry.go index a9a488914..8b52911b7 100644 --- a/log/retry.go +++ b/log/retry.go @@ -32,6 +32,7 @@ func internalRetry(l Logger, d trace.Detailer) (t trace.Retry) { Bool("idempotent", idempotent), ) start := time.Now() + return func(info trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { if info.Error == nil { l.Log(ctx, "attempt done", @@ -54,6 +55,7 @@ func internalRetry(l Logger, d trace.Detailer) (t trace.Retry) { versionField(), ) } + return func(info trace.RetryLoopDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -81,5 +83,6 @@ func internalRetry(l Logger, d trace.Detailer) (t trace.Retry) { } } } + return t } diff --git a/log/scripting.go b/log/scripting.go index 6d45d60a1..4af256cb1 100644 --- a/log/scripting.go +++ b/log/scripting.go @@ -19,6 +19,7 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { ctx := with(*info.Context, TRACE, "ydb", "scripting", "execute") l.Log(ctx, "start") start := time.Now() + return func(info trace.ScriptingExecuteDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -42,6 +43,7 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { ctx := with(*info.Context, TRACE, "ydb", "scripting", "explain") l.Log(ctx, "start") start := time.Now() + return func(info trace.ScriptingExplainDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -75,6 +77,7 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { )..., ) start := time.Now() + return func( info trace.ScriptingStreamExecuteIntermediateInfo, ) func( @@ -88,6 +91,7 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { versionField(), ) } + return func(info trace.ScriptingStreamExecuteDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -116,6 +120,7 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { ctx := with(*info.Context, TRACE, "ydb", "scripting", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.ScriptingCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -130,5 +135,6 @@ func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) { } } } + return t } diff --git a/log/sql.go b/log/sql.go index a89994b37..3a71f3cb7 100644 --- a/log/sql.go +++ b/log/sql.go @@ -25,6 +25,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(*info.Context, TRACE, "ydb", "database", "sql", "connector", "connect") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLConnectorConnectDoneInfo) { if info.Error == nil { l.Log(WithLevel(ctx, DEBUG), "connected", @@ -49,6 +50,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(*info.Context, TRACE, "ydb", "database", "sql", "conn", "ping") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLConnPingDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -70,6 +72,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(context.Background(), TRACE, "ydb", "database", "sql", "conn", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLConnCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -91,6 +94,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(*info.Context, TRACE, "ydb", "database", "sql", "conn", "begin", "tx") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLConnBeginDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -117,6 +121,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ) query := info.Query start := time.Now() + return func(info trace.DatabaseSQLConnPrepareDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -147,6 +152,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { query := info.Query idempotent := info.Idempotent start := time.Now() + return func(info trace.DatabaseSQLConnExecDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -181,6 +187,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { query := info.Query idempotent := info.Idempotent start := time.Now() + return func(info trace.DatabaseSQLConnQueryDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -209,6 +216,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(*info.Context, TRACE, "ydb", "database", "sql", "tx", "commit") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLTxCommitDoneInfo) { if info.Error == nil { l.Log(ctx, "committed", @@ -230,6 +238,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(*info.Context, TRACE, "ydb", "database", "sql", "tx", "rollback") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLTxRollbackDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -251,6 +260,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ctx := with(context.Background(), TRACE, "ydb", "database", "sql", "stmt", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.DatabaseSQLStmtCloseDoneInfo) { if info.Error == nil { l.Log(ctx, "closed", @@ -277,6 +287,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ) query := info.Query start := time.Now() + return func(info trace.DatabaseSQLStmtExecDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -307,6 +318,7 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { ) query := info.Query start := time.Now() + return func(info trace.DatabaseSQLStmtQueryDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -324,5 +336,6 @@ func internalDatabaseSQL(l *wrapper, d trace.Detailer) (t trace.DatabaseSQL) { } } } + return t } diff --git a/log/table.go b/log/table.go index 0570dcbf1..5afa72bee 100644 --- a/log/table.go +++ b/log/table.go @@ -34,6 +34,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("label", label), ) start := time.Now() + return func(info trace.TableDoIntermediateInfo) func(trace.TableDoDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -58,6 +59,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { versionField(), ) } + return func(info trace.TableDoDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -105,6 +107,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("label", label), ) start := time.Now() + return func(info trace.TableDoTxIntermediateInfo) func(trace.TableDoTxDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -129,6 +132,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { versionField(), ) } + return func(info trace.TableDoTxDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -171,6 +175,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "create", "session") l.Log(ctx, "start") start := time.Now() + return func(info trace.TableCreateSessionIntermediateInfo) func(trace.TableCreateSessionDoneInfo) { if info.Error == nil { l.Log(ctx, "intermediate", @@ -183,6 +188,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { versionField(), ) } + return func(info trace.TableCreateSessionDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -209,6 +215,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "session", "new") l.Log(ctx, "start") start := time.Now() + return func(info trace.TableSessionNewDoneInfo) { if info.Error == nil { if info.Session != nil { @@ -242,6 +249,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("status", info.Session.Status()), ) start := time.Now() + return func(info trace.TableSessionDeleteDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -271,6 +279,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("status", session.Status()), ) start := time.Now() + return func(info trace.TableKeepAliveDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -308,6 +317,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { )..., ) start := time.Now() + return func(info trace.TablePrepareDataQueryDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -354,6 +364,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { )..., ) start := time.Now() + return func(info trace.TableExecuteDataQueryDoneInfo) { if info.Error == nil { tx := info.Tx @@ -404,6 +415,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { )..., ) start := time.Now() + return func( info trace.TableSessionQueryStreamExecuteIntermediateInfo, ) func( @@ -417,6 +429,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { versionField(), ) } + return func(info trace.TableSessionQueryStreamExecuteDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -460,6 +473,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("status", session.Status()), ) start := time.Now() + return func( info trace.TableSessionQueryStreamReadIntermediateInfo, ) func( @@ -473,6 +487,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { versionField(), ) } + return func(info trace.TableSessionQueryStreamReadDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -507,6 +522,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("status", session.Status()), ) start := time.Now() + return func(info trace.TableSessionTransactionBeginDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -543,6 +559,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("tx", info.Tx.ID()), ) start := time.Now() + return func(info trace.TableSessionTransactionCommitDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -580,6 +597,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("tx", tx.ID()), ) start := time.Now() + return func(info trace.TableSessionTransactionRollbackDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -607,6 +625,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "init") l.Log(ctx, "start") start := time.Now() + return func(info trace.TableInitDoneInfo) { l.Log(WithLevel(ctx, INFO), "done", latencyField(start), @@ -621,6 +640,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "close") l.Log(ctx, "start") start := time.Now() + return func(info trace.TableCloseDoneInfo) { if info.Error == nil { l.Log(WithLevel(ctx, INFO), "done", @@ -676,6 +696,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { String("status", session.Status()), ) start := time.Now() + return func(info trace.TablePoolPutDoneInfo) { if info.Error == nil { l.Log(ctx, "done", @@ -701,6 +722,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "pool", "get") l.Log(ctx, "start") start := time.Now() + return func(info trace.TablePoolGetDoneInfo) { if info.Error == nil { session := info.Session @@ -727,6 +749,7 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { ctx := with(*info.Context, TRACE, "ydb", "table", "pool", "wait") l.Log(ctx, "start") start := time.Now() + return func(info trace.TablePoolWaitDoneInfo) { fields := []Field{ latencyField(start), @@ -745,5 +768,6 @@ func internalTable(l *wrapper, d trace.Detailer) (t trace.Table) { } } } + return t } diff --git a/log/topic.go b/log/topic.go index b3a1e0493..87d645d9b 100644 --- a/log/topic.go +++ b/log/topic.go @@ -22,6 +22,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl ctx := with(context.Background(), TRACE, "ydb", "topic", "reader", "reconnect") start := time.Now() l.Log(ctx, "start") + return func(doneInfo trace.TopicReaderReconnectDoneInfo) { l.Log(WithLevel(ctx, INFO), "reconnected", NamedError("reason", info.Reason), @@ -53,6 +54,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int64("partition_id", info.PartitionID), Int64("partition_session_id", info.PartitionSessionID), ) + return func(doneInfo trace.TopicReaderPartitionReadStartResponseDoneInfo) { fields := []Field{ String("topic", info.Topic), @@ -98,6 +100,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int64("partition_session_id", info.PartitionSessionID), Int64("committed_offset", info.CommittedOffset), Bool("graceful", info.Graceful)) + return func(doneInfo trace.TopicReaderPartitionReadStopResponseDoneInfo) { fields := []Field{ String("reader_connection_id", info.ReaderConnectionID), @@ -133,6 +136,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int64("commit_start_offset", info.StartOffset), Int64("commit_end_offset", info.EndOffset), ) + return func(doneInfo trace.TopicReaderCommitDoneInfo) { fields := []Field{ String("topic", info.Topic), @@ -173,6 +177,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int64("commit_end_offset", commitInfo[i].EndOffset), ) } + return func(doneInfo trace.TopicReaderSendCommitMessageDoneInfo) { for i := range commitInfo { fields := []Field{ @@ -219,6 +224,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl String("reader_connection_id", info.ReaderConnectionID), NamedError("close_reason", info.CloseReason), ) + return func(doneInfo trace.TopicReaderCloseDoneInfo) { fields := []Field{ String("reader_connection_id", info.ReaderConnectionID), @@ -248,6 +254,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl String("consumer", info.InitRequestInfo.GetConsumer()), Strings("topics", info.InitRequestInfo.GetTopics()), ) + return func(doneInfo trace.TopicReaderInitDoneInfo) { fields := []Field{ String("pre_init_reader_connection_id", info.PreInitReaderConnectionID), @@ -291,6 +298,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl l.Log(ctx, "token updating...", String("reader_connection_id", info.ReaderConnectionID), ) + return func( updateTokenInfo trace.OnReadUpdateTokenMiddleTokenReceivedInfo, ) func(doneInfo trace.OnReadStreamUpdateTokenDoneInfo) { @@ -309,6 +317,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl versionField(), ) } + return func(doneInfo trace.OnReadStreamUpdateTokenDoneInfo) { if doneInfo.Error == nil { l.Log(ctx, "token updated on stream", @@ -356,6 +365,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int("batches_count", batchesCount), Int("messages_count", messagesCount), ) + return func(doneInfo trace.TopicReaderReceiveDataResponseDoneInfo) { if doneInfo.Error == nil { l.Log(ctx, "data response received and processed", @@ -395,6 +405,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int("max_count", info.MaxCount), Int("local_capacity_before", info.FreeBufferCapacity), ) + return func(doneInfo trace.TopicReaderReadMessagesDoneInfo) { if doneInfo.Error == nil { l.Log(ctx, "read messages returned", @@ -443,6 +454,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl String("writer_instance_id", info.WriterInstanceID), Int("attempt", info.Attempt), ) + return func(doneInfo trace.TopicWriterReconnectDoneInfo) { if doneInfo.Error == nil { l.Log(WithLevel(ctx, DEBUG), "connect to topic writer stream completed", @@ -510,6 +522,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl String("writer_instance_id", info.WriterInstanceID), NamedError("reason", info.Reason), ) + return func(doneInfo trace.TopicWriterCloseDoneInfo) { if doneInfo.Error == nil { l.Log(WithLevel(ctx, DEBUG), "close topic writer completed", @@ -544,6 +557,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int("messages_count", info.MessagesCount), Int64("first_seqno", info.FirstSeqNo), ) + return func(doneInfo trace.TopicWriterCompressMessagesDoneInfo) { if doneInfo.Error == nil { l.Log(ctx, "compress message completed", @@ -585,6 +599,7 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl Int("messages_count", info.MessagesCount), Int64("first_seqno", info.FirstSeqNo), ) + return func(doneInfo trace.TopicWriterSendMessagesDoneInfo) { if doneInfo.Error == nil { l.Log(ctx, "send messages completed", @@ -619,5 +634,6 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) { //nolint:gocycl String("session_id", info.SessionID), ) } + return t } diff --git a/meta/consumed_units.go b/meta/consumed_units.go index 48f89b7b2..ea4617962 100644 --- a/meta/consumed_units.go +++ b/meta/consumed_units.go @@ -20,5 +20,6 @@ func ConsumedUnits(md metadata.MD) (consumedUnits uint64) { } } } + return consumedUnits } diff --git a/meta/example_test.go b/meta/example_test.go index 50a5af4ae..97ae1e67b 100644 --- a/meta/example_test.go +++ b/meta/example_test.go @@ -48,6 +48,7 @@ func Example_consumedUnitsCount() { } log.Printf("id=%v, myStr='%s'\n", id, myStr) } + return res.Err() // return finally result error for auto-retry with driver }, table.WithIdempotent(), diff --git a/metrics/driver.go b/metrics/driver.go index 257c2d4e4..f20e7ae09 100644 --- a/metrics/driver.go +++ b/metrics/driver.go @@ -31,6 +31,7 @@ func driver(config Config) (t trace.Driver) { endpoint = info.Endpoint.Address() nodeID = info.Endpoint.NodeID() ) + return func(info trace.DriverConnInvokeDoneInfo) { if config.Details()&trace.DriverConnEvents != 0 { requests.With(map[string]string{ @@ -55,6 +56,7 @@ func driver(config Config) (t trace.Driver) { endpoint = info.Endpoint.Address() nodeID = info.Endpoint.NodeID() ) + return func(info trace.DriverConnNewStreamRecvInfo) func(trace.DriverConnNewStreamDoneInfo) { return func(info trace.DriverConnNewStreamDoneInfo) { if config.Details()&trace.DriverConnEvents != 0 { @@ -76,12 +78,14 @@ func driver(config Config) (t trace.Driver) { "cause": errorBrief(info.Cause), }).Add(1) } + return nil } t.OnBalancerClusterDiscoveryAttempt = func(info trace.DriverBalancerClusterDiscoveryAttemptStartInfo) func( trace.DriverBalancerClusterDiscoveryAttemptDoneInfo, ) { eventType := repeater.EventType(*info.Context) + return func(info trace.DriverBalancerClusterDiscoveryAttemptDoneInfo) { balancersDiscoveries.With(map[string]string{ "status": errorBrief(info.Error), @@ -91,6 +95,7 @@ func driver(config Config) (t trace.Driver) { } t.OnBalancerUpdate = func(info trace.DriverBalancerUpdateStartInfo) func(trace.DriverBalancerUpdateDoneInfo) { eventType := repeater.EventType(*info.Context) + return func(info trace.DriverBalancerUpdateDoneInfo) { if config.Details()&trace.DriverBalancerEvents != 0 { balancerUpdates.With(map[string]string{ @@ -126,6 +131,7 @@ func driver(config Config) (t trace.Driver) { t.OnConnDial = func(info trace.DriverConnDialStartInfo) func(trace.DriverConnDialDoneInfo) { endpoint := info.Endpoint.Address() nodeID := info.Endpoint.NodeID() + return func(info trace.DriverConnDialDoneInfo) { if config.Details()&trace.DriverConnEvents != 0 { if info.Error == nil { @@ -144,7 +150,9 @@ func driver(config Config) (t trace.Driver) { "node_id": idToString(info.Endpoint.NodeID()), }).Add(-1) } + return nil } + return t } diff --git a/metrics/error_brief.go b/metrics/error_brief.go index d7fd0e8f2..241687da5 100644 --- a/metrics/error_brief.go +++ b/metrics/error_brief.go @@ -34,6 +34,7 @@ func errorBrief(err error) string { buffer.WriteString(errorBrief(netErr.Err)) buffer.WriteByte(')') } + return buffer.String() } if xerrors.Is(err, context.DeadlineExceeded) { @@ -54,5 +55,6 @@ func errorBrief(err error) string { if ydbErr := xerrors.Error(nil); xerrors.As(err, &ydbErr) { return ydbErr.Name() } + return "unknown" } diff --git a/metrics/retry.go b/metrics/retry.go index 0670a5d6e..35b0fe9a0 100644 --- a/metrics/retry.go +++ b/metrics/retry.go @@ -17,6 +17,7 @@ func retry(config Config) (t trace.Retry) { return nil } start := time.Now() + return func(info trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { if info.Error != nil && config.Details()&trace.RetryEvents != 0 { errs.With(map[string]string{ @@ -25,6 +26,7 @@ func retry(config Config) (t trace.Retry) { "final": "false", }).Inc() } + return func(info trace.RetryLoopDoneInfo) { if config.Details()&trace.RetryEvents != 0 { attempts.With(map[string]string{ @@ -42,5 +44,6 @@ func retry(config Config) (t trace.Retry) { } } } + return t } diff --git a/metrics/sql.go b/metrics/sql.go index a0ff32c69..66b1303a2 100644 --- a/metrics/sql.go +++ b/metrics/sql.go @@ -37,6 +37,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { } } } + return nil } t.OnConnClose = func(info trace.DatabaseSQLConnCloseStartInfo) func(trace.DatabaseSQLConnCloseDoneInfo) { @@ -45,6 +46,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { conns.With(nil).Add(-1) } } + return nil } t.OnConnBegin = func(info trace.DatabaseSQLConnBeginStartInfo) func(trace.DatabaseSQLConnBeginDoneInfo) { @@ -57,10 +59,12 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { txBeginLatency.With(nil).Record(time.Since(start)) } } + return nil } t.OnTxCommit = func(info trace.DatabaseSQLTxCommitStartInfo) func(trace.DatabaseSQLTxCommitDoneInfo) { start := time.Now() + return func(info trace.DatabaseSQLTxCommitDoneInfo) { if config.Details()&trace.DatabaseSQLTxEvents != 0 { txCommit.With(map[string]string{ @@ -72,6 +76,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { } t.OnTxExec = func(info trace.DatabaseSQLTxExecStartInfo) func(trace.DatabaseSQLTxExecDoneInfo) { start := time.Now() + return func(info trace.DatabaseSQLTxExecDoneInfo) { if config.Details()&trace.DatabaseSQLTxEvents != 0 { status := errorBrief(info.Error) @@ -84,6 +89,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { } t.OnTxQuery = func(info trace.DatabaseSQLTxQueryStartInfo) func(trace.DatabaseSQLTxQueryDoneInfo) { start := time.Now() + return func(info trace.DatabaseSQLTxQueryDoneInfo) { if config.Details()&trace.DatabaseSQLTxEvents != 0 { status := errorBrief(info.Error) @@ -96,6 +102,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { } t.OnTxRollback = func(info trace.DatabaseSQLTxRollbackStartInfo) func(trace.DatabaseSQLTxRollbackDoneInfo) { start := time.Now() + return func(info trace.DatabaseSQLTxRollbackDoneInfo) { if config.Details()&trace.DatabaseSQLTxEvents != 0 { txRollback.With(map[string]string{ @@ -113,6 +120,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { mode = info.Mode start = time.Now() ) + return func(info trace.DatabaseSQLConnExecDoneInfo) { if config.Details()&trace.DatabaseSQLEvents != 0 { inflight.With(nil).Add(-1) @@ -137,6 +145,7 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { mode = info.Mode start = time.Now() ) + return func(info trace.DatabaseSQLConnQueryDoneInfo) { if config.Details()&trace.DatabaseSQLEvents != 0 { inflight.With(nil).Add(-1) @@ -153,5 +162,6 @@ func databaseSQL(config Config) (t trace.DatabaseSQL) { } } } + return t } diff --git a/metrics/table.go b/metrics/table.go index 1b04bcc53..80dda3cec 100644 --- a/metrics/table.go +++ b/metrics/table.go @@ -38,6 +38,7 @@ func table(config Config) (t trace.Table) { "node_id": idToString(info.Session.NodeID()), }).Add(-1) } + return nil } t.OnPoolSessionAdd = func(info trace.TablePoolSessionAddInfo) { @@ -54,6 +55,7 @@ func table(config Config) (t trace.Table) { t.OnPoolGet = func(info trace.TablePoolGetStartInfo) func(trace.TablePoolGetDoneInfo) { wait.With(nil).Add(1) start := time.Now() + return func(info trace.TablePoolGetDoneInfo) { wait.With(nil).Add(-1) if info.Error == nil && config.Details()&trace.TablePoolEvents != 0 { @@ -72,7 +74,9 @@ func table(config Config) (t trace.Table) { } inflightLatency.With(nil).Record(time.Since(start.(time.Time))) } + return nil } + return t } diff --git a/metrics/traces.go b/metrics/traces.go index 5fc978606..1feaab9a3 100644 --- a/metrics/traces.go +++ b/metrics/traces.go @@ -9,6 +9,7 @@ func WithTraces(config Config) ydb.Option { return nil } config = config.WithSystem("ydb") + return ydb.MergeOptions( ydb.WithTraceDriver(driver(config)), ydb.WithTraceTable(table(config)), diff --git a/ratelimiter/example_test.go b/ratelimiter/example_test.go index b64afde4f..12f179bba 100644 --- a/ratelimiter/example_test.go +++ b/ratelimiter/example_test.go @@ -14,6 +14,7 @@ func Example() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -28,6 +29,7 @@ func Example() { }) if err != nil { fmt.Printf("failed to create node: %v", err) + return } defer func() { diff --git a/retry/context.go b/retry/context.go index ed2063070..a3898fc0b 100644 --- a/retry/context.go +++ b/retry/context.go @@ -22,5 +22,6 @@ func WithNonIdempotentOperation(ctx context.Context) context.Context { // Deprecated: context cannot store idempotent value now func IsOperationIdempotent(ctx context.Context) bool { v, ok := ctx.Value(ctxIsOperationIdempotentKey{}).(bool) + return ok && v } diff --git a/retry/errors.go b/retry/errors.go index ed540018f..4c091a720 100644 --- a/retry/errors.go +++ b/retry/errors.go @@ -10,5 +10,6 @@ func unwrapErrBadConn(err error) error { if xerrors.As(err, &e) { return e.Origin() } + return err } diff --git a/retry/errors_data_test.go b/retry/errors_data_test.go index 2a7edf076..a2ffafa91 100644 --- a/retry/errors_data_test.go +++ b/retry/errors_data_test.go @@ -19,6 +19,7 @@ func (t idempotency) String() string { if t { return "idempotent" } + return "non-idempotent" } diff --git a/retry/retry.go b/retry/retry.go index 50f9c0b99..d936fd5a2 100644 --- a/retry/retry.go +++ b/retry/retry.go @@ -287,6 +287,7 @@ func Retry(ctx context.Context, op retryOperation, opts ...Option) (finalErr err } }() } + return op(ctx) }() @@ -337,6 +338,7 @@ func Retry(ctx context.Context, op retryOperation, opts ...Option) (finalErr err // Check returns retry mode for queryErr. func Check(err error) (m retryMode) { code, errType, backoffType, deleteSession := xerrors.Check(err) + return retryMode{ code: code, errType: errType, diff --git a/retry/retry_test.go b/retry/retry_test.go index bb9818775..728c85e4e 100644 --- a/retry/retry_test.go +++ b/retry/retry_test.go @@ -126,6 +126,7 @@ func TestRetryWithCustomErrors(t *testing.T) { if i < limit { return tt.error } + return nil }) if tt.retriable { @@ -154,6 +155,7 @@ func TestRetryTransportDeadlineExceeded(t *testing.T) { if !(counter < cancelCounterValue) { cancel() } + return xerrors.Transport(grpcStatus.Error(code, "")) }, WithIdempotent(true)) require.ErrorIs(t, err, context.Canceled) @@ -174,6 +176,7 @@ func TestRetryTransportCancelled(t *testing.T) { if !(counter < cancelCounterValue) { cancel() } + return xerrors.Transport(grpcStatus.Error(code, "")) }, WithIdempotent(true)) require.ErrorIs(t, err, context.Canceled) diff --git a/retry/retryable_error.go b/retry/retryable_error.go index 441da19ae..e0778c1df 100644 --- a/retry/retryable_error.go +++ b/retry/retryable_error.go @@ -34,6 +34,7 @@ func RetryableError(err error, opts ...retryableErrorOption) error { retryableErrorOptions = append(retryableErrorOptions, xerrors.RetryableErrorOption(o)) } } + return retryableErrorOptions }()..., ) diff --git a/retry/sql.go b/retry/sql.go index c0525891c..115b685ad 100644 --- a/retry/sql.go +++ b/retry/sql.go @@ -71,6 +71,7 @@ func Do(ctx context.Context, db *sql.DB, op func(ctx context.Context, cc *sql.Co if err = op(xcontext.MarkRetryCall(ctx), cc); err != nil { return unwrapErrBadConn(xerrors.WithStackTrace(err)) } + return nil }, options.retryOptions...) if err != nil { @@ -78,6 +79,7 @@ func Do(ctx context.Context, db *sql.DB, op func(ctx context.Context, cc *sql.Co fmt.Errorf("operation failed with %d attempts: %w", attempts, err), ) } + return nil } @@ -173,6 +175,7 @@ func DoTx(ctx context.Context, db *sql.DB, op func(context.Context, *sql.Tx) err if err = tx.Commit(); err != nil { return unwrapErrBadConn(xerrors.WithStackTrace(err)) } + return nil }, options.retryOptions...) if err != nil { @@ -180,5 +183,6 @@ func DoTx(ctx context.Context, db *sql.DB, op func(context.Context, *sql.Tx) err fmt.Errorf("tx operation failed with %d attempts: %w", attempts, err), ) } + return nil } diff --git a/retry/sql_test.go b/retry/sql_test.go index d4a6c3d5f..935179834 100644 --- a/retry/sql_test.go +++ b/retry/sql_test.go @@ -25,12 +25,14 @@ var _ driver.Connector = &mockConnector{} func (m *mockConnector) Open(name string) (driver.Conn, error) { m.t.Log(stack.Record(0)) + return nil, driver.ErrSkip } func (m *mockConnector) Connect(ctx context.Context) (driver.Conn, error) { m.t.Log(stack.Record(0)) m.conns++ + return &mockConn{ t: m.t, queryErr: m.queryErr, @@ -40,6 +42,7 @@ func (m *mockConnector) Connect(ctx context.Context) (driver.Conn, error) { func (m *mockConnector) Driver() driver.Driver { m.t.Log(stack.Record(0)) + return m } @@ -60,6 +63,7 @@ var ( func (m *mockConn) Prepare(query string) (driver.Stmt, error) { m.t.Log(stack.Record(0)) + return nil, driver.ErrSkip } @@ -68,6 +72,7 @@ func (m *mockConn) PrepareContext(ctx context.Context, query string) (driver.Stm if m.closed { return nil, driver.ErrBadConn } + return &mockStmt{ t: m.t, conn: m, @@ -78,11 +83,13 @@ func (m *mockConn) PrepareContext(ctx context.Context, query string) (driver.Stm func (m *mockConn) Close() error { m.t.Log(stack.Record(0)) m.closed = true + return nil } func (m *mockConn) Begin() (driver.Tx, error) { m.t.Log(stack.Record(0)) + return nil, driver.ErrSkip } @@ -91,6 +98,7 @@ func (m *mockConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.T if m.closed { return nil, driver.ErrBadConn } + return m, nil } @@ -99,6 +107,7 @@ func (m *mockConn) QueryContext(ctx context.Context, query string, args []driver if xerrors.MustDeleteSession(m.execErr) { m.closed = true } + return nil, m.queryErr } @@ -107,16 +116,19 @@ func (m *mockConn) ExecContext(ctx context.Context, query string, args []driver. if xerrors.MustDeleteSession(m.execErr) { m.closed = true } + return nil, m.execErr } func (m *mockConn) Commit() error { m.t.Log(stack.Record(0)) + return nil } func (m *mockConn) Rollback() error { m.t.Log(stack.Record(0)) + return nil } @@ -134,31 +146,37 @@ var ( func (m *mockStmt) Close() error { m.t.Log(stack.Record(0)) + return nil } func (m *mockStmt) NumInput() int { m.t.Log(stack.Record(0)) + return -1 } func (m *mockStmt) Exec(args []driver.Value) (driver.Result, error) { m.t.Log(stack.Record(0)) + return nil, driver.ErrSkip } func (m *mockStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { m.t.Log(stack.Record(0)) + return m.conn.ExecContext(ctx, m.query, args) } func (m *mockStmt) Query(args []driver.Value) (driver.Rows, error) { m.t.Log(stack.Record(0)) + return nil, driver.ErrSkip } func (m *mockStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { m.t.Log(stack.Record(0)) + return m.conn.QueryContext(ctx, m.query, args) } @@ -191,6 +209,7 @@ func TestDoTx(t *testing.T) { defer func() { _ = rows.Close() }() + return rows.Err() }, WithIdempotent(bool(idempotentType)), @@ -200,8 +219,10 @@ func TestDoTx(t *testing.T) { //nolint:lll OnRetry: func(info trace.RetryLoopStartInfo) func(trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { t.Logf("attempt %d, conn %d, mode: %+v", attempts, m.conns, Check(m.queryErr)) + return func(info trace.RetryLoopIntermediateInfo) func(trace.RetryLoopDoneInfo) { t.Logf("attempt %d, conn %d, mode: %+v", attempts, m.conns, Check(m.queryErr)) + return nil } }, diff --git a/scheme/example_test.go b/scheme/example_test.go index 8f774fd54..3510d7130 100644 --- a/scheme/example_test.go +++ b/scheme/example_test.go @@ -12,6 +12,7 @@ func Example() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources diff --git a/scheme/options.go b/scheme/options.go index 1313f84ca..c23cdf900 100644 --- a/scheme/options.go +++ b/scheme/options.go @@ -7,6 +7,7 @@ import ( func permissions(p Permissions) *Ydb_Scheme.Permissions { var y Ydb_Scheme.Permissions p.To(&y) + return &y } diff --git a/scheme/scheme.go b/scheme/scheme.go index 9887a044c..c7a3e9274 100644 --- a/scheme/scheme.go +++ b/scheme/scheme.go @@ -149,6 +149,7 @@ func makePermissions(src []*Ydb_Scheme.Permissions) (dst []Permissions) { for _, p := range src { dst = append(dst, from(p)) } + return dst } @@ -172,5 +173,6 @@ func (p Permissions) To(y *Ydb_Scheme.Permissions) { func InnerConvertEntry(y *Ydb_Scheme.Entry) *Entry { res := &Entry{} res.From(y) + return res } diff --git a/scripting/example_test.go b/scripting/example_test.go index b1b6c76e4..aa96dd85a 100644 --- a/scripting/example_test.go +++ b/scripting/example_test.go @@ -15,6 +15,7 @@ func Example_execute() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -47,6 +48,7 @@ func Example_execute() { if sum != 2 { return fmt.Errorf("unexpected sum: %v", sum) } + return res.Err() }, retry.WithIdempotent(true)); err != nil { fmt.Printf("Execute failed: %v", err) @@ -58,6 +60,7 @@ func Example_streamExecute() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -91,6 +94,7 @@ func Example_streamExecute() { if sum != 2 { return fmt.Errorf("unexpected sum: %v", sum) } + return res.Err() }, retry.WithIdempotent(true)); err != nil { fmt.Printf("StreamExecute failed: %v", err) @@ -102,6 +106,7 @@ func Example_explainPlan() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -112,10 +117,12 @@ func Example_explainPlan() { ) if err != nil { fmt.Printf("Explain failed: %v", err) + return } if res.Plan == "" { fmt.Printf("Unexpected empty plan") + return } fmt.Printf("") @@ -126,6 +133,7 @@ func Example_explainValidate() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed to connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -141,6 +149,7 @@ func Example_explainValidate() { if len(res.ParameterTypes) > 0 { return retry.RetryableError(fmt.Errorf("unexpected parameter types")) } + return nil }, retry.WithIdempotent(true)); err != nil { fmt.Printf("Explain failed: %v", err) diff --git a/sugar/certificates.go b/sugar/certificates.go index 809a4afd4..5ab386c34 100644 --- a/sugar/certificates.go +++ b/sugar/certificates.go @@ -15,6 +15,7 @@ func LoadCertificatesFromFile(caFile string) ([]*x509.Certificate, error) { if err != nil { return nil, xerrors.WithStackTrace(err) } + return LoadCertificatesFromPem(bytes), nil } @@ -40,5 +41,6 @@ func LoadCertificatesFromPem(bytes []byte) (certs []*x509.Certificate) { } certs = append(certs, cert) } + return } diff --git a/sugar/check_exists.go b/sugar/check_exists.go index 8aeed03c9..59d27e56a 100644 --- a/sugar/check_exists.go +++ b/sugar/check_exists.go @@ -13,6 +13,7 @@ func IsTableExists(ctx context.Context, c scheme.Client, absTablePath string) (e if err != nil { return exists, xerrors.WithStackTrace(err) } + return exists, nil } @@ -21,6 +22,7 @@ func IsColumnTableExists(ctx context.Context, c scheme.Client, absTablePath stri if err != nil { return exists, xerrors.WithStackTrace(err) } + return exists, nil } @@ -31,6 +33,7 @@ func IsEntryExists(ctx context.Context, c scheme.Client, absPath string, entryTy if err != nil { return exists, xerrors.WithStackTrace(err) } + return exists, nil } @@ -39,5 +42,6 @@ func IsDirectoryExists(ctx context.Context, c scheme.Client, absTablePath string if err != nil { return exists, xerrors.WithStackTrace(err) } + return exists, nil } diff --git a/sugar/params.go b/sugar/params.go index e8d6691b1..24c7f897c 100644 --- a/sugar/params.go +++ b/sugar/params.go @@ -26,11 +26,13 @@ func GenerateDeclareSection[T *table.QueryParameters | []table.ParameterOption | for i := range v { newArgs = append(newArgs, v[i]) } + return newArgs }()...) if err != nil { return "", xerrors.WithStackTrace(err) } + return internal.GenerateDeclareSection(table.NewQueryParameters(values...)) default: return "", xerrors.WithStackTrace(fmt.Errorf("unsupported type: %T", v)) @@ -48,5 +50,6 @@ func ToYdbParam(param sql.NamedArg) (table.ParameterOption, error) { if len(params) != 1 { return nil, xerrors.WithStackTrace(fmt.Errorf("internal error: wrong parameters count: %v", params)) } + return params[0], nil } diff --git a/sugar/params_test.go b/sugar/params_test.go index b3a6ee10c..8ef2d46bb 100644 --- a/sugar/params_test.go +++ b/sugar/params_test.go @@ -25,6 +25,7 @@ func TestGenerateDeclareSection(t *testing.T) { } } sort.Strings(declares) + return declares } for _, tt := range []struct { @@ -124,6 +125,7 @@ func TestGenerateDeclareSection_ParameterOption(t *testing.T) { } } sort.Strings(declares) + return declares } for _, tt := range []struct { @@ -230,6 +232,7 @@ func TestGenerateDeclareSection_NamedArg(t *testing.T) { } } sort.Strings(declares) + return declares } for _, tt := range []struct { diff --git a/sugar/path.go b/sugar/path.go index 4de49c3fd..cc22e15aa 100644 --- a/sugar/path.go +++ b/sugar/path.go @@ -173,5 +173,6 @@ func RemoveRecursive(ctx context.Context, db dbFoRemoveRecursive, pathToRemove s if !strings.HasPrefix(pathToRemove, db.Name()) { pathToRemove = path.Join(db.Name(), pathToRemove) } + return rmPath(0, pathToRemove) } diff --git a/table/example_test.go b/table/example_test.go index c02fd1e5f..430c28f84 100644 --- a/table/example_test.go +++ b/table/example_test.go @@ -22,6 +22,7 @@ func Example_select() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -51,6 +52,7 @@ func Example_select() { } fmt.Printf("id=%v, myStr='%s'\n", id, myStr) } + return res.Err() // return finally result error for auto-retry with driver }, table.WithIdempotent(), @@ -65,6 +67,7 @@ func Example_createTable() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -99,6 +102,7 @@ func Example_bulkUpsert() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -135,6 +139,7 @@ func Example_bulkUpsert() { types.StructFieldValue("Message", types.TextValue(msg.Message)), )) } + return s.BulkUpsert(ctx, "/local/bulk_upsert_example", types.ListValue(rows...)) }, table.WithIdempotent(), @@ -149,6 +154,7 @@ func Example_alterTable() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -184,6 +190,7 @@ func Example_lazyTransaction() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) @@ -240,6 +247,7 @@ func Example_lazyTransaction() { if err != nil { return err } + return result.Err() }, table.WithIdempotent(), @@ -254,6 +262,7 @@ func Example_bulkUpsertWithCompression() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -290,6 +299,7 @@ func Example_bulkUpsertWithCompression() { types.StructFieldValue("Message", types.TextValue(msg.Message)), )) } + return s.BulkUpsert(ctx, "/local/bulk_upsert_example", types.ListValue(rows...), options.WithCallOptions(grpc.UseCompressor(gzip.Name)), ) @@ -306,6 +316,7 @@ func Example_dataQueryWithCompression() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -339,6 +350,7 @@ func Example_dataQueryWithCompression() { } fmt.Printf("id=%v, myStr='%s'\n", id, myStr) } + return res.Err() // return finally result error for auto-retry with driver }, table.WithIdempotent(), @@ -353,6 +365,7 @@ func Example_scanQueryWithCompression() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -386,6 +399,7 @@ func Example_scanQueryWithCompression() { } fmt.Printf("id=%v, myStr='%s'\n", id, myStr) } + return res.Err() // return finally result error for auto-retry with driver }, table.WithIdempotent(), @@ -400,6 +414,7 @@ func Example_copyTables() { db, err := ydb.Open(ctx, "grpc://localhost:2136/local") if err != nil { fmt.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources diff --git a/table/options/models.go b/table/options/models.go index 2f285ad02..1464defe4 100644 --- a/table/options/models.go +++ b/table/options/models.go @@ -117,6 +117,7 @@ func (s StoragePool) toYDB() *Ydb_Table.StoragePool { if s.Media == "" { return nil } + return &Ydb_Table.StoragePool{ Media: s.Media, } @@ -424,6 +425,7 @@ func (kr KeyRange) String() string { buf.WriteString(kr.To.Yql()) } buf.WriteString("]") + return buf.String() } @@ -463,6 +465,7 @@ func NewTTLSettings() TimeToLiveSettings { func (ttl TimeToLiveSettings) ColumnDateType(columnName string) TimeToLiveSettings { ttl.Mode = TimeToLiveModeDateType ttl.ColumnName = columnName + return ttl } @@ -474,6 +477,7 @@ func (ttl TimeToLiveSettings) ColumnSeconds(columnName string) TimeToLiveSetting ttl.Mode = TimeToLiveModeValueSinceUnixEpoch ttl.ColumnName = columnName ttl.ColumnUnit = unitToPointer(TimeToLiveUnitSeconds) + return ttl } @@ -481,6 +485,7 @@ func (ttl TimeToLiveSettings) ColumnMilliseconds(columnName string) TimeToLiveSe ttl.Mode = TimeToLiveModeValueSinceUnixEpoch ttl.ColumnName = columnName ttl.ColumnUnit = unitToPointer(TimeToLiveUnitMilliseconds) + return ttl } @@ -488,6 +493,7 @@ func (ttl TimeToLiveSettings) ColumnMicroseconds(columnName string) TimeToLiveSe ttl.Mode = TimeToLiveModeValueSinceUnixEpoch ttl.ColumnName = columnName ttl.ColumnUnit = unitToPointer(TimeToLiveUnitMicroseconds) + return ttl } @@ -495,11 +501,13 @@ func (ttl TimeToLiveSettings) ColumnNanoseconds(columnName string) TimeToLiveSet ttl.Mode = TimeToLiveModeValueSinceUnixEpoch ttl.ColumnName = columnName ttl.ColumnUnit = unitToPointer(TimeToLiveUnitNanoseconds) + return ttl } func (ttl TimeToLiveSettings) ExpireAfter(expireAfter time.Duration) TimeToLiveSettings { ttl.ExpireAfterSeconds = uint32(expireAfter.Seconds()) + return ttl } diff --git a/table/options/options.go b/table/options/options.go index 62a2a0818..df33cf0c8 100644 --- a/table/options/options.go +++ b/table/options/options.go @@ -871,6 +871,7 @@ func WithCallOptions(opts ...grpc.CallOption) withCallOptions { func WithCommit() ExecuteDataQueryOption { return executeDataQueryOptionFunc(func(desc *ExecuteDataQueryDesc, a *allocator.Allocator) []grpc.CallOption { desc.TxControl.CommitTx = true + return nil }) } @@ -879,6 +880,7 @@ func WithCommit() ExecuteDataQueryOption { func WithIgnoreTruncated() ExecuteDataQueryOption { return executeDataQueryOptionFunc(func(desc *ExecuteDataQueryDesc, a *allocator.Allocator) []grpc.CallOption { desc.IgnoreTruncated = true + return nil }) } @@ -915,6 +917,7 @@ func withQueryCachePolicy(opts ...QueryCachePolicyOption) ExecuteDataQueryOption opt((*queryCachePolicy)(d.QueryCachePolicy), a) } } + return nil }) } @@ -934,6 +937,7 @@ func WithCommitCollectStatsModeBasic() CommitTransactionOption { func WithCollectStatsModeNone() ExecuteDataQueryOption { return executeDataQueryOptionFunc(func(d *ExecuteDataQueryDesc, a *allocator.Allocator) []grpc.CallOption { d.CollectStats = Ydb_Table.QueryStatsCollection_STATS_COLLECTION_NONE + return nil }) } @@ -941,6 +945,7 @@ func WithCollectStatsModeNone() ExecuteDataQueryOption { func WithCollectStatsModeBasic() ExecuteDataQueryOption { return executeDataQueryOptionFunc(func(d *ExecuteDataQueryDesc, a *allocator.Allocator) []grpc.CallOption { d.CollectStats = Ydb_Table.QueryStatsCollection_STATS_COLLECTION_BASIC + return nil }) } @@ -969,6 +974,7 @@ var _ ExecuteScanQueryOption = executeScanQueryOptionFunc(nil) func WithExecuteScanQueryMode(m ExecuteScanQueryRequestMode) ExecuteScanQueryOption { return executeScanQueryOptionFunc(func(desc *ExecuteScanQueryDesc) []grpc.CallOption { desc.Mode = m.toYDB() + return nil }) } @@ -999,6 +1005,7 @@ func (stats ExecuteScanQueryStatsType) toYDB() Ydb_Table.QueryStatsCollection_Mo func WithExecuteScanQueryStats(stats ExecuteScanQueryStatsType) ExecuteScanQueryOption { return executeScanQueryOptionFunc(func(desc *ExecuteScanQueryDesc) []grpc.CallOption { desc.CollectStats = stats.toYDB() + return nil }) } diff --git a/table/result/named/named.go b/table/result/named/named.go index 586a5d077..2d7295a3a 100644 --- a/table/result/named/named.go +++ b/table/result/named/named.go @@ -24,6 +24,7 @@ func Optional(columnName string, destination interface{}) Value { if columnName == "" { panic("columnName must be not empty") } + return Value{ Name: columnName, Value: destination, @@ -38,6 +39,7 @@ func Required(columnName string, destinationValueReference interface{}) Value { if columnName == "" { panic("columnName must be not empty") } + return Value{ Name: columnName, Value: destinationValueReference, @@ -53,6 +55,7 @@ func OptionalWithDefault(columnName string, destinationValueReference interface{ if columnName == "" { panic("columnName must be not empty") } + return Value{ Name: columnName, Value: destinationValueReference, diff --git a/table/table.go b/table/table.go index 45b81f687..d2d4b1001 100644 --- a/table/table.go +++ b/table/table.go @@ -203,6 +203,7 @@ func (t *TransactionSettings) Settings() *Ydb_Table.TransactionSettings { if t == nil { return nil } + return &t.settings } @@ -302,6 +303,7 @@ func TxSettings(opts ...TxOption) *TransactionSettings { opt((*txDesc)(&s.settings)) } } + return s } @@ -394,6 +396,7 @@ func (t *TransactionControl) Desc() *Ydb_Table.TransactionControl { if t == nil { return nil } + return &t.desc } @@ -405,6 +408,7 @@ func TxControl(opts ...TxControlOption) *TransactionControl { opt((*txControlDesc)(&c.desc)) } } + return c } @@ -481,6 +485,7 @@ func (qp queryParams) ToYDB(a *allocator.Allocator) map[string]*Ydb.TypedValue { for k, v := range qp { params[k] = value.ToYDB(v, a) } + return params } @@ -488,6 +493,7 @@ func (q *QueryParameters) Params() queryParams { if q == nil { return nil } + return q.m } @@ -495,6 +501,7 @@ func (q *QueryParameters) Count() int { if q == nil { return 0 } + return len(q.m) } @@ -516,6 +523,7 @@ func (q *QueryParameters) names() []string { names = append(names, k) } sort.Strings(names) + return names } @@ -534,6 +542,7 @@ func (q *QueryParameters) String() string { buffer.WriteString(q.m[name].Yql()) } buffer.WriteByte('}') + return buffer.String() } @@ -542,6 +551,7 @@ func NewQueryParameters(opts ...ParameterOption) *QueryParameters { m: make(queryParams, len(opts)), } q.Add(opts...) + return q } @@ -560,6 +570,7 @@ func ValueParam(name string, v types.Value) ParameterOption { name = "$" + name } } + return ¶meterOption{ name: name, value: v, diff --git a/table/types/cast.go b/table/types/cast.go index 574e960fb..71d8476ea 100644 --- a/table/types/cast.go +++ b/table/types/cast.go @@ -15,6 +15,7 @@ func CastTo(v Value, dst interface{}) error { if v == nil { return xerrors.WithStackTrace(errNilValue) } + return value.CastTo(v, dst) } @@ -26,6 +27,7 @@ func IsOptional(t Type) (isOptional bool, innerType Type) { }); isOptional { return isOptional, optionalType.InnerType() } + return false, nil } @@ -38,6 +40,7 @@ func ToDecimal(v Value) (*Decimal, error) { Scale: valuer.Scale(), }, nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("value type '%s' is not decimal type", v.Type().Yql())) } @@ -48,6 +51,7 @@ func ListItems(v Value) ([]Value, error) { }); has { return vv.ListItems(), nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("cannot get list items from '%s'", v.Type().Yql())) } @@ -58,6 +62,7 @@ func TupleItems(v Value) ([]Value, error) { }); has { return vv.TupleItems(), nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("cannot get tuple items from '%s'", v.Type().Yql())) } @@ -68,6 +73,7 @@ func StructFields(v Value) (map[string]Value, error) { }); has { return vv.StructFields(), nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("cannot get struct fields from '%s'", v.Type().Yql())) } @@ -78,8 +84,10 @@ func VariantValue(v Value) (name string, idx uint32, _ Value, _ error) { Value() Value }); has { name, idx := vv.Variant() + return name, idx, vv.Value(), nil } + return "", 0, nil, xerrors.WithStackTrace(fmt.Errorf("cannot get variant value from '%s'", v.Type().Yql())) } @@ -97,5 +105,6 @@ func DictValues(v Value) (map[Value]Value, error) { }); has { return vv.DictValues(), nil } + return nil, xerrors.WithStackTrace(fmt.Errorf("cannot get dict values from '%s'", v.Type().Yql())) } diff --git a/table/types/types.go b/table/types/types.go index a04191e7a..55a3dffdc 100644 --- a/table/types/types.go +++ b/table/types/types.go @@ -46,6 +46,7 @@ func Struct(opts ...StructOption) Type { opt(&s) } } + return value.Struct(s.fields...) } @@ -60,6 +61,7 @@ func VariantStruct(opts ...StructOption) Type { opt(&s) } } + return value.VariantStruct(s.fields...) } diff --git a/table/types/value.go b/table/types/value.go index f0d730287..75b252c00 100644 --- a/table/types/value.go +++ b/table/types/value.go @@ -182,6 +182,7 @@ type Decimal struct { func (d *Decimal) String() string { v := decimal.FromInt128(d.Bytes, d.Precision, d.Scale) + return decimal.Format(v, d.Precision, d.Scale) } @@ -230,6 +231,7 @@ func StructValue(opts ...StructValueOption) Value { opt(&p) } } + return value.StructValue(p.fields...) } @@ -252,6 +254,7 @@ func DictValue(opts ...DictValueOption) Value { opt(&p) } } + return value.DictValue(p.fields...) } @@ -267,6 +270,7 @@ func NullableBoolValue(v *bool) Value { if v == nil { return NullValue(TypeBool) } + return OptionalValue(BoolValue(*v)) } @@ -274,6 +278,7 @@ func NullableInt8Value(v *int8) Value { if v == nil { return NullValue(TypeInt8) } + return OptionalValue(Int8Value(*v)) } @@ -281,6 +286,7 @@ func NullableInt16Value(v *int16) Value { if v == nil { return NullValue(TypeInt16) } + return OptionalValue(Int16Value(*v)) } @@ -288,6 +294,7 @@ func NullableInt32Value(v *int32) Value { if v == nil { return NullValue(TypeInt32) } + return OptionalValue(Int32Value(*v)) } @@ -295,6 +302,7 @@ func NullableInt64Value(v *int64) Value { if v == nil { return NullValue(TypeInt64) } + return OptionalValue(Int64Value(*v)) } @@ -302,6 +310,7 @@ func NullableUint8Value(v *uint8) Value { if v == nil { return NullValue(TypeUint8) } + return OptionalValue(Uint8Value(*v)) } @@ -309,6 +318,7 @@ func NullableUint16Value(v *uint16) Value { if v == nil { return NullValue(TypeUint16) } + return OptionalValue(Uint16Value(*v)) } @@ -316,6 +326,7 @@ func NullableUint32Value(v *uint32) Value { if v == nil { return NullValue(TypeUint32) } + return OptionalValue(Uint32Value(*v)) } @@ -323,6 +334,7 @@ func NullableUint64Value(v *uint64) Value { if v == nil { return NullValue(TypeUint64) } + return OptionalValue(Uint64Value(*v)) } @@ -330,6 +342,7 @@ func NullableFloatValue(v *float32) Value { if v == nil { return NullValue(TypeFloat) } + return OptionalValue(FloatValue(*v)) } @@ -337,6 +350,7 @@ func NullableDoubleValue(v *float64) Value { if v == nil { return NullValue(TypeDouble) } + return OptionalValue(DoubleValue(*v)) } @@ -344,6 +358,7 @@ func NullableDateValue(v *uint32) Value { if v == nil { return NullValue(TypeDate) } + return OptionalValue(DateValue(*v)) } @@ -351,6 +366,7 @@ func NullableDateValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeDate) } + return OptionalValue(DateValueFromTime(*v)) } @@ -358,6 +374,7 @@ func NullableDatetimeValue(v *uint32) Value { if v == nil { return NullValue(TypeDatetime) } + return OptionalValue(DatetimeValue(*v)) } @@ -365,6 +382,7 @@ func NullableDatetimeValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeDatetime) } + return OptionalValue(DatetimeValueFromTime(*v)) } @@ -372,6 +390,7 @@ func NullableTzDateValue(v *string) Value { if v == nil { return NullValue(TypeTzDate) } + return OptionalValue(TzDateValue(*v)) } @@ -379,6 +398,7 @@ func NullableTzDateValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeTzDate) } + return OptionalValue(TzDateValueFromTime(*v)) } @@ -386,6 +406,7 @@ func NullableTzDatetimeValue(v *string) Value { if v == nil { return NullValue(TypeTzDatetime) } + return OptionalValue(TzDatetimeValue(*v)) } @@ -393,6 +414,7 @@ func NullableTzDatetimeValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeTzDatetime) } + return OptionalValue(TzDatetimeValueFromTime(*v)) } @@ -400,6 +422,7 @@ func NullableTimestampValue(v *uint64) Value { if v == nil { return NullValue(TypeTimestamp) } + return OptionalValue(TimestampValue(*v)) } @@ -407,6 +430,7 @@ func NullableTimestampValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeTimestamp) } + return OptionalValue(TimestampValueFromTime(*v)) } @@ -414,6 +438,7 @@ func NullableTzTimestampValue(v *string) Value { if v == nil { return NullValue(TypeTzTimestamp) } + return OptionalValue(TzTimestampValue(*v)) } @@ -421,6 +446,7 @@ func NullableTzTimestampValueFromTime(v *time.Time) Value { if v == nil { return NullValue(TypeTzTimestamp) } + return OptionalValue(TzTimestampValueFromTime(*v)) } @@ -431,6 +457,7 @@ func NullableIntervalValue(v *int64) Value { if v == nil { return NullValue(TypeInterval) } + return OptionalValue(IntervalValue(*v)) } @@ -438,6 +465,7 @@ func NullableIntervalValueFromMicroseconds(v *int64) Value { if v == nil { return NullValue(TypeInterval) } + return OptionalValue(IntervalValueFromMicroseconds(*v)) } @@ -445,6 +473,7 @@ func NullableIntervalValueFromDuration(v *time.Duration) Value { if v == nil { return NullValue(TypeInterval) } + return OptionalValue(IntervalValueFromDuration(*v)) } @@ -455,6 +484,7 @@ func NullableStringValue(v *[]byte) Value { if v == nil { return NullValue(TypeBytes) } + return OptionalValue(StringValue(*v)) } @@ -462,6 +492,7 @@ func NullableBytesValue(v *[]byte) Value { if v == nil { return NullValue(TypeBytes) } + return OptionalValue(BytesValue(*v)) } @@ -469,6 +500,7 @@ func NullableStringValueFromString(v *string) Value { if v == nil { return NullValue(TypeBytes) } + return OptionalValue(BytesValueFromString(*v)) } @@ -476,6 +508,7 @@ func NullableBytesValueFromString(v *string) Value { if v == nil { return NullValue(TypeBytes) } + return OptionalValue(BytesValueFromString(*v)) } @@ -483,6 +516,7 @@ func NullableUTF8Value(v *string) Value { if v == nil { return NullValue(TypeText) } + return OptionalValue(TextValue(*v)) } @@ -490,6 +524,7 @@ func NullableTextValue(v *string) Value { if v == nil { return NullValue(TypeText) } + return OptionalValue(TextValue(*v)) } @@ -497,6 +532,7 @@ func NullableYSONValue(v *string) Value { if v == nil { return NullValue(TypeYSON) } + return OptionalValue(YSONValue(*v)) } @@ -504,6 +540,7 @@ func NullableYSONValueFromBytes(v *[]byte) Value { if v == nil { return NullValue(TypeYSON) } + return OptionalValue(YSONValueFromBytes(*v)) } @@ -511,6 +548,7 @@ func NullableJSONValue(v *string) Value { if v == nil { return NullValue(TypeJSON) } + return OptionalValue(JSONValue(*v)) } @@ -518,6 +556,7 @@ func NullableJSONValueFromBytes(v *[]byte) Value { if v == nil { return NullValue(TypeJSON) } + return OptionalValue(JSONValueFromBytes(*v)) } @@ -525,6 +564,7 @@ func NullableUUIDValue(v *[16]byte) Value { if v == nil { return NullValue(TypeUUID) } + return OptionalValue(UUIDValue(*v)) } @@ -532,6 +572,7 @@ func NullableJSONDocumentValue(v *string) Value { if v == nil { return NullValue(TypeJSONDocument) } + return OptionalValue(JSONDocumentValue(*v)) } @@ -539,6 +580,7 @@ func NullableJSONDocumentValueFromBytes(v *[]byte) Value { if v == nil { return NullValue(TypeJSONDocument) } + return OptionalValue(JSONDocumentValueFromBytes(*v)) } @@ -546,6 +588,7 @@ func NullableDyNumberValue(v *string) Value { if v == nil { return NullValue(TypeDyNumber) } + return OptionalValue(DyNumberValue(*v)) } diff --git a/tests/slo/database/sql/storage.go b/tests/slo/database/sql/storage.go index 0c6bcc606..1fe6a2c38 100755 --- a/tests/slo/database/sql/storage.go +++ b/tests/slo/database/sql/storage.go @@ -204,6 +204,7 @@ func (s *Storage) createTable(ctx context.Context) error { return retry.Do(ydb.WithTxControl(ctx, writeTx), s.db, func(ctx context.Context, cc *sql.Conn) error { _, err := s.db.ExecContext(ydb.WithQueryMode(ctx, ydb.SchemeQueryMode), s.createQuery) + return err }, retry.WithIdempotent(true), ) @@ -220,6 +221,7 @@ func (s *Storage) dropTable(ctx context.Context) error { return retry.Do(ydb.WithTxControl(ctx, writeTx), s.db, func(ctx context.Context, cc *sql.Conn) error { _, err := s.db.ExecContext(ydb.WithQueryMode(ctx, ydb.SchemeQueryMode), s.dropQuery) + return err }, retry.WithIdempotent(true), ) diff --git a/tests/slo/internal/config/config.go b/tests/slo/internal/config/config.go index 530e412e8..b858d27b8 100644 --- a/tests/slo/internal/config/config.go +++ b/tests/slo/internal/config/config.go @@ -40,6 +40,7 @@ func New() (*Config, error) { if len(os.Args) < 2 { fmt.Print(mainHelp) + return nil, ErrWrongArgs } @@ -49,6 +50,7 @@ func New() (*Config, error) { case "create": if len(os.Args) < 4 { fmt.Print(createHelp) + return nil, ErrWrongArgs } @@ -69,6 +71,7 @@ func New() (*Config, error) { case "cleanup": if len(os.Args) < 4 { fmt.Print(cleanupHelp) + return nil, ErrWrongArgs } @@ -77,6 +80,7 @@ func New() (*Config, error) { case "run": if len(os.Args) < 4 { fmt.Print(runHelp) + return nil, ErrWrongArgs } @@ -98,6 +102,7 @@ func New() (*Config, error) { fs.IntVar(&cfg.ShutdownTime, "shutdown-time", 30, "time to wait before force kill workers") default: fmt.Print(mainHelp) + return nil, ErrWrongArgs } diff --git a/tests/slo/internal/workers/workers.go b/tests/slo/internal/workers/workers.go index 64eb7da79..3aacf2b22 100644 --- a/tests/slo/internal/workers/workers.go +++ b/tests/slo/internal/workers/workers.go @@ -24,6 +24,7 @@ func New(cfg *config.Config, s ReadWriter, label, jobName string) (*Workers, err m, err := metrics.New(cfg.PushGateway, label, jobName) if err != nil { fmt.Printf("create metrics failed: %v\n", err) + return nil, err } diff --git a/tests/slo/internal/workers/write.go b/tests/slo/internal/workers/write.go index daa624174..e9c7b7cae 100644 --- a/tests/slo/internal/workers/write.go +++ b/tests/slo/internal/workers/write.go @@ -28,6 +28,7 @@ func (w *Workers) write(ctx context.Context, gen *generator.Generator) (err erro row, err = gen.Generate() if err != nil { fmt.Printf("generate error: %v\n", err) + return err } diff --git a/tests/slo/xorm/storage.go b/tests/slo/xorm/storage.go index b6bc813df..87409a738 100644 --- a/tests/slo/xorm/storage.go +++ b/tests/slo/xorm/storage.go @@ -170,6 +170,7 @@ func (s *Storage) Write(ctx context.Context, row generator.Row) (attempts int, e } _, err = s.x.Context(ctx).SetExpr("hash", fmt.Sprintf("Digest::NumericHash(%d)", row.ID)).Insert(row) + return err }, retry.WithIdempotent(true), diff --git a/testutil/compare.go b/testutil/compare.go index 5e56caf94..908fe6f27 100644 --- a/testutil/compare.go +++ b/testutil/compare.go @@ -29,6 +29,7 @@ var ErrNotComparable = xerrors.Wrap(fmt.Errorf("not comparable")) func Compare(l, r value.Value) (int, error) { a := allocator.New() defer a.Free() + return compare(unwrapTypedValue(value.ToYDB(l, a)), unwrapTypedValue(value.ToYDB(r, a))) } @@ -41,6 +42,7 @@ func unwrapTypedValue(v *Ydb.TypedValue) *Ydb.TypedValue { val = nested } } + return &Ydb.TypedValue{Type: typ, Value: val} } @@ -69,6 +71,7 @@ func expandItems(v *Ydb.TypedValue, itemType func(i int) *Ydb.Type) []*Ydb.Typed for i, val := range v.GetValue().GetItems() { values = append(values, unwrapTypedValue(&Ydb.TypedValue{Type: itemType(i), Value: val})) } + return values } @@ -91,6 +94,7 @@ func expandTuple(v *Ydb.TypedValue) []*Ydb.TypedValue { for idx, typ := range tuple.Elements { values = append(values, unwrapTypedValue(&Ydb.TypedValue{Type: typ, Value: v.Value.Items[idx]})) } + return values } @@ -105,6 +109,7 @@ func comparePrimitives(t Ydb.Type_PrimitiveTypeId, lhs, rhs *Ydb.Value) (int, er if rIsNull { return 0, nil } + return -1, nil } if rIsNull { @@ -142,6 +147,7 @@ func compareTuplesOrLists(lhs, rhs []*Ydb.TypedValue) (int, error) { if len(rhs) > len(lhs) { return -1, nil } + return 0, nil } @@ -164,6 +170,7 @@ func compareStructs(lhs, rhs []*Ydb.TypedValue) (int, error) { if len(rhs) > len(lhs) { return -1, nil } + return 0, nil } @@ -271,12 +278,14 @@ func compareDouble(l, r *Ydb.Value) int { func compareText(l, r *Ydb.Value) int { ll := l.GetTextValue() rr := r.GetTextValue() + return strings.Compare(ll, rr) } func compareBytes(l, r *Ydb.Value) int { ll := l.GetBytesValue() rr := r.GetBytesValue() + return bytes.Compare(ll, rr) } @@ -287,11 +296,13 @@ func compareBool(l, r *Ydb.Value) int { if rr { return 0 } + return 1 } if rr { return -1 } + return 0 } @@ -306,6 +317,7 @@ func compareDyNumber(l, r *Ydb.Value) (int, error) { if err != nil { return 0, err } + return lf.Cmp(rf), nil } diff --git a/testutil/driver.go b/testutil/driver.go index 6be8849e8..48b82d4ca 100644 --- a/testutil/driver.go +++ b/testutil/driver.go @@ -24,6 +24,7 @@ func (m MethodCode) String() string { if method, ok := codeToString[m]; ok { return method } + return "" } @@ -33,6 +34,7 @@ func (m Method) Code() MethodCode { if code, ok := grpcMethodToCode[m]; ok { return code } + return UnknownMethod } @@ -150,6 +152,7 @@ func (b *balancerStub) Invoke( if b.onInvoke == nil { return fmt.Errorf("database.onInvoke() not defined") } + return b.onInvoke(ctx, method, args, reply, opts...) } @@ -162,6 +165,7 @@ func (b *balancerStub) NewStream( if b.onNewStream == nil { return nil, fmt.Errorf("database.onNewStream() not defined") } + return b.onNewStream(ctx, desc, method, opts...) } @@ -170,6 +174,7 @@ func (b *balancerStub) Get(context.Context) (conn grpc.ClientConnInterface, err onInvoke: b.onInvoke, onNewStream: b.onNewStream, } + return cc, nil } @@ -215,8 +220,10 @@ func WithInvokeHandlers(invokeHandlers InvokeHandlers) balancerOption { Result: anyResult, }, ) + return nil } + return fmt.Errorf("method '%s' not implemented", method) } } @@ -233,6 +240,7 @@ func WithNewStreamHandlers(newStreamHandlers NewStreamHandlers) balancerOption { if handler, ok := newStreamHandlers[Method(method).Code()]; ok { return handler(desc) } + return nil, fmt.Errorf("method '%s' not implemented", method) } } @@ -245,6 +253,7 @@ func NewBalancer(opts ...balancerOption) *balancerStub { opt(c) } } + return c } @@ -272,6 +281,7 @@ func (c *clientConn) Address() string { if c.onAddress != nil { return c.onAddress() } + return "" } @@ -285,6 +295,7 @@ func (c *clientConn) Invoke( if c.onInvoke == nil { return fmt.Errorf("onInvoke not implemented (method: %s, request: %v, response: %v)", method, args, reply) } + return c.onInvoke(ctx, method, args, reply, opts...) } @@ -297,6 +308,7 @@ func (c *clientConn) NewStream( if c.onNewStream == nil { return nil, fmt.Errorf("onNewStream not implemented (method: %s, desc: %v)", method, desc) } + return c.onNewStream(ctx, desc, method, opts...) } @@ -313,6 +325,7 @@ func (s *ClientStream) Header() (metadata.MD, error) { if s.OnHeader == nil { return nil, xerrors.WithStackTrace(ErrNotImplemented) } + return s.OnHeader() } @@ -320,6 +333,7 @@ func (s *ClientStream) Trailer() metadata.MD { if s.OnTrailer == nil { return nil } + return s.OnTrailer() } @@ -327,6 +341,7 @@ func (s *ClientStream) CloseSend() error { if s.OnCloseSend == nil { return xerrors.WithStackTrace(ErrNotImplemented) } + return s.OnCloseSend() } @@ -334,6 +349,7 @@ func (s *ClientStream) Context() context.Context { if s.OnContext == nil { return nil } + return s.OnContext() } @@ -341,6 +357,7 @@ func (s *ClientStream) SendMsg(m interface{}) error { if s.OnSendMsg == nil { return xerrors.WithStackTrace(ErrNotImplemented) } + return s.OnSendMsg(m) } @@ -348,10 +365,12 @@ func (s *ClientStream) RecvMsg(m interface{}) error { if s.OnRecvMsg == nil { return xerrors.WithStackTrace(ErrNotImplemented) } + return s.OnRecvMsg(m) } func lastSegment(m string) string { s := strings.Split(m, "/") + return s[len(s)-1] } diff --git a/testutil/file_line.go b/testutil/file_line.go index 37be268b5..5bc37c4f5 100644 --- a/testutil/file_line.go +++ b/testutil/file_line.go @@ -8,5 +8,6 @@ import ( func FileLine(skip int) string { _, file, line, _ := runtime.Caller(skip) + return filepath.Base(file) + ":" + strconv.Itoa(line) } diff --git a/testutil/session.go b/testutil/session.go index cdc1c5338..e53caedf2 100644 --- a/testutil/session.go +++ b/testutil/session.go @@ -40,5 +40,6 @@ func SessionID(opts ...sessionIDOption) string { o(h) } } + return fmt.Sprintf("ydb://session/%d?node_id=%d&id=%s==", h.serviceID, h.nodeID, h.hash) } diff --git a/topic/example_test.go b/topic/example_test.go index bba68c4be..9df1fab42 100644 --- a/topic/example_test.go +++ b/topic/example_test.go @@ -21,6 +21,7 @@ func Example_createTopic() { db, err := ydb.Open(ctx, connectionString) if err != nil { log.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -35,6 +36,7 @@ func Example_createTopic() { ) if err != nil { log.Printf("failed create topic: %v", err) + return } } @@ -48,6 +50,7 @@ func Example_alterTopic() { db, err := ydb.Open(ctx, connectionString) if err != nil { log.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -60,6 +63,7 @@ func Example_alterTopic() { ) if err != nil { log.Printf("failed alter topic: %v", err) + return } } @@ -73,6 +77,7 @@ func Example_describeTopic() { db, err := ydb.Open(ctx, connectionString) if err != nil { log.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -80,6 +85,7 @@ func Example_describeTopic() { descResult, err := db.Topic().Describe(ctx, "topic-path") if err != nil { log.Printf("failed drop topic: %v", err) + return } fmt.Printf("describe: %#v\n", descResult) @@ -94,6 +100,7 @@ func Example_dropTopic() { db, err := ydb.Open(ctx, connectionString) if err != nil { log.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -101,6 +108,7 @@ func Example_dropTopic() { err = db.Topic().Drop(ctx, "topic-path") if err != nil { log.Printf("failed drop topic: %v", err) + return } } @@ -114,6 +122,7 @@ func Example_readMessage() { db, err := ydb.Open(ctx, connectionString) if err != nil { log.Printf("failed connect: %v", err) + return } defer db.Close(ctx) // cleanup resources @@ -121,6 +130,7 @@ func Example_readMessage() { reader, err := db.Topic().StartReader("consumer", topicoptions.ReadTopic("/topic/path")) if err != nil { fmt.Printf("failed start reader: %v", err) + return } @@ -128,12 +138,14 @@ func Example_readMessage() { mess, err := reader.ReadMessage(ctx) if err != nil { fmt.Printf("failed start reader: %v", err) + return } content, err := io.ReadAll(mess) if err != nil { fmt.Printf("failed start reader: %v", err) + return } fmt.Println(string(content)) diff --git a/topic/topicoptions/topicoptions_alter.go b/topic/topicoptions/topicoptions_alter.go index 3667e0efa..52700a7f4 100644 --- a/topic/topicoptions/topicoptions_alter.go +++ b/topic/topicoptions/topicoptions_alter.go @@ -43,6 +43,7 @@ func AlterWithSupportedCodecs(codecs ...topictypes.Codec) AlterOption { sort.Slice(codecs, func(i, j int) bool { return codecs[i] < codecs[j] }) + return withSupportedCodecs(codecs) } @@ -66,12 +67,14 @@ func AlterWithAddConsumers(consumers ...topictypes.Consumer) AlterOption { sort.Slice(consumers, func(i, j int) bool { return consumers[i].Name < consumers[j].Name }) + return withAddConsumers(consumers) } // AlterWithDropConsumers drop consumer from the topic func AlterWithDropConsumers(consumersName ...string) AlterOption { sort.Strings(consumersName) + return withDropConsumers(consumersName) } @@ -96,6 +99,7 @@ func AlterConsumerWithSupportedCodecs(name string, codecs []topictypes.Codec) Al sort.Slice(codecs, func(i, j int) bool { return codecs[i] < codecs[j] }) + return withConsumerWithSupportedCodecs{ name: name, codecs: codecs, @@ -123,5 +127,6 @@ func ensureAlterConsumer( } } consumers = append(consumers, rawtopic.AlterConsumer{Name: name}) + return consumers, len(consumers) - 1 } diff --git a/topic/topicoptions/topicoptions_create.go b/topic/topicoptions/topicoptions_create.go index cf111234f..6fa1cb4dc 100644 --- a/topic/topicoptions/topicoptions_create.go +++ b/topic/topicoptions/topicoptions_create.go @@ -43,6 +43,7 @@ func CreateWithSupportedCodecs(codecs ...topictypes.Codec) CreateOption { sort.Slice(codecs, func(i, j int) bool { return codecs[i] < codecs[j] }) + return withSupportedCodecs(codecs) } @@ -66,5 +67,6 @@ func CreateWithConsumer(consumers ...topictypes.Consumer) CreateOption { sort.Slice(consumers, func(i, j int) bool { return consumers[i].Name < consumers[j].Name }) + return withAddConsumers(consumers) } diff --git a/topic/topicreader/batch_options.go b/topic/topicreader/batch_options.go index b4c670c31..166432535 100644 --- a/topic/topicreader/batch_options.go +++ b/topic/topicreader/batch_options.go @@ -12,6 +12,7 @@ func (count WithBatchMaxCount) Apply( options topicreaderinternal.ReadMessageBatchOptions, ) topicreaderinternal.ReadMessageBatchOptions { options.MaxCount = int(count) + return options } @@ -33,5 +34,6 @@ func (count WithBatchPreferMinCount) Apply( panic("ydb: min batch size must be 1 or greater") } options.MinCount = int(count) + return options } diff --git a/topic/topicwriter/topicwriter.go b/topic/topicwriter/topicwriter.go index 341e16da4..a9b5971f3 100644 --- a/topic/topicwriter/topicwriter.go +++ b/topic/topicwriter/topicwriter.go @@ -50,6 +50,7 @@ func (w *Writer) WaitInit(ctx context.Context) (err error) { if err != nil { return err } + return nil } @@ -61,6 +62,7 @@ func (w *Writer) WaitInitInfo(ctx context.Context) (info PublicInitialInfo, err return PublicInitialInfo{}, err } publicInfo := PublicInitialInfo{LastSeqNum: privateInfo.LastSeqNum} + return publicInfo, nil } diff --git a/trace/details.go b/trace/details.go index c1617aa2d..d2a65ff89 100644 --- a/trace/details.go +++ b/trace/details.go @@ -24,6 +24,7 @@ func (d Details) String() string { } } sort.Strings(ss) + return strings.Join(ss, "|") } @@ -211,5 +212,6 @@ func MatchDetails(pattern string, opts ...matchDetailsOption) (d Details) { if d == 0 { return h.defaultDetails } + return d } diff --git a/trace/driver.go b/trace/driver.go index 5c31cfbd5..9e954874c 100644 --- a/trace/driver.go +++ b/trace/driver.go @@ -90,12 +90,14 @@ type Method string // Name returns the rpc method name. func (m Method) Name() (s string) { _, s = m.Split() + return } // Service returns the rpc service name. func (m Method) Service() (s string) { s, _ = m.Split() + return } @@ -112,6 +114,7 @@ func (m Method) Split() (service, method string) { if i == -1 { return string(m), string(m) } + return strings.TrimPrefix(string(m[:i]), "/"), string(m[i+1:]) } diff --git a/trace/trace_test.go b/trace/trace_test.go index 6cb8a5b1b..fbdf19668 100644 --- a/trace/trace_test.go +++ b/trace/trace_test.go @@ -69,6 +69,7 @@ func stubEachFunc(x reflect.Value) map[string]bool { fs[name] = true }, }).Stub(x) + return fs } diff --git a/trace/traceutil.go b/trace/traceutil.go index 613e0b237..8ad52bfb6 100644 --- a/trace/traceutil.go +++ b/trace/traceutil.go @@ -23,6 +23,7 @@ func ClearContext(x interface{}) interface{} { c.Set(reflect.Zero(c.Type())) p.Set(x) } + return p.Interface() } @@ -69,6 +70,7 @@ func (f FieldStubber) Stub(x reflect.Value) { params[i] = arg.Interface() } f.OnCall(name, params...) + return out }) fx.Set(fn) From 048ef9e2a21ce31df659b2d8d42c4b750dede570 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Fri, 9 Feb 2024 14:13:25 +0300 Subject: [PATCH 57/65] update golang min --- .github/workflows/check-codegen.yml | 2 +- .github/workflows/tests.yml | 4 ++-- CHANGELOG.md | 1 + examples/go.mod | 2 +- go.mod | 2 +- tests/slo/go.mod | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check-codegen.yml b/.github/workflows/check-codegen.yml index a4be45c6f..327a9809d 100644 --- a/.github/workflows/check-codegen.yml +++ b/.github/workflows/check-codegen.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - go-version: [1.20.x, 1.21.x] + go-version: [1.21.x, 1.22.x] runs-on: ${{ matrix.os }} steps: - name: Checkout diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d9c87d217..b814a92a8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - go-version: [1.20.x, 1.21.x] + go-version: [1.21.x, 1.22.x] os: [ubuntu, windows, macOS] env: OS: ${{ matrix.os }}-latest @@ -44,7 +44,7 @@ jobs: strategy: fail-fast: false matrix: - go-version: [1.20.x, 1.21.x] + go-version: [1.21.x, 1.22.x] ydb-version: [22.5, 23.1, 23.2, 23.3] services: ydb: diff --git a/CHANGELOG.md b/CHANGELOG.md index 86c81bc7f..783bba606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* The minimum version of Go in `ydb-go-sdk` has been raised to `go1.21` * Fixed topic writer infinite reconnections in some cases * Refactored nil on err `internal/grpcwrapper/rawydb/issues.go`, when golangci-lint nilerr enabled * Refactored nil on err `internal/grpcwrapper/rawtopic/describe_topic.go`, when golangci-lint nilerr enabled diff --git a/examples/go.mod b/examples/go.mod index 1f950937c..1a74e556d 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module examples -go 1.20 +go 1.21 require ( github.com/google/uuid v1.3.0 diff --git a/go.mod b/go.mod index cef15c34c..1c0674d9b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ydb-platform/ydb-go-sdk/v3 -go 1.20 +go 1.21 require ( github.com/golang-jwt/jwt/v4 v4.4.1 diff --git a/tests/slo/go.mod b/tests/slo/go.mod index c2674885b..b2c7d4951 100644 --- a/tests/slo/go.mod +++ b/tests/slo/go.mod @@ -1,6 +1,6 @@ module slo -go 1.20 +go 1.21 require ( github.com/prometheus/client_golang v1.14.0 From f4f2d665757e740b356d45077ccfd5324500a181 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 12 Feb 2024 09:31:57 +0300 Subject: [PATCH 58/65] removed old aliases --- internal/background/worker_test.go | 8 ++++---- internal/conn/conn.go | 6 +++--- internal/table/client_test.go | 4 ++-- internal/table/scanner/result.go | 6 +++--- internal/table/session.go | 6 +++--- internal/table/transaction.go | 4 ++-- internal/topic/topicreaderinternal/batcher_test.go | 4 ++-- internal/topic/topicreaderinternal/message.go | 3 +-- .../topic/topicreaderinternal/partition_session.go | 6 +++--- .../topic/topicreaderinternal/stream_reader_impl.go | 4 ++-- internal/topic/topicwriterinternal/message.go | 3 +-- internal/topic/topicwriterinternal/queue_test.go | 3 +-- .../topic/topicwriterinternal/writer_reconnector.go | 4 ++-- .../topicwriterinternal/writer_reconnector_test.go | 3 +-- .../topicwriterinternal/writer_single_stream.go | 4 ++-- internal/xatomic/type.go | 10 ---------- internal/xbytes/clone.go | 10 ---------- internal/xsql/conn.go | 6 +++--- internal/xsync/event_broadcast_test.go | 12 ++++++------ .../basic_example_database_sql_bindings_test.go | 4 ++-- tests/integration/basic_example_database_sql_test.go | 4 ++-- tests/integration/basic_example_native_test.go | 6 +++--- tests/integration/topic_partitions_balanced_test.go | 6 +++--- tests/integration/topic_read_writer_test.go | 6 +++--- tests/integration/topic_stress_test.go | 4 ++-- topic/topicreader/reader.go | 10 +++++----- with.go | 4 ++-- 27 files changed, 63 insertions(+), 87 deletions(-) delete mode 100644 internal/xatomic/type.go delete mode 100644 internal/xbytes/clone.go diff --git a/internal/background/worker_test.go b/internal/background/worker_test.go index 6a3c13748..2a188fb00 100644 --- a/internal/background/worker_test.go +++ b/internal/background/worker_test.go @@ -4,13 +4,13 @@ import ( "context" "runtime" "sync" + "sync/atomic" "testing" "time" "github.com/stretchr/testify/require" "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" ) @@ -75,7 +75,7 @@ func TestWorkerClose(t *testing.T) { w := NewWorker(ctx) started := make(empty.Chan) - stopped := xatomic.Bool{} + stopped := atomic.Bool{} w.Start("test", func(innerCtx context.Context) { close(started) <-innerCtx.Done() @@ -101,12 +101,12 @@ func TestWorkerConcurrentStartAndClose(t *testing.T) { parallel := runtime.GOMAXPROCS(0) - var counter xatomic.Int64 + var counter atomic.Int64 ctx := xtest.Context(t) w := NewWorker(ctx) - stopNewStarts := xatomic.Bool{} + stopNewStarts := atomic.Bool{} var wgStarters sync.WaitGroup for i := 0; i < parallel; i++ { wgStarters.Add(1) diff --git a/internal/conn/conn.go b/internal/conn/conn.go index e20266f48..cec97c202 100644 --- a/internal/conn/conn.go +++ b/internal/conn/conn.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "sync" + "sync/atomic" "time" "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" @@ -16,7 +17,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/meta" "github.com/ydb-platform/ydb-go-sdk/v3/internal/response" "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/trace" @@ -54,7 +54,7 @@ type conn struct { done chan struct{} endpoint endpoint.Endpoint // ro access closed bool - state xatomic.Uint32 + state atomic.Uint32 lastUsage time.Time onClose []func(*conn) onTransportErrors []func(ctx context.Context, cc Conn, cause error) @@ -555,7 +555,7 @@ func getContextMark(ctx context.Context) *modificationMark { } type modificationMark struct { - dirty xatomic.Bool + dirty atomic.Bool } func (m *modificationMark) canRetry() bool { diff --git a/internal/table/client_test.go b/internal/table/client_test.go index a04672a4c..f1f1cc2f9 100644 --- a/internal/table/client_test.go +++ b/internal/table/client_test.go @@ -8,6 +8,7 @@ import ( "path" "runtime" "sync" + "sync/atomic" "testing" "time" @@ -20,7 +21,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/closer" "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/config" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xrand" @@ -678,7 +678,7 @@ func TestSessionPoolCloseIdleSessions(t *testing.T) { xtest.TestManyTimes(t, func(t testing.TB) { var ( idleThreshold = 4 * time.Second - closedCount xatomic.Int64 + closedCount atomic.Int64 fakeClock = clockwork.NewFakeClock() ) p := newClientWithStubBuilder( diff --git a/internal/table/scanner/result.go b/internal/table/scanner/result.go index 8cf05cf8e..9cdf8465b 100644 --- a/internal/table/scanner/result.go +++ b/internal/table/scanner/result.go @@ -4,11 +4,11 @@ import ( "context" "errors" "io" + "sync/atomic" "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_TableStats" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync" "github.com/ydb-platform/ydb-go-sdk/v3/table/result" @@ -20,11 +20,11 @@ var errAlreadyClosed = xerrors.Wrap(errors.New("result closed early")) type baseResult struct { scanner - nextResultSetCounter xatomic.Uint64 + nextResultSetCounter atomic.Uint64 statsMtx xsync.RWMutex stats *Ydb_TableStats.QueryStats - closed xatomic.Bool + closed atomic.Bool } type streamResult struct { diff --git a/internal/table/session.go b/internal/table/session.go index 7c904b247..3b40a3fe1 100644 --- a/internal/table/session.go +++ b/internal/table/session.go @@ -6,6 +6,7 @@ import ( "net/url" "strconv" "sync" + "sync/atomic" "time" "github.com/ydb-platform/ydb-go-genproto/Ydb_Table_V1" @@ -25,7 +26,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/config" "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/scanner" "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/retry" @@ -50,8 +50,8 @@ type session struct { status table.SessionStatus statusMtx sync.RWMutex - nodeID xatomic.Uint32 - lastUsage xatomic.Int64 + nodeID atomic.Uint32 + lastUsage atomic.Int64 onClose []func(s *session) closeOnce sync.Once diff --git a/internal/table/transaction.go b/internal/table/transaction.go index 180784c3a..90f5bd21b 100644 --- a/internal/table/transaction.go +++ b/internal/table/transaction.go @@ -3,6 +3,7 @@ package table import ( "context" "fmt" + "sync/atomic" "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Table" @@ -10,7 +11,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/operation" "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack" "github.com/ydb-platform/ydb-go-sdk/v3/internal/table/scanner" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/table" "github.com/ydb-platform/ydb-go-sdk/v3/table/options" @@ -24,7 +24,7 @@ var ( ) type txState struct { - rawVal xatomic.Uint32 + rawVal atomic.Uint32 } func (s *txState) Load() txStateEnum { diff --git a/internal/topic/topicreaderinternal/batcher_test.go b/internal/topic/topicreaderinternal/batcher_test.go index 83ebd4d08..1bcdb33ef 100644 --- a/internal/topic/topicreaderinternal/batcher_test.go +++ b/internal/topic/topicreaderinternal/batcher_test.go @@ -3,6 +3,7 @@ package topicreaderinternal import ( "context" "errors" + "sync/atomic" "testing" "time" @@ -10,7 +11,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicreader" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" ) @@ -282,7 +282,7 @@ func TestBatcher_PopMinIgnored(t *testing.T) { }, }})) - var IgnoreMinRestrictionsOnNextPopDone xatomic.Int64 + var IgnoreMinRestrictionsOnNextPopDone atomic.Int64 go func() { defer IgnoreMinRestrictionsOnNextPopDone.Add(1) diff --git a/internal/topic/topicreaderinternal/message.go b/internal/topic/topicreaderinternal/message.go index fd37be761..7e5818eaf 100644 --- a/internal/topic/topicreaderinternal/message.go +++ b/internal/topic/topicreaderinternal/message.go @@ -9,7 +9,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xbytes" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" ) @@ -145,7 +144,7 @@ func (pmb *PublicMessageBuilder) CreatedAt(createdAt time.Time) *PublicMessageBu func (pmb *PublicMessageBuilder) Metadata(metadata map[string][]byte) *PublicMessageBuilder { pmb.mess.Metadata = make(map[string][]byte, len(metadata)) for key, val := range metadata { - pmb.mess.Metadata[key] = xbytes.Clone(val) + pmb.mess.Metadata[key] = bytes.Clone(val) } return pmb diff --git a/internal/topic/topicreaderinternal/partition_session.go b/internal/topic/topicreaderinternal/partition_session.go index 215caec44..9e23c5495 100644 --- a/internal/topic/topicreaderinternal/partition_session.go +++ b/internal/topic/topicreaderinternal/partition_session.go @@ -4,10 +4,10 @@ import ( "context" "fmt" "sync" + "sync/atomic" "time" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicreader" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" ) @@ -28,8 +28,8 @@ type partitionSession struct { ctxCancel context.CancelFunc partitionSessionID rawtopicreader.PartitionSessionID - lastReceivedOffsetEndVal xatomic.Int64 - committedOffsetVal xatomic.Int64 + lastReceivedOffsetEndVal atomic.Int64 + committedOffsetVal atomic.Int64 } func newPartitionSession( diff --git a/internal/topic/topicreaderinternal/stream_reader_impl.go b/internal/topic/topicreaderinternal/stream_reader_impl.go index a77bf4fb3..51016b6e7 100644 --- a/internal/topic/topicreaderinternal/stream_reader_impl.go +++ b/internal/topic/topicreaderinternal/stream_reader_impl.go @@ -9,13 +9,13 @@ import ( "math/big" "reflect" "runtime/pprof" + "sync/atomic" "time" "github.com/ydb-platform/ydb-go-sdk/v3/credentials" "github.com/ydb-platform/ydb-go-sdk/v3/internal/background" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicreader" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync" @@ -37,7 +37,7 @@ type topicStreamReaderImpl struct { cancel context.CancelFunc freeBytes chan int - restBufferSizeBytes xatomic.Int64 + restBufferSizeBytes atomic.Int64 sessionController partitionSessionStorage backgroundWorkers background.Worker diff --git a/internal/topic/topicwriterinternal/message.go b/internal/topic/topicwriterinternal/message.go index e1590a20b..1e07f2587 100644 --- a/internal/topic/topicwriterinternal/message.go +++ b/internal/topic/topicwriterinternal/message.go @@ -9,7 +9,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicwriter" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xbytes" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" ) @@ -86,7 +85,7 @@ func (m *messageWithDataContent) cacheMetadata() { if len(m.Metadata) > 0 { ownCopy := make(map[string][]byte, len(m.Metadata)) for key, val := range m.Metadata { - ownCopy[key] = xbytes.Clone(val) + ownCopy[key] = bytes.Clone(val) } m.Metadata = ownCopy } else { diff --git a/internal/topic/topicwriterinternal/queue_test.go b/internal/topic/topicwriterinternal/queue_test.go index e39070d05..8cc6ade34 100644 --- a/internal/topic/topicwriterinternal/queue_test.go +++ b/internal/topic/topicwriterinternal/queue_test.go @@ -14,7 +14,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicwriter" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" ) @@ -142,7 +141,7 @@ func TestMessageQueue_GetMessages(t *testing.T) { }() readFinished := make(empty.Chan) - var lastReadSeqNo xatomic.Int64 + var lastReadSeqNo atomic.Int64 readCtx, readCancel := xcontext.WithCancel(ctx) defer readCancel() diff --git a/internal/topic/topicwriterinternal/writer_reconnector.go b/internal/topic/topicwriterinternal/writer_reconnector.go index f4dfc8e71..92bedbc3a 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector.go +++ b/internal/topic/topicwriterinternal/writer_reconnector.go @@ -8,6 +8,7 @@ import ( "math" "math/big" "runtime" + "sync/atomic" "time" "github.com/google/uuid" @@ -22,7 +23,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicwriter" "github.com/ydb-platform/ydb-go-sdk/v3/internal/topic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync" @@ -121,7 +121,7 @@ type WriterReconnector struct { queue messageQueue background background.Worker clock clockwork.Clock - firstConnectionHandled xatomic.Bool + firstConnectionHandled atomic.Bool firstInitResponseProcessedChan empty.Chan writerInstanceID string diff --git a/internal/topic/topicwriterinternal/writer_reconnector_test.go b/internal/topic/topicwriterinternal/writer_reconnector_test.go index 2b6fef701..4bf18c6ff 100644 --- a/internal/topic/topicwriterinternal/writer_reconnector_test.go +++ b/internal/topic/topicwriterinternal/writer_reconnector_test.go @@ -20,7 +20,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicwriter" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawydb" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" @@ -508,7 +507,7 @@ func TestWriterImpl_Reconnect(t *testing.T) { }, } - var connectionAttempt xatomic.Int64 + var connectionAttempt atomic.Int64 w.cfg.Connect = func(ctx context.Context) (RawTopicWriterStream, error) { attemptIndex := int(connectionAttempt.Add(1)) - 1 t.Logf("connect with attempt index: %v", attemptIndex) diff --git a/internal/topic/topicwriterinternal/writer_single_stream.go b/internal/topic/topicwriterinternal/writer_single_stream.go index ba140876b..444ae3d3d 100644 --- a/internal/topic/topicwriterinternal/writer_single_stream.go +++ b/internal/topic/topicwriterinternal/writer_single_stream.go @@ -5,12 +5,12 @@ import ( "errors" "fmt" "reflect" + "sync/atomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/background" "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicwriter" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/trace" @@ -57,7 +57,7 @@ type SingleStreamWriter struct { cfg SingleStreamWriterConfig allowedCodecs rawtopiccommon.SupportedCodecs background background.Worker - closed xatomic.Bool + closed atomic.Bool closeReason error closeCompleted empty.Chan } diff --git a/internal/xatomic/type.go b/internal/xatomic/type.go deleted file mode 100644 index 0ce078b19..000000000 --- a/internal/xatomic/type.go +++ /dev/null @@ -1,10 +0,0 @@ -package xatomic - -import "sync/atomic" - -type ( - Bool = atomic.Bool - Int64 = atomic.Int64 - Uint32 = atomic.Uint32 - Uint64 = atomic.Uint64 -) diff --git a/internal/xbytes/clone.go b/internal/xbytes/clone.go deleted file mode 100644 index 0b471be25..000000000 --- a/internal/xbytes/clone.go +++ /dev/null @@ -1,10 +0,0 @@ -package xbytes - -import "bytes" - -// Clone returns a copy of b[:len(b)]. -// The result may have additional unused capacity. -// Clone(nil) returns nil. -func Clone(b []byte) []byte { - return bytes.Clone(b) -} diff --git a/internal/xsql/conn.go b/internal/xsql/conn.go index 03ffaa1ef..5dd13743d 100644 --- a/internal/xsql/conn.go +++ b/internal/xsql/conn.go @@ -8,11 +8,11 @@ import ( "io" "path" "strings" + "sync/atomic" "time" "github.com/ydb-platform/ydb-go-sdk/v3/internal/scheme/helpers" "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/badconn" @@ -75,8 +75,8 @@ type conn struct { beginTxFuncs map[QueryMode]beginTxFunc - closed xatomic.Bool - lastUsage xatomic.Int64 + closed atomic.Bool + lastUsage atomic.Int64 defaultQueryMode QueryMode defaultTxControl *table.TransactionControl diff --git a/internal/xsync/event_broadcast_test.go b/internal/xsync/event_broadcast_test.go index c52d57bf7..93a8860b7 100644 --- a/internal/xsync/event_broadcast_test.go +++ b/internal/xsync/event_broadcast_test.go @@ -2,13 +2,13 @@ package xsync import ( "runtime" + "sync/atomic" "testing" "time" "github.com/stretchr/testify/require" "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" ) @@ -24,12 +24,12 @@ func TestEventBroadcast(t *testing.T) { testDuration := time.Second / 100 b := &EventBroadcast{} - var events xatomic.Int64 + var events atomic.Int64 - var backgroundCounter xatomic.Int64 - firstWaiterStarted := xatomic.Bool{} + var backgroundCounter atomic.Int64 + firstWaiterStarted := atomic.Bool{} - stopSubscribe := xatomic.Bool{} + stopSubscribe := atomic.Bool{} subscribeStopped := make(empty.Chan) broadcastStopped := make(empty.Chan) @@ -51,7 +51,7 @@ func TestEventBroadcast(t *testing.T) { } }() - stopBroadcast := xatomic.Bool{} + stopBroadcast := atomic.Bool{} go func() { defer close(broadcastStopped) diff --git a/tests/integration/basic_example_database_sql_bindings_test.go b/tests/integration/basic_example_database_sql_bindings_test.go index 39d955808..b59df9461 100644 --- a/tests/integration/basic_example_database_sql_bindings_test.go +++ b/tests/integration/basic_example_database_sql_bindings_test.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "path" + "sync/atomic" "testing" "time" @@ -17,7 +18,6 @@ import ( "google.golang.org/grpc/metadata" "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" "github.com/ydb-platform/ydb-go-sdk/v3/meta" "github.com/ydb-platform/ydb-go-sdk/v3/retry" @@ -31,7 +31,7 @@ func TestBasicExampleDatabaseSqlBindings(t *testing.T) { ctx, cancel := context.WithTimeout(xtest.Context(t), 42*time.Second) defer cancel() - var totalConsumedUnits xatomic.Uint64 + var totalConsumedUnits atomic.Uint64 defer func() { t.Logf("total consumed units: %d", totalConsumedUnits.Load()) }() diff --git a/tests/integration/basic_example_database_sql_test.go b/tests/integration/basic_example_database_sql_test.go index bf478ecd0..06af67bf9 100644 --- a/tests/integration/basic_example_database_sql_test.go +++ b/tests/integration/basic_example_database_sql_test.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "path" + "sync/atomic" "testing" "time" @@ -17,7 +18,6 @@ import ( "google.golang.org/grpc/metadata" "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" "github.com/ydb-platform/ydb-go-sdk/v3/meta" "github.com/ydb-platform/ydb-go-sdk/v3/retry" @@ -31,7 +31,7 @@ func TestBasicExampleDatabaseSql(t *testing.T) { ctx, cancel := context.WithTimeout(xtest.Context(t), 42*time.Second) defer cancel() - var totalConsumedUnits xatomic.Uint64 + var totalConsumedUnits atomic.Uint64 defer func() { t.Logf("total consumed units: %d", totalConsumedUnits.Load()) }() diff --git a/tests/integration/basic_example_native_test.go b/tests/integration/basic_example_native_test.go index f7d5deb6a..f6f4b7dde 100644 --- a/tests/integration/basic_example_native_test.go +++ b/tests/integration/basic_example_native_test.go @@ -13,6 +13,7 @@ import ( "runtime/debug" "strings" "sync" + "sync/atomic" "testing" "time" @@ -24,7 +25,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/balancers" "github.com/ydb-platform/ydb-go-sdk/v3/config" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync" "github.com/ydb-platform/ydb-go-sdk/v3/log" "github.com/ydb-platform/ydb-go-sdk/v3/meta" @@ -160,7 +160,7 @@ func TestBasicExampleNative(t *testing.T) { //nolint:gocyclo ctx, cancel := context.WithTimeout(context.Background(), 42*time.Second) defer cancel() - var totalConsumedUnits xatomic.Uint64 + var totalConsumedUnits atomic.Uint64 defer func() { t.Logf("total consumed units: %d", totalConsumedUnits.Load()) }() @@ -195,7 +195,7 @@ func TestBasicExampleNative(t *testing.T) { //nolint:gocyclo sessionsMtx sync.Mutex sessions = make(map[string]struct{}, limit) - shutdowned xatomic.Bool + shutdowned atomic.Bool shutdownTrace = trace.Table{ OnPoolSessionAdd: func(info trace.TablePoolSessionAddInfo) { diff --git a/tests/integration/topic_partitions_balanced_test.go b/tests/integration/topic_partitions_balanced_test.go index c0a512a4d..5ad88e15f 100644 --- a/tests/integration/topic_partitions_balanced_test.go +++ b/tests/integration/topic_partitions_balanced_test.go @@ -6,6 +6,7 @@ package integration import ( "context" "sync" + "sync/atomic" "testing" "time" @@ -13,7 +14,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topictypes" @@ -38,8 +38,8 @@ func TestTopicPartitionsBalanced(t *testing.T) { ) require.NoError(t, err) - var connectedPartitions xatomic.Int64 - var handled xatomic.Int64 + var connectedPartitions atomic.Int64 + var handled atomic.Int64 var sessionsMutex sync.Mutex sessions := map[int64]bool{} diff --git a/tests/integration/topic_read_writer_test.go b/tests/integration/topic_read_writer_test.go index 306b16b01..0634c4958 100644 --- a/tests/integration/topic_read_writer_test.go +++ b/tests/integration/topic_read_writer_test.go @@ -14,6 +14,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "testing" "time" @@ -24,7 +25,6 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/config" "github.com/ydb-platform/ydb-go-sdk/v3/internal/empty" "github.com/ydb-platform/ydb-go-sdk/v3/internal/version" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicsugar" @@ -372,7 +372,7 @@ func TestUpdateToken(t *testing.T) { var wg sync.WaitGroup wg.Add(1) - stopTopicActivity := xatomic.Bool{} + stopTopicActivity := atomic.Bool{} go func() { defer wg.Done() @@ -387,7 +387,7 @@ func TestUpdateToken(t *testing.T) { } }() - hasMessages := xatomic.Bool{} + hasMessages := atomic.Bool{} wg.Add(1) go func() { diff --git a/tests/integration/topic_stress_test.go b/tests/integration/topic_stress_test.go index e55b7a322..f6044e755 100644 --- a/tests/integration/topic_stress_test.go +++ b/tests/integration/topic_stress_test.go @@ -11,6 +11,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "testing" "time" @@ -18,7 +19,6 @@ import ( "golang.org/x/sync/errgroup" "github.com/ydb-platform/ydb-go-sdk/v3" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" @@ -90,7 +90,7 @@ func stressTestInATopic( writeStatusWriterSeqno := map[string]int64{} readStatusWriterMaxSeqNo := map[string]int64{} - var stopWrite xatomic.Bool + var stopWrite atomic.Bool writeToTopic := func(ctx context.Context, producerID string, wg *sync.WaitGroup) (resErr error) { var writer *topicwriter.Writer diff --git a/topic/topicreader/reader.go b/topic/topicreader/reader.go index cd6831f7e..9c50d4a51 100644 --- a/topic/topicreader/reader.go +++ b/topic/topicreader/reader.go @@ -2,9 +2,9 @@ package topicreader import ( "context" + "sync/atomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/topic/topicreaderinternal" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" ) @@ -21,8 +21,8 @@ import ( // | Close | - | - | - | - | type Reader struct { reader topicreaderinternal.Reader - readInFlyght xatomic.Bool - commitInFlyght xatomic.Bool + readInFlyght atomic.Bool + commitInFlyght atomic.Bool } // NewReader @@ -124,7 +124,7 @@ func (r *Reader) Close(ctx context.Context) error { return r.reader.Close(ctx) } -func (r *Reader) inCall(inFlight *xatomic.Bool) error { +func (r *Reader) inCall(inFlight *atomic.Bool) error { if inFlight.CompareAndSwap(false, true) { return nil } @@ -132,7 +132,7 @@ func (r *Reader) inCall(inFlight *xatomic.Bool) error { return xerrors.WithStackTrace(ErrConcurrencyCall) } -func (r *Reader) outCall(inFlight *xatomic.Bool) { +func (r *Reader) outCall(inFlight *atomic.Bool) { if inFlight.CompareAndSwap(true, false) { return } diff --git a/with.go b/with.go index f8a39d594..248ae9435 100644 --- a/with.go +++ b/with.go @@ -2,14 +2,14 @@ package ydb import ( "context" + "sync/atomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack" - "github.com/ydb-platform/ydb-go-sdk/v3/internal/xatomic" "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" "github.com/ydb-platform/ydb-go-sdk/v3/trace" ) -var nextID xatomic.Uint64 //nolint:gochecknoglobals +var nextID atomic.Uint64 //nolint:gochecknoglobals func (d *Driver) with(ctx context.Context, opts ...Option) (*Driver, uint64, error) { id := nextID.Add(1) From 37db19a067d3b3a56bab128bfeb7ed1a068c4e3d Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 12 Feb 2024 13:19:12 +0300 Subject: [PATCH 59/65] reproduce error in mock test --- .../writer_grpc_mock_test.go | 129 +++++++++++++++++ internal/xtest/ydb_grpc_mocks.go | 132 ++++++++++++++++++ tests/mocked/scope.go | 81 ----------- 3 files changed, 261 insertions(+), 81 deletions(-) create mode 100644 internal/topic/topicwriterinternal/writer_grpc_mock_test.go create mode 100644 internal/xtest/ydb_grpc_mocks.go delete mode 100644 tests/mocked/scope.go diff --git a/internal/topic/topicwriterinternal/writer_grpc_mock_test.go b/internal/topic/topicwriterinternal/writer_grpc_mock_test.go new file mode 100644 index 000000000..9388120d7 --- /dev/null +++ b/internal/topic/topicwriterinternal/writer_grpc_mock_test.go @@ -0,0 +1,129 @@ +package topicwriterinternal_test + +import ( + "errors" + "fmt" + "strings" + "testing" + + "github.com/rekby/fixenv" + "github.com/rekby/fixenv/sf" + "github.com/stretchr/testify/require" + "github.com/ydb-platform/ydb-go-genproto/Ydb_Topic_V1" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Issue" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Topic" + + "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest" + "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicoptions" + "github.com/ydb-platform/ydb-go-sdk/v3/topic/topicwriter" +) + +func TestRegressionOperationUnavailableIssue1007(t *testing.T) { + xtest.TestManyTimes(t, func(t testing.TB) { + e := fixenv.New(t) + + mock := newTopicWriterOperationUnavailable() + connString := xtest.GrpcMockTopicConnString(e, mock) + + db, err := ydb.Open(sf.Context(e), connString) + require.NoError(t, err) + + writer, err := db.Topic().StartWriter("test", topicoptions.WithWriterWaitServerAck(true)) + require.NoError(t, err) + + err = writer.Write(sf.Context(e), topicwriter.Message{ + Data: strings.NewReader("asd"), + }) + require.NoError(t, err) + require.True(t, mock.UnavailableResponsed) + }) +} + +type topicWriterOperationUnavailable struct { + Ydb_Topic_V1.UnimplementedTopicServiceServer + + UnavailableResponsed bool +} + +func newTopicWriterOperationUnavailable() *topicWriterOperationUnavailable { + return &topicWriterOperationUnavailable{} +} + +func (t *topicWriterOperationUnavailable) StreamWrite(server Ydb_Topic_V1.TopicService_StreamWriteServer) error { + initMsg, err := server.Recv() + if err != nil { + return fmt.Errorf("failed read init message: %w", err) + } + + if initMsg.GetInitRequest() == nil { + return errors.New("first message must be init message") + } + + err = server.Send(&Ydb_Topic.StreamWriteMessage_FromServer{ + Status: Ydb.StatusIds_SUCCESS, + ServerMessage: &Ydb_Topic.StreamWriteMessage_FromServer_InitResponse{InitResponse: &Ydb_Topic.StreamWriteMessage_InitResponse{ + LastSeqNo: 0, + SessionId: "test", + PartitionId: 0, + SupportedCodecs: nil, + }}}) + if err != nil { + return fmt.Errorf("failed to send init response: %w", err) + } + + if !t.UnavailableResponsed { + t.UnavailableResponsed = true + + err = server.Send(&Ydb_Topic.StreamWriteMessage_FromServer{ + Status: Ydb.StatusIds_UNAVAILABLE, + Issues: []*Ydb_Issue.IssueMessage{ + { + Message: "Test status unavailable", + }, + }, + }) + + if err != nil { + return fmt.Errorf("failed to send error response: %w", err) + } + + return nil + } + + // wait message block + messagesMsg, err := server.Recv() + if err != nil { + return errors.New("failed to read messages block") + } + + if len(messagesMsg.GetClientMessage().(*Ydb_Topic.StreamWriteMessage_FromClient_WriteRequest).WriteRequest.GetMessages()) == 0 { + return errors.New("received zero messages block") + } + + err = server.Send(&Ydb_Topic.StreamWriteMessage_FromServer{ + Status: Ydb.StatusIds_SUCCESS, + ServerMessage: &Ydb_Topic.StreamWriteMessage_FromServer_WriteResponse{ + WriteResponse: &Ydb_Topic.StreamWriteMessage_WriteResponse{ + Acks: []*Ydb_Topic.StreamWriteMessage_WriteResponse_WriteAck{ + { + SeqNo: 1, + MessageWriteStatus: &Ydb_Topic.StreamWriteMessage_WriteResponse_WriteAck_Written_{ + Written: &Ydb_Topic.StreamWriteMessage_WriteResponse_WriteAck_Written{ + Offset: 1, + }, + }, + }, + }, + PartitionId: 0, + WriteStatistics: &Ydb_Topic.StreamWriteMessage_WriteResponse_WriteStatistics{}, + }, + }}) + + if err != nil { + return fmt.Errorf("failed to sent write ack: %w", err) + } + + return nil +} diff --git a/internal/xtest/ydb_grpc_mocks.go b/internal/xtest/ydb_grpc_mocks.go new file mode 100644 index 000000000..bfbede716 --- /dev/null +++ b/internal/xtest/ydb_grpc_mocks.go @@ -0,0 +1,132 @@ +package xtest + +import ( + "context" + "fmt" + "net" + "reflect" + "strconv" + "time" + + "github.com/rekby/fixenv" + "github.com/rekby/fixenv/sf" + "github.com/ydb-platform/ydb-go-genproto/Ydb_Discovery_V1" + "github.com/ydb-platform/ydb-go-genproto/Ydb_Topic_V1" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Discovery" + "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Operations" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/anypb" +) + +func GrpcMockTopicConnString(e fixenv.Env, topicServiceImpl Ydb_Topic_V1.TopicServiceServer) string { + v := reflect.ValueOf(topicServiceImpl) + addr := v.Pointer() + + var f fixenv.GenericFixtureFunction[string] = func() (*fixenv.GenericResult[string], error) { + listener := sf.LocalTCPListenerNamed(e, fmt.Sprintf("ydb-grpc-mock-topic-%v", addr)) + connString := fmt.Sprintf("grpc://%s/local", listener.Addr()) + + mock, err := newGrpcMock(listener, topicServiceImpl) + if err != nil { + return nil, fmt.Errorf("failed to create grpc mock: %w", err) + } + + clean := func() { + _ = mock.Close() + } + + return fixenv.NewGenericResultWithCleanup(connString, clean), nil + } + + return fixenv.CacheResult(e, f, fixenv.CacheOptions{CacheKey: addr}) +} + +type grpcMock struct { + listener net.Listener + grpcServer *grpc.Server + stopChan chan error +} + +func (m *grpcMock) Close() error { + m.grpcServer.Stop() + return m.listener.Close() +} + +func newGrpcMock(listener net.Listener, topicServiceImpl Ydb_Topic_V1.TopicServiceServer) (*grpcMock, error) { + res := &grpcMock{ + listener: listener, + grpcServer: grpc.NewServer(), + stopChan: make(chan error, 1), + } + + host, portS, err := net.SplitHostPort(listener.Addr().String()) + if err != nil { + return nil, fmt.Errorf("failed to split host port addresses: %w", err) + } + + port, err := strconv.ParseUint(portS, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed convert port to int: %w", err) + } + discoveryService := newMockDiscoveryService(host, uint32(port)) + + Ydb_Discovery_V1.RegisterDiscoveryServiceServer(res.grpcServer, discoveryService) + Ydb_Topic_V1.RegisterTopicServiceServer(res.grpcServer, topicServiceImpl) + + go func() { + res.stopChan <- res.grpcServer.Serve(res.listener) + }() + + select { + case <-res.stopChan: + return nil, err + case <-time.After(time.Millisecond): + return res, nil + } +} + +type mockDiscoveryService struct { + Ydb_Discovery_V1.UnimplementedDiscoveryServiceServer + host string + port uint32 +} + +func newMockDiscoveryService(host string, port uint32) *mockDiscoveryService { + return &mockDiscoveryService{ + host: host, + port: port, + } +} + +func (m mockDiscoveryService) ListEndpoints(ctx context.Context, request *Ydb_Discovery.ListEndpointsRequest) (*Ydb_Discovery.ListEndpointsResponse, error) { + res := &Ydb_Discovery.ListEndpointsResult{ + Endpoints: []*Ydb_Discovery.EndpointInfo{ + { + Address: m.host, + Port: m.port, + LoadFactor: 0, + Ssl: false, + Service: nil, + Location: "", + NodeId: 1, + IpV4: []string{"127.0.0.1"}, + }, + }, + SelfLocation: "", + } + resp := &Ydb_Discovery.ListEndpointsResponse{ + Operation: &Ydb_Operations.Operation{ + Id: "test-list-operation", + Ready: true, + Status: Ydb.StatusIds_SUCCESS, + Result: &anypb.Any{}, + }} + err := resp.GetOperation().GetResult().MarshalFrom(res) + return resp, err +} + +func (m mockDiscoveryService) WhoAmI(ctx context.Context, request *Ydb_Discovery.WhoAmIRequest) (*Ydb_Discovery.WhoAmIResponse, error) { + //TODO implement me + panic("implement me") +} diff --git a/tests/mocked/scope.go b/tests/mocked/scope.go deleted file mode 100644 index 82005e21c..000000000 --- a/tests/mocked/scope.go +++ /dev/null @@ -1,81 +0,0 @@ -package mocked - -import ( - "context" - "fmt" - "net" - "testing" - - "github.com/rekby/fixenv" - "github.com/rekby/fixenv/sf" - "github.com/stretchr/testify/require" - "google.golang.org/grpc" -) - -type scopeT struct { - Ctx context.Context - fixenv.Env - Require *require.Assertions - t testing.TB -} - -func newScope(t *testing.T) *scopeT { - at := require.New(t) - fEnv := fixenv.NewEnv(t) - ctx, ctxCancel := context.WithCancel(context.Background()) - t.Cleanup(func() { - ctxCancel() - }) - res := &scopeT{ - Ctx: ctx, - Env: fEnv, - Require: at, - t: t, - } - return res -} - -func (scope *scopeT) T() testing.TB { - return scope.t -} - -func (scope *scopeT) Logf(format string, args ...interface{}) { - scope.t.Helper() - scope.t.Logf(format, args...) -} - -func (scope *scopeT) Failed() bool { - return scope.t.Failed() -} - -type serviceImplementationMap map[*grpc.ServiceDesc]any // service description -> service implementation - -func (scope *scopeT) StartYDBMock(services serviceImplementationMap) string { - grpcServer := grpc.NewServer() - listener, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - scope.T().Fatal("Failed to listen port for ydb mock: %+v", err) - } - scope.T().Cleanup(func() { - grpcServer.Stop() - _ = listener.Close() - }) - - for service, impl := range services { - grpcServer.RegisterService(service, impl) - } - - go func() { - err := grpcServer.Serve(listener) - if err != nil { - scope.T().Fatal("failed to start grpc server: %+v", err) - } - }() - - connString := fmt.Sprintf("grpc://%s/local", listener.Addr()) - return connString -} - -func (scope *scopeT) MockYdbListener() net.Listener { - return sf.LocalTCPListenerNamed(scope.Env, "ydb-mock") -} From 62ab80c2a23cec4c307e3b2d34ed9a4188ca1d3e Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 12 Feb 2024 13:42:42 +0300 Subject: [PATCH 60/65] reproduce error in mock test --- CHANGELOG.md | 1 + .../rawtopic/rawtopicreader/rawtopicreader.go | 4 +++- .../rawtopic/rawtopicwriter/streamwriter.go | 4 +++- .../writer_grpc_mock_test.go | 21 ++++++++++++------- internal/xerrors/xerrors.go | 6 ++++++ internal/xtest/ydb_grpc_mocks.go | 18 +++++++++++----- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86c81bc7f..c4be4c050 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* Fixed handle of operational errors in topic streams * Fixed topic writer infinite reconnections in some cases * Refactored nil on err `internal/grpcwrapper/rawydb/issues.go`, when golangci-lint nilerr enabled * Refactored nil on err `internal/grpcwrapper/rawtopic/describe_topic.go`, when golangci-lint nilerr enabled diff --git a/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go b/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go index 8baad01a0..55520e54b 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go +++ b/internal/grpcwrapper/rawtopic/rawtopicreader/rawtopicreader.go @@ -31,7 +31,9 @@ func (s StreamReader) CloseSend() error { func (s StreamReader) Recv() (ServerMessage, error) { grpcMess, err := s.Stream.Recv() if err != nil { - err = xerrors.Transport(err) + if !xerrors.IsErrorFromServer(err) { + err = xerrors.Transport(err) + } return nil, err } diff --git a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go index 829fb1b66..67ee3efe0 100644 --- a/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go +++ b/internal/grpcwrapper/rawtopic/rawtopicwriter/streamwriter.go @@ -41,7 +41,9 @@ func (w *StreamWriter) Recv() (ServerMessage, error) { grpcMsg, err := w.Stream.Recv() if err != nil { - err = xerrors.Transport(err) + if !xerrors.IsErrorFromServer(err) { + err = xerrors.Transport(err) + } return nil, xerrors.WithStackTrace(xerrors.Wrap(fmt.Errorf( "ydb: failed to read grpc message from writer stream: %w", diff --git a/internal/topic/topicwriterinternal/writer_grpc_mock_test.go b/internal/topic/topicwriterinternal/writer_grpc_mock_test.go index 9388120d7..1a977cb75 100644 --- a/internal/topic/topicwriterinternal/writer_grpc_mock_test.go +++ b/internal/topic/topicwriterinternal/writer_grpc_mock_test.go @@ -63,12 +63,15 @@ func (t *topicWriterOperationUnavailable) StreamWrite(server Ydb_Topic_V1.TopicS err = server.Send(&Ydb_Topic.StreamWriteMessage_FromServer{ Status: Ydb.StatusIds_SUCCESS, - ServerMessage: &Ydb_Topic.StreamWriteMessage_FromServer_InitResponse{InitResponse: &Ydb_Topic.StreamWriteMessage_InitResponse{ - LastSeqNo: 0, - SessionId: "test", - PartitionId: 0, - SupportedCodecs: nil, - }}}) + ServerMessage: &Ydb_Topic.StreamWriteMessage_FromServer_InitResponse{ + InitResponse: &Ydb_Topic.StreamWriteMessage_InitResponse{ + LastSeqNo: 0, + SessionId: "test", + PartitionId: 0, + SupportedCodecs: nil, + }, + }, + }) if err != nil { return fmt.Errorf("failed to send init response: %w", err) } @@ -98,7 +101,8 @@ func (t *topicWriterOperationUnavailable) StreamWrite(server Ydb_Topic_V1.TopicS return errors.New("failed to read messages block") } - if len(messagesMsg.GetClientMessage().(*Ydb_Topic.StreamWriteMessage_FromClient_WriteRequest).WriteRequest.GetMessages()) == 0 { + if len(messagesMsg.GetClientMessage().(*Ydb_Topic.StreamWriteMessage_FromClient_WriteRequest). + WriteRequest.GetMessages()) == 0 { return errors.New("received zero messages block") } @@ -119,7 +123,8 @@ func (t *topicWriterOperationUnavailable) StreamWrite(server Ydb_Topic_V1.TopicS PartitionId: 0, WriteStatistics: &Ydb_Topic.StreamWriteMessage_WriteResponse_WriteStatistics{}, }, - }}) + }, + }) if err != nil { return fmt.Errorf("failed to sent write ack: %w", err) diff --git a/internal/xerrors/xerrors.go b/internal/xerrors/xerrors.go index a97328793..a15bf85f8 100644 --- a/internal/xerrors/xerrors.go +++ b/internal/xerrors/xerrors.go @@ -79,6 +79,12 @@ func As(err error, targets ...interface{}) bool { return false } +// IsErrorFromServer return true if err returned from server +// (opposite to raised internally in sdk) +func IsErrorFromServer(err error) bool { + return IsTransportError(err) || IsOperationError(err) +} + // Is is a improved proxy to errors.Is // This need to single import errors func Is(err error, targets ...error) bool { diff --git a/internal/xtest/ydb_grpc_mocks.go b/internal/xtest/ydb_grpc_mocks.go index bfbede716..d3816feca 100644 --- a/internal/xtest/ydb_grpc_mocks.go +++ b/internal/xtest/ydb_grpc_mocks.go @@ -50,6 +50,7 @@ type grpcMock struct { func (m *grpcMock) Close() error { m.grpcServer.Stop() + return m.listener.Close() } @@ -99,7 +100,10 @@ func newMockDiscoveryService(host string, port uint32) *mockDiscoveryService { } } -func (m mockDiscoveryService) ListEndpoints(ctx context.Context, request *Ydb_Discovery.ListEndpointsRequest) (*Ydb_Discovery.ListEndpointsResponse, error) { +func (m mockDiscoveryService) ListEndpoints( + ctx context.Context, + request *Ydb_Discovery.ListEndpointsRequest, +) (*Ydb_Discovery.ListEndpointsResponse, error) { res := &Ydb_Discovery.ListEndpointsResult{ Endpoints: []*Ydb_Discovery.EndpointInfo{ { @@ -121,12 +125,16 @@ func (m mockDiscoveryService) ListEndpoints(ctx context.Context, request *Ydb_Di Ready: true, Status: Ydb.StatusIds_SUCCESS, Result: &anypb.Any{}, - }} + }, + } err := resp.GetOperation().GetResult().MarshalFrom(res) + return resp, err } -func (m mockDiscoveryService) WhoAmI(ctx context.Context, request *Ydb_Discovery.WhoAmIRequest) (*Ydb_Discovery.WhoAmIResponse, error) { - //TODO implement me - panic("implement me") +func (m mockDiscoveryService) WhoAmI( + ctx context.Context, + request *Ydb_Discovery.WhoAmIRequest, +) (*Ydb_Discovery.WhoAmIResponse, error) { + panic("unimplemented") } From 77a53bea6ea72844fc8a34a4bcd5fad91cc7dac7 Mon Sep 17 00:00:00 2001 From: robot Date: Mon, 12 Feb 2024 11:00:22 +0000 Subject: [PATCH 61/65] Release v3.56.0 --- CHANGELOG.md | 1 + internal/version/version.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 793119b86..b9f635fcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +## v3.56.0 * Fixed handle of operational errors in topic streams * The minimum version of Go in `ydb-go-sdk` has been raised to `go1.21` * Fixed topic writer infinite reconnections in some cases diff --git a/internal/version/version.go b/internal/version/version.go index 21696416c..2bb16b2f4 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -2,8 +2,8 @@ package version const ( Major = "3" - Minor = "55" - Patch = "2" + Minor = "56" + Patch = "0" Prefix = "ydb-go-sdk" ) From d56891cc8eb587e7a788531affd70ca182d50fa3 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 12 Feb 2024 16:00:36 +0300 Subject: [PATCH 62/65] Fixed fixenv usage --- CHANGELOG.md | 2 ++ tests/integration/helpers_test.go | 57 +++++++++++++++---------------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9f635fcb..b6a297fff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Fixed fixenv usage (related to tests only) + ## v3.56.0 * Fixed handle of operational errors in topic streams * The minimum version of Go in `ydb-go-sdk` has been raised to `go1.21` diff --git a/tests/integration/helpers_test.go b/tests/integration/helpers_test.go index 730241e04..9184ad86c 100644 --- a/tests/integration/helpers_test.go +++ b/tests/integration/helpers_test.go @@ -67,16 +67,6 @@ func (scope *scopeT) Failed() bool { return scope.t.Failed() } -// CacheWithCleanup wrap new interface as deprecated - for prevent re-write a lot of code -// in new code prefer to use generic version of cache: fixenv.CacheResult(env, ...) -func (scope *scopeT) CacheWithCleanup(cacheKey interface{}, opt *fixenv.FixtureOptions, f fixenv.FixtureCallbackWithCleanupFunc) interface{} { - fWrap := func() (*fixenv.Result, error) { - res, cleanup, err := f() - return fixenv.NewResultWithCleanup(res, cleanup), err - } - return scope.CacheResult(fWrap) -} - func (scope *scopeT) ConnectionString() string { if envString := os.Getenv("YDB_CONNECTION_STRING"); envString != "" { return envString @@ -89,7 +79,7 @@ func (scope *scopeT) AuthToken() string { } func (scope *scopeT) Driver(opts ...ydb.Option) *ydb.Driver { - return scope.CacheWithCleanup("", nil, func() (res interface{}, cleanup fixenv.FixtureCleanupFunc, err error) { + f := func() (*fixenv.GenericResult[*ydb.Driver], error) { connectionString := scope.ConnectionString() scope.Logf("Connect with connection string: %v", connectionString) @@ -115,8 +105,11 @@ func (scope *scopeT) Driver(opts ...ydb.Option) *ydb.Driver { clean := func() { scope.Require.NoError(driver.Close(scope.Ctx)) } - return driver, clean, err - }).(*ydb.Driver) + + return fixenv.NewGenericResultWithCleanup(driver, clean), err + } + + return fixenv.CacheResult(scope.Env, f) } func (scope *scopeT) SQLDriver(opts ...ydb.ConnectorOption) *sql.DB { @@ -146,7 +139,7 @@ func (scope *scopeT) SQLDriverWithFolder(opts ...ydb.ConnectorOption) *sql.DB { } func (scope *scopeT) Folder() string { - return scope.CacheWithCleanup(nil, nil, func() (res interface{}, cleanup fixenv.FixtureCleanupFunc, err error) { + f := func() (*fixenv.GenericResult[string], error) { driver := scope.Driver() folderPath := path.Join(driver.Name(), scope.T().Name()) scope.Require.NoError(sugar.RemoveRecursive(scope.Ctx, driver, folderPath)) @@ -158,8 +151,9 @@ func (scope *scopeT) Folder() string { scope.Require.NoError(sugar.RemoveRecursive(scope.Ctx, driver, folderPath)) } } - return folderPath, clean, nil - }).(string) + return fixenv.NewGenericResultWithCleanup(folderPath, clean), nil + } + return fixenv.CacheResult(scope.Env, f) } func (scope *scopeT) Logger() *testLogger { @@ -179,57 +173,62 @@ func (scope *scopeT) TopicConsumerName() string { } func (scope *scopeT) TopicPath() string { - return scope.CacheWithCleanup(nil, nil, func() (res interface{}, cleanup fixenv.FixtureCleanupFunc, err error) { + f := func() (*fixenv.GenericResult[string], error) { topicName := strings.Replace(scope.T().Name(), "/", "__", -1) topicPath := path.Join(scope.Folder(), topicName) client := scope.Driver().Topic() - cleanup = func() { + cleanup := func() { if !scope.Failed() { _ = client.Drop(scope.Ctx, topicPath) } } cleanup() - err = client.Create(scope.Ctx, topicPath, topicoptions.CreateWithConsumer( + err := client.Create(scope.Ctx, topicPath, topicoptions.CreateWithConsumer( topictypes.Consumer{ Name: scope.TopicConsumerName(), }, )) - return topicPath, cleanup, err - }).(string) + return fixenv.NewGenericResultWithCleanup(topicPath, cleanup), err + } + return fixenv.CacheResult(scope.Env, f) } func (scope *scopeT) TopicReader() *topicreader.Reader { - return scope.CacheWithCleanup(nil, nil, func() (res interface{}, cleanup fixenv.FixtureCleanupFunc, err error) { + f := func() (*fixenv.GenericResult[*topicreader.Reader], error) { reader, err := scope.Driver().Topic().StartReader( scope.TopicConsumerName(), topicoptions.ReadTopic(scope.TopicPath()), ) - cleanup = func() { + cleanup := func() { if reader != nil { _ = reader.Close(scope.Ctx) } } - return reader, cleanup, err - }).(*topicreader.Reader) + return fixenv.NewGenericResultWithCleanup(reader, cleanup), err + } + + return fixenv.CacheResult(scope.Env, f) } func (scope *scopeT) TopicWriter() *topicwriter.Writer { - return scope.CacheWithCleanup(nil, nil, func() (res interface{}, cleanup fixenv.FixtureCleanupFunc, err error) { + f := func() (*fixenv.GenericResult[*topicwriter.Writer], error) { writer, err := scope.Driver().Topic().StartWriter( scope.TopicPath(), topicoptions.WithWriterProducerID(scope.TopicWriterProducerID()), topicoptions.WithWriterWaitServerAck(true), ) - cleanup = func() { + cleanup := func() { if writer != nil { _ = writer.Close(scope.Ctx) } } - return writer, cleanup, err - }).(*topicwriter.Writer) + return fixenv.NewGenericResultWithCleanup(writer, cleanup), err + } + + return fixenv.CacheResult(scope.Env, f) } func (scope *scopeT) TopicWriterProducerID() string { From 87882ee658c4671acd4fc0f9724f3671538ef292 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Mon, 12 Feb 2024 17:26:55 +0300 Subject: [PATCH 63/65] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a297fff..15707314b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ * Refactored nil on err `internal/grpcwrapper/rawydb/issues.go`, when golangci-lint nilerr enabled * Refactored nil on err `internal/grpcwrapper/rawtopic/describe_topic.go`, when golangci-lint nilerr enabled +## v3.55.3 +* Fixed handle of operational errors in topic streams (backported fix only) + ## v3.55.2 * Fixed init info in topic writer, when autoseq num turned off. From e11e78eb3e02d88eaa758cb053f548e05abfc176 Mon Sep 17 00:00:00 2001 From: robot Date: Mon, 12 Feb 2024 14:27:11 +0000 Subject: [PATCH 64/65] Release v3.56.1 --- CHANGELOG.md | 1 + internal/version/version.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a297fff..dfa32ccb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +## v3.56.1 * Fixed fixenv usage (related to tests only) ## v3.56.0 diff --git a/internal/version/version.go b/internal/version/version.go index 2bb16b2f4..72df04221 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -3,7 +3,7 @@ package version const ( Major = "3" Minor = "56" - Patch = "0" + Patch = "1" Prefix = "ydb-go-sdk" ) From 57b94bea49bdb27cf00559ab1807721cddae2433 Mon Sep 17 00:00:00 2001 From: Timofey Koolin Date: Tue, 13 Feb 2024 09:10:48 +0300 Subject: [PATCH 65/65] Push to main branch before create tag. For prevent situation when tag point to commit, which doesn't exist in main branch. --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fb3f63aa4..61361f822 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -70,7 +70,7 @@ jobs: TAG="v$MAJOR.$MINOR.$PATCH"; fi; git tag $TAG - git push --tags && git push + git push && git push --tags CHANGELOG="$CHANGELOG Full Changelog: [$LAST_TAG...$TAG](https://github.com/ydb-platform/ydb-go-sdk/compare/$LAST_TAG...$TAG)"