Merge pull request #9120 from spzala/statusfromerror

StatusFromError: handle return value of the function
This commit is contained in:
Xiang Li 2018-01-09 13:00:23 -08:00 committed by GitHub
commit bcc5ea6a27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 25 additions and 22 deletions

View File

@ -537,18 +537,19 @@ func toErr(ctx context.Context, err error) error {
if _, ok := err.(rpctypes.EtcdError); ok {
return err
}
ev, _ := status.FromError(err)
code := ev.Code()
switch code {
case codes.DeadlineExceeded:
fallthrough
case codes.Canceled:
if ctx.Err() != nil {
err = ctx.Err()
if ev, ok := status.FromError(err); ok {
code := ev.Code()
switch code {
case codes.DeadlineExceeded:
fallthrough
case codes.Canceled:
if ctx.Err() != nil {
err = ctx.Err()
}
case codes.Unavailable:
case codes.FailedPrecondition:
err = grpc.ErrClientConnClosing
}
case codes.Unavailable:
case codes.FailedPrecondition:
err = grpc.ErrClientConnClosing
}
return err
}

View File

@ -361,7 +361,10 @@ func isServerCtxTimeout(err error) bool {
if err == nil {
return false
}
ev, _ := status.FromError(err)
ev, ok := status.FromError(err)
if !ok {
return false
}
code := ev.Code()
return code == codes.DeadlineExceeded && strings.Contains(err.Error(), "context deadline exceeded")
}

View File

@ -285,7 +285,7 @@ func (lkv *leasingKV) acquire(ctx context.Context, key string, op v3.Op) (*v3.Tx
if _, ok := err.(rpctypes.EtcdError); ok {
return nil, err
}
if ev, _ := status.FromError(err); ev.Code() != codes.Unavailable {
if ev, ok := status.FromError(err); ok && ev.Code() != codes.Unavailable {
return nil, err
}
}

View File

@ -52,7 +52,10 @@ func isRepeatableStopError(err error) bool {
return true
}
// only retry if unavailable
ev, _ := status.FromError(err)
ev, ok := status.FromError(err)
if !ok {
return false
}
return ev.Code() != codes.Unavailable
}
@ -68,8 +71,7 @@ func isRepeatableStopError(err error) bool {
// Returning "true" means retry should stop, otherwise it violates
// write-at-most-once semantics.
func isNonRepeatableStopError(err error) bool {
ev, _ := status.FromError(err)
if ev.Code() != codes.Unavailable {
if ev, ok := status.FromError(err); ok && ev.Code() != codes.Unavailable {
return true
}
desc := rpctypes.ErrorDesc(err)

View File

@ -29,16 +29,14 @@ func TestConvert(t *testing.T) {
if e1.Error() != e2.Error() {
t.Fatalf("expected %q == %q", e1.Error(), e2.Error())
}
ev1, _ := status.FromError(e1)
if ev1.Code() != e3.(EtcdError).Code() {
if ev1, ok := status.FromError(e1); ok && ev1.Code() != e3.(EtcdError).Code() {
t.Fatalf("expected them to be equal, got %v / %v", ev1.Code(), e3.(EtcdError).Code())
}
if e1.Error() == e3.Error() {
t.Fatalf("expected %q != %q", e1.Error(), e3.Error())
}
ev2, _ := status.FromError(e2)
if ev2.Code() != e3.(EtcdError).Code() {
if ev2, ok := status.FromError(e2); ok && ev2.Code() != e3.(EtcdError).Code() {
t.Fatalf("expected them to be equal, got %v / %v", ev2.Code(), e3.(EtcdError).Code())
}
}

View File

@ -68,8 +68,7 @@ func runLeaseRenewerFunc(cmd *cobra.Command, args []string) {
for {
lk, err = c.Lease.KeepAliveOnce(ctx, l.ID)
ev, _ := status.FromError(err)
if ev.Code() == codes.NotFound {
if ev, ok := status.FromError(err); ok && ev.Code() == codes.NotFound {
if time.Since(expire) < 0 {
log.Fatalf("bad renew! exceeded: %v", time.Since(expire))
for {