Skip to content

Commit a69f16f

Browse files
committed
OperationCompleted -> OperationStatus + fix integration tests
1 parent 2bc6312 commit a69f16f

File tree

11 files changed

+334
-397
lines changed

11 files changed

+334
-397
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Added `With[Custom]UserAgent()` `Option` and `CustomOption` constructors
1010
* Refactored `log.Logger` interface and internal implementation
1111
* Added `retry.RetryableError()` for returns user-defined error which must be retryed
12+
* Renamed internal type `internal.errors.OperationCompleted` to `internal.errors.OperationStatus`
13+
* Added `String()` method to `table.KeyRange` and `table.Value` types
1214

1315
## 3.6.2
1416
* Refactored table retry helpers

internal/errors/operation.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,20 +103,20 @@ func IsOpError(err error, code StatusCode) bool {
103103
return op.Reason == code
104104
}
105105

106-
func (e StatusCode) OperationCompleted() OperationCompleted {
106+
func (e StatusCode) OperationStatus() OperationStatus {
107107
switch e {
108108
case
109109
StatusAborted,
110110
StatusUnavailable,
111111
StatusOverloaded,
112112
StatusBadSession,
113113
StatusSessionBusy:
114-
return OperationCompletedFalse
114+
return OperationNotFinished
115115
case
116116
StatusUndetermined:
117-
return OperationCompletedUndefined
117+
return OperationStatusUndefined
118118
default:
119-
return OperationCompletedTrue
119+
return OperationFinished
120120
}
121121
}
122122

internal/errors/retry.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ import "fmt"
55
// RetryType reports which operations need to retry
66
type RetryType uint8
77

8-
// OperationCompleted reports which status of operation: completed or none
9-
type OperationCompleted uint8
8+
// OperationStatus reports which status of operation: completed or none
9+
type OperationStatus uint8
1010

11-
// Binary flags that used as OperationCompleted
11+
// Binary flags that used as OperationStatus
1212
const (
13-
OperationCompletedTrue = OperationCompleted(1 << iota >> 1)
14-
OperationCompletedUndefined // may be true or may be false
15-
OperationCompletedFalse
13+
OperationFinished = OperationStatus(1 << iota >> 1)
14+
OperationStatusUndefined // may be true or may be false
15+
OperationNotFinished
1616
)
1717

18-
func (t OperationCompleted) String() string {
18+
func (t OperationStatus) String() string {
1919
switch t {
20-
case OperationCompletedTrue:
20+
case OperationFinished:
2121
return "operation was completed, no need retries"
22-
case OperationCompletedFalse:
22+
case OperationNotFinished:
2323
return "operation was not completed, need retries"
24-
case OperationCompletedUndefined:
24+
case OperationStatusUndefined:
2525
return "operation completed status undefined, no need retries"
2626
default:
2727
return fmt.Sprintf("unknown operation completed code: %d", t)

internal/errors/retryable.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package errors
22

33
type RetryableError struct {
4-
Msg string
4+
Err error
55
BackoffType BackoffType
66
MustDeleteSession bool
77
}
88

99
func (e *RetryableError) Error() string {
10-
return e.Msg
10+
return e.Err.Error()
1111
}

internal/errors/transport.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,19 +206,19 @@ func (t TransportErrorCode) String() string {
206206
return transportErrorString(t)
207207
}
208208

209-
func (t TransportErrorCode) OperationCompleted() OperationCompleted {
209+
func (t TransportErrorCode) OperationStatus() OperationStatus {
210210
switch t {
211211
case
212212
TransportErrorAborted,
213213
TransportErrorResourceExhausted:
214-
return OperationCompletedFalse
214+
return OperationNotFinished
215215
case
216216
TransportErrorInternal,
217217
TransportErrorCanceled,
218218
TransportErrorUnavailable:
219-
return OperationCompletedUndefined
219+
return OperationStatusUndefined
220220
default:
221-
return OperationCompletedTrue
221+
return OperationFinished
222222
}
223223
}
224224

internal/value/value.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
type V interface {
1313
ToYDB() *Ydb.TypedValue
14+
String() string
1415
toString(*bytes.Buffer)
1516
}
1617

retry/retry.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ func WithDeleteSession() retryableErrorOption {
5151
}
5252
}
5353

54-
func RetryableError(msg string, opts ...retryableErrorOption) error {
54+
func RetryableError(err error, opts ...retryableErrorOption) error {
5555
re := &errors.RetryableError{
56-
Msg: msg,
56+
Err: err,
5757
}
5858
for _, o := range opts {
5959
o(re)
@@ -66,6 +66,7 @@ func RetryableError(msg string, opts ...retryableErrorOption) error {
6666
// - deadline was canceled or deadlined
6767
// - retry operation returned nil as error
6868
// Warning: if deadline without deadline or cancellation func Retry will be worked infinite
69+
// If you need to retry your op func on some logic errors - you must returns from op func RetryableError()
6970
func Retry(ctx context.Context, isIdempotentOperation bool, op retryOperation) (err error) {
7071
var (
7172
i int
@@ -113,31 +114,31 @@ func Check(err error) (m retryMode) {
113114
switch {
114115
case errors.As(err, &te):
115116
return retryMode{
116-
statusCode: int32(te.Reason),
117-
operationCompleted: te.Reason.OperationCompleted(),
118-
backoff: te.Reason.BackoffType(),
119-
deleteSession: te.Reason.MustDeleteSession(),
117+
statusCode: int32(te.Reason),
118+
operationStatus: te.Reason.OperationStatus(),
119+
backoff: te.Reason.BackoffType(),
120+
deleteSession: te.Reason.MustDeleteSession(),
120121
}
121122
case errors.As(err, &oe):
122123
return retryMode{
123-
statusCode: int32(oe.Reason),
124-
operationCompleted: oe.Reason.OperationCompleted(),
125-
backoff: oe.Reason.BackoffType(),
126-
deleteSession: oe.Reason.MustDeleteSession(),
124+
statusCode: int32(oe.Reason),
125+
operationStatus: oe.Reason.OperationStatus(),
126+
backoff: oe.Reason.BackoffType(),
127+
deleteSession: oe.Reason.MustDeleteSession(),
127128
}
128129
case errors.As(err, &re):
129130
return retryMode{
130-
statusCode: -1,
131-
operationCompleted: errors.OperationCompletedFalse,
132-
backoff: re.BackoffType,
133-
deleteSession: re.MustDeleteSession,
131+
statusCode: -1,
132+
operationStatus: errors.OperationNotFinished,
133+
backoff: re.BackoffType,
134+
deleteSession: re.MustDeleteSession,
134135
}
135136
default:
136137
return retryMode{
137-
statusCode: -1,
138-
operationCompleted: errors.OperationCompletedTrue, // it's finish, not need any retry attempts
139-
backoff: errors.BackoffTypeNoBackoff,
140-
deleteSession: false,
138+
statusCode: -1,
139+
operationStatus: errors.OperationFinished, // it's finish, not need any retry attempts
140+
backoff: errors.BackoffTypeNoBackoff,
141+
deleteSession: false,
141142
}
142143
}
143144
}
@@ -212,17 +213,17 @@ func max(a, b uint) uint {
212213

213214
// retryMode reports whether operation is able retried and with which properties.
214215
type retryMode struct {
215-
statusCode int32
216-
operationCompleted errors.OperationCompleted
217-
backoff errors.BackoffType
218-
deleteSession bool
216+
statusCode int32
217+
operationStatus errors.OperationStatus
218+
backoff errors.BackoffType
219+
deleteSession bool
219220
}
220221

221222
func (m retryMode) MustRetry(isOperationIdempotent bool) bool {
222-
switch m.operationCompleted {
223-
case errors.OperationCompletedTrue:
223+
switch m.operationStatus {
224+
case errors.OperationFinished:
224225
return false
225-
case errors.OperationCompletedUndefined:
226+
case errors.OperationStatusUndefined:
226227
return isOperationIdempotent
227228
default:
228229
return true

retry/retry_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ func TestRetryModes(t *testing.T) {
119119
}
120120
type Case struct {
121121
err error // given error
122-
backoff errors.BackoffType // no backoff (=== no operationCompleted), fast backoff, slow backoff
122+
backoff errors.BackoffType // no backoff (=== no operationStatus), fast backoff, slow backoff
123123
deleteSession bool // close session and delete from pool
124124
canRetry CanRetry
125125
}
126126
errs := []Case{
127127
{
128-
// retryer given unknown error - we will not operationCompleted and will close session
128+
// retryer given unknown error - we will not operationStatus and will close session
129129
err: fmt.Errorf("unknown error"),
130130
backoff: errors.BackoffTypeNoBackoff,
131131
deleteSession: false,

table/options/models.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package options
22

33
import (
4+
"bytes"
45
"time"
56

67
"github.com/ydb-platform/ydb-go-sdk/v3/internal/feature"
@@ -415,6 +416,24 @@ type KeyRange struct {
415416
To types.Value
416417
}
417418

419+
func (kr KeyRange) String() string {
420+
var buf bytes.Buffer
421+
buf.WriteString("[")
422+
if kr.From == nil {
423+
buf.WriteString("NULL")
424+
} else {
425+
buf.WriteString(kr.From.String())
426+
}
427+
buf.WriteString(",")
428+
if kr.To == nil {
429+
buf.WriteString("NULL")
430+
} else {
431+
buf.WriteString(kr.To.String())
432+
}
433+
buf.WriteString("]")
434+
return buf.String()
435+
}
436+
418437
// Deprecated: use TimeToLiveSettings instead.
419438
// Will be removed after Jan 2022.
420439
type TTLSettings struct {

test/scripting_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
2020
)
2121

22-
func TestScriptingService(t *testing.T) {
22+
func TestScripting(t *testing.T) {
2323
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
2424
defer cancel()
2525
var (
@@ -72,13 +72,13 @@ func TestScriptingService(t *testing.T) {
7272
}()
7373
if !res.NextResultSet(ctx) {
7474
return retry.RetryableError(
75-
"no result sets",
75+
fmt.Errorf("no result sets"),
7676
retry.WithBackoff(retry.BackoffTypeNoBackoff),
7777
)
7878
}
7979
if !res.NextRow() {
8080
return retry.RetryableError(
81-
"no rows",
81+
fmt.Errorf("no rows"),
8282
retry.WithBackoff(retry.BackoffTypeSlowBackoff),
8383
)
8484
}
@@ -109,14 +109,14 @@ func TestScriptingService(t *testing.T) {
109109
}()
110110
if !res.NextResultSet(ctx) {
111111
return retry.RetryableError(
112-
"no result sets",
112+
fmt.Errorf("no result sets"),
113113
retry.WithBackoff(retry.BackoffTypeNoBackoff),
114114
retry.WithDeleteSession(),
115115
)
116116
}
117117
if !res.NextRow() {
118118
return retry.RetryableError(
119-
"no rows",
119+
fmt.Errorf("no rows"),
120120
retry.WithBackoff(retry.BackoffTypeFastBackoff),
121121
)
122122
}

0 commit comments

Comments
 (0)