From f48fe8ecda44f14b8f6f7e7b96d83de83dad6eff Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 6 Nov 2017 15:42:38 -0800 Subject: [PATCH] api/v3rpc: do not convert server context error to grpc/*status.statusError Signed-off-by: Gyu-Ho Lee --- etcdserver/api/v3rpc/util.go | 7 +++++ etcdserver/api/v3rpc/util_test.go | 50 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 etcdserver/api/v3rpc/util_test.go diff --git a/etcdserver/api/v3rpc/util.go b/etcdserver/api/v3rpc/util.go index 29e59d1c6..71a549b05 100644 --- a/etcdserver/api/v3rpc/util.go +++ b/etcdserver/api/v3rpc/util.go @@ -15,12 +15,15 @@ package v3rpc import ( + "context" + "github.com/coreos/etcd/auth" "github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" "github.com/coreos/etcd/etcdserver/membership" "github.com/coreos/etcd/lease" "github.com/coreos/etcd/mvcc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -68,6 +71,10 @@ var toGRPCErrorMap = map[error]error{ } func togRPCError(err error) error { + // let gRPC server convert to codes.Canceled, codes.DeadlineExceeded + if err == context.Canceled || err == context.DeadlineExceeded { + return err + } grpcErr, ok := toGRPCErrorMap[err] if !ok { return status.Error(codes.Unknown, err.Error()) diff --git a/etcdserver/api/v3rpc/util_test.go b/etcdserver/api/v3rpc/util_test.go new file mode 100644 index 000000000..8890b1d4f --- /dev/null +++ b/etcdserver/api/v3rpc/util_test.go @@ -0,0 +1,50 @@ +// Copyright 2017 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v3rpc + +import ( + "context" + "errors" + "testing" + + "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" + "github.com/coreos/etcd/mvcc" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestGRPCError(t *testing.T) { + tt := []struct { + err error + exp error + }{ + {err: mvcc.ErrCompacted, exp: rpctypes.ErrGRPCCompacted}, + {err: mvcc.ErrFutureRev, exp: rpctypes.ErrGRPCFutureRev}, + {err: context.Canceled, exp: context.Canceled}, + {err: context.DeadlineExceeded, exp: context.DeadlineExceeded}, + {err: errors.New("foo"), exp: status.Error(codes.Unknown, "foo")}, + } + for i := range tt { + if err := togRPCError(tt[i].err); err != tt[i].exp { + if _, ok := status.FromError(err); ok { + if err.Error() == tt[i].exp.Error() { + continue + } + } + t.Errorf("#%d: got %v, expected %v", i, err, tt[i].exp) + } + } +}