[TrueCloudLab#16] pool: Don't count grpc canceled error #17

Merged
KirillovDenis merged 2 commits from KirillovDenis/feature/16-dont_count_context_canceled_as_error into master 2023-03-10 06:58:34 +00:00
2 changed files with 18 additions and 6 deletions

View file

@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-20.04
strategy:
matrix:
go_versions: [ '1.17.x', '1.18.x', '1.19.x' ]
go_versions: [ '1.18.x', '1.19.x', '1.20.x' ]
fail-fast: false
steps:
- uses: actions/checkout@v3

View file

@ -32,6 +32,8 @@ import (
"go.uber.org/atomic"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// client represents virtual connection to the single FrostFS network endpoint from which Pool is formed.
@ -995,11 +997,7 @@ func (c *clientWrapper) incRequests(elapsed time.Duration, method MethodIndex) {
func (c *clientStatusMonitor) handleError(st apistatus.Status, err error) error {
if err != nil {
// non-status logic error that could be returned
// from the SDK client; should not be considered
// as a connection error
var siErr *object.SplitInfoError
if !errors.As(err, &siErr) {
if needCountError(err) {
c.incErrorRate()
}
@ -1018,6 +1016,20 @@ func (c *clientStatusMonitor) handleError(st apistatus.Status, err error) error
return err
}
func needCountError(err error) bool {
// non-status logic error that could be returned
// from the SDK client; should not be considered
// as a connection error
var siErr *object.SplitInfoError
if errors.As(err, &siErr) {
return false
}
// we can't use errors.Is(err, context.Canceled)
// https://github.com/grpc/grpc-go/issues/4375
return status.Code(err) != codes.Canceled
}
// clientBuilder is a type alias of client constructors which open connection
// to the given endpoint.
type clientBuilder = func(endpoint string) client