Skip to content

Commit a06f128

Browse files
authored
Merge pull request #1371 from ydb-platform/xerrors
xerrors improvements
2 parents 2f1bfc1 + e4006aa commit a06f128

File tree

7 files changed

+155
-129
lines changed

7 files changed

+155
-129
lines changed

internal/balancer/balancer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ func (b *Balancer) wrapCall(ctx context.Context, f func(ctx context.Context, cc
291291
if cc.GetState() == conn.Banned {
292292
b.pool.Allow(ctx, cc)
293293
}
294-
} else if xerrors.MustPessimizeEndpoint(err, b.driverConfig.ExcludeGRPCCodesForPessimization()...) {
294+
} else if conn.IsBadConn(err, b.driverConfig.ExcludeGRPCCodesForPessimization()...) {
295295
b.pool.Ban(ctx, cc, err)
296296
}
297297
}()

internal/conn/errors.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package conn
2+
3+
import (
4+
grpcCodes "google.golang.org/grpc/codes"
5+
6+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
7+
)
8+
9+
func IsBadConn(err error, goodConnCodes ...grpcCodes.Code) bool {
10+
if !xerrors.IsTransportError(err) {
11+
return false
12+
}
13+
14+
if xerrors.IsTransportError(err,
15+
append(
16+
goodConnCodes,
17+
grpcCodes.ResourceExhausted,
18+
grpcCodes.OutOfRange,
19+
grpcCodes.OK,
20+
// grpcCodes.Canceled,
21+
// grpcCodes.Unknown,
22+
// grpcCodes.InvalidArgument,
23+
// grpcCodes.DeadlineExceeded,
24+
// grpcCodes.NotFound,
25+
// grpcCodes.AlreadyExists,
26+
// grpcCodes.PermissionDenied,
27+
// grpcCodes.FailedPrecondition,
28+
// grpcCodes.Aborted,
29+
// grpcCodes.OutOfRange,
30+
// grpcCodes.Unimplemented,
31+
// grpcCodes.Internal,
32+
// grpcCodes.DataLoss,
33+
// grpcCodes.Unauthenticated,
34+
)...,
35+
) {
36+
return false
37+
}
38+
39+
return true
40+
}

internal/conn/errors_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package conn
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
grpcCodes "google.golang.org/grpc/codes"
9+
grpcStatus "google.golang.org/grpc/status"
10+
11+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
12+
)
13+
14+
func TestIsBadConn(t *testing.T) {
15+
for i, tt := range []struct {
16+
err error
17+
goodConnCodes []grpcCodes.Code
18+
badConn bool
19+
}{
20+
{
21+
err: fmt.Errorf("test"),
22+
badConn: false,
23+
},
24+
{
25+
err: xerrors.Operation(),
26+
badConn: false,
27+
},
28+
{
29+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.ResourceExhausted, "")),
30+
badConn: false,
31+
},
32+
{
33+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unavailable, "")),
34+
badConn: true,
35+
},
36+
{
37+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.OK, "")),
38+
badConn: false,
39+
},
40+
{
41+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Canceled, "")),
42+
badConn: true,
43+
},
44+
{
45+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unknown, "")),
46+
badConn: true,
47+
},
48+
{
49+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.InvalidArgument, "")),
50+
badConn: true,
51+
},
52+
{
53+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.DeadlineExceeded, "")),
54+
badConn: true,
55+
},
56+
{
57+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.NotFound, "")),
58+
badConn: true,
59+
},
60+
{
61+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.AlreadyExists, "")),
62+
badConn: true,
63+
},
64+
{
65+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.PermissionDenied, "")),
66+
badConn: true,
67+
},
68+
{
69+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.FailedPrecondition, "")),
70+
badConn: true,
71+
},
72+
{
73+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Aborted, "")),
74+
badConn: true,
75+
},
76+
{
77+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.OutOfRange, "")),
78+
badConn: false,
79+
},
80+
{
81+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unimplemented, "")),
82+
badConn: true,
83+
},
84+
{
85+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Internal, "")),
86+
badConn: true,
87+
},
88+
{
89+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.DataLoss, "")),
90+
badConn: true,
91+
},
92+
{
93+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unauthenticated, "")),
94+
badConn: true,
95+
},
96+
{
97+
err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unauthenticated, "")),
98+
goodConnCodes: []grpcCodes.Code{
99+
grpcCodes.Unauthenticated,
100+
},
101+
badConn: false,
102+
},
103+
} {
104+
t.Run(fmt.Sprintf("%d. %v", i, tt.err), func(t *testing.T) {
105+
require.Equal(t, tt.badConn, IsBadConn(tt.err, tt.goodConnCodes...))
106+
require.Equal(t, tt.badConn, IsBadConn(xerrors.WithStackTrace(tt.err), tt.goodConnCodes...))
107+
require.Equal(t, tt.badConn, IsBadConn(xerrors.Retryable(tt.err), tt.goodConnCodes...))
108+
})
109+
}
110+
}

internal/xerrors/pessimized_error_test.go

Lines changed: 0 additions & 106 deletions
This file was deleted.

internal/xerrors/retryable.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ func InvalidObject() invalidObjectOption {
9797
}
9898

9999
func Retryable(err error, opts ...RetryableErrorOption) error {
100+
if err == nil {
101+
return nil
102+
}
100103
var (
101104
e Error
102105
re = &retryableError{

internal/xerrors/transport.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -180,27 +180,6 @@ func Transport(err error, opts ...teOpt) error {
180180
return te
181181
}
182182

183-
func MustPessimizeEndpoint(err error, codes ...grpcCodes.Code) bool {
184-
switch {
185-
case err == nil:
186-
return false
187-
188-
// all transport errors except selected codes
189-
case IsTransportError(err) && !IsTransportError(
190-
err,
191-
append(
192-
codes,
193-
grpcCodes.ResourceExhausted,
194-
grpcCodes.OutOfRange,
195-
)...,
196-
):
197-
return true
198-
199-
default:
200-
return false
201-
}
202-
}
203-
204183
func TransportError(err error) Error {
205184
if err == nil {
206185
return nil

internal/xerrors/transport_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func TestGrpcError(t *testing.T) {
143143
}
144144
}
145145

146-
func Test_transportError_Error(t *testing.T) {
146+
func TestTransportErrorString(t *testing.T) {
147147
for _, tt := range []struct {
148148
err error
149149
text string

0 commit comments

Comments
 (0)