Handle wrapped grpc error in funcutil.IsGrpcError (#17547)

Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
pull/17552/head
congqixia 2022-06-14 17:10:10 +08:00 committed by GitHub
parent ab9b186f15
commit ed3a1164dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 21 deletions

View File

@ -357,9 +357,14 @@ func ReadBinary(endian binary.ByteOrder, bs []byte, receiver interface{}) error
// IsGrpcErr checks whether err is instance of grpc status error.
func IsGrpcErr(err error) bool {
if err == nil {
return false
for {
if err == nil {
return false
}
_, ok := grpcStatus.FromError(err)
if ok {
return true
}
err = errors.Unwrap(err)
}
_, ok := grpcStatus.FromError(err)
return ok
}

View File

@ -467,26 +467,37 @@ func Test_ReadBinary(t *testing.T) {
}
func TestIsGrpcErr(t *testing.T) {
var err1 error
assert.False(t, IsGrpcErr(err1))
t.Run("nil error", func(t *testing.T) {
var err error
assert.False(t, IsGrpcErr(err))
})
err1 = errors.New("error")
assert.False(t, IsGrpcErr(err1))
t.Run("normal errors new", func(t *testing.T) {
err := errors.New("error")
assert.False(t, IsGrpcErr(err))
})
bgCtx := context.Background()
ctx1, cancel1 := context.WithCancel(bgCtx)
cancel1()
assert.False(t, IsGrpcErr(ctx1.Err()))
t.Run("context cancel", func(t *testing.T) {
assert.False(t, IsGrpcErr(context.Canceled))
})
timeout := 20 * time.Millisecond
ctx1, cancel1 = context.WithTimeout(bgCtx, timeout)
time.Sleep(timeout * 2)
assert.False(t, IsGrpcErr(ctx1.Err()))
cancel1()
t.Run("context timeout", func(t *testing.T) {
assert.False(t, IsGrpcErr(context.DeadlineExceeded))
})
err1 = grpcStatus.Error(grpcCodes.Canceled, "test")
assert.True(t, IsGrpcErr(err1))
t.Run("grpc canceled", func(t *testing.T) {
err := grpcStatus.Error(grpcCodes.Canceled, "test")
assert.True(t, IsGrpcErr(err))
})
err1 = grpcStatus.Error(grpcCodes.Unavailable, "test")
assert.True(t, IsGrpcErr(err1))
t.Run("grpc unavailable", func(t *testing.T) {
err := grpcStatus.Error(grpcCodes.Unavailable, "test")
assert.True(t, IsGrpcErr(err))
})
t.Run("wrapped grpc error", func(t *testing.T) {
err := grpcStatus.Error(grpcCodes.Unavailable, "test")
errWrap := fmt.Errorf("wrap grpc error %w", err)
assert.True(t, IsGrpcErr(errWrap))
})
}