mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
StatusFromError: handle return value of the function
status.FromError can return nil, false. We are handling the return values most places in code but some places we aren't. Fixing it herewith. Fixes #9117
This commit is contained in:
parent
44e1f6f019
commit
3b7e2ce0ca
@ -537,7 +537,7 @@ func toErr(ctx context.Context, err error) error {
|
|||||||
if _, ok := err.(rpctypes.EtcdError); ok {
|
if _, ok := err.(rpctypes.EtcdError); ok {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ev, _ := status.FromError(err)
|
if ev, ok := status.FromError(err); ok {
|
||||||
code := ev.Code()
|
code := ev.Code()
|
||||||
switch code {
|
switch code {
|
||||||
case codes.DeadlineExceeded:
|
case codes.DeadlineExceeded:
|
||||||
@ -550,6 +550,7 @@ func toErr(ctx context.Context, err error) error {
|
|||||||
case codes.FailedPrecondition:
|
case codes.FailedPrecondition:
|
||||||
err = grpc.ErrClientConnClosing
|
err = grpc.ErrClientConnClosing
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,7 +361,10 @@ func isServerCtxTimeout(err error) bool {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
ev, _ := status.FromError(err)
|
ev, ok := status.FromError(err)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
code := ev.Code()
|
code := ev.Code()
|
||||||
return code == codes.DeadlineExceeded && strings.Contains(err.Error(), "context deadline exceeded")
|
return code == codes.DeadlineExceeded && strings.Contains(err.Error(), "context deadline exceeded")
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ func (lkv *leasingKV) acquire(ctx context.Context, key string, op v3.Op) (*v3.Tx
|
|||||||
if _, ok := err.(rpctypes.EtcdError); ok {
|
if _, ok := err.(rpctypes.EtcdError); ok {
|
||||||
return nil, err
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,10 @@ func isRepeatableStopError(err error) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// only retry if unavailable
|
// only retry if unavailable
|
||||||
ev, _ := status.FromError(err)
|
ev, ok := status.FromError(err)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return ev.Code() != codes.Unavailable
|
return ev.Code() != codes.Unavailable
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,8 +71,7 @@ func isRepeatableStopError(err error) bool {
|
|||||||
// Returning "true" means retry should stop, otherwise it violates
|
// Returning "true" means retry should stop, otherwise it violates
|
||||||
// write-at-most-once semantics.
|
// write-at-most-once semantics.
|
||||||
func isNonRepeatableStopError(err error) bool {
|
func isNonRepeatableStopError(err error) bool {
|
||||||
ev, _ := status.FromError(err)
|
if ev, ok := status.FromError(err); ok && ev.Code() != codes.Unavailable {
|
||||||
if ev.Code() != codes.Unavailable {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
desc := rpctypes.ErrorDesc(err)
|
desc := rpctypes.ErrorDesc(err)
|
||||||
|
@ -29,16 +29,14 @@ func TestConvert(t *testing.T) {
|
|||||||
if e1.Error() != e2.Error() {
|
if e1.Error() != e2.Error() {
|
||||||
t.Fatalf("expected %q == %q", e1.Error(), e2.Error())
|
t.Fatalf("expected %q == %q", e1.Error(), e2.Error())
|
||||||
}
|
}
|
||||||
ev1, _ := status.FromError(e1)
|
if ev1, ok := status.FromError(e1); ok && ev1.Code() != e3.(EtcdError).Code() {
|
||||||
if ev1.Code() != e3.(EtcdError).Code() {
|
|
||||||
t.Fatalf("expected them to be equal, got %v / %v", 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() {
|
if e1.Error() == e3.Error() {
|
||||||
t.Fatalf("expected %q != %q", e1.Error(), e3.Error())
|
t.Fatalf("expected %q != %q", e1.Error(), e3.Error())
|
||||||
}
|
}
|
||||||
ev2, _ := status.FromError(e2)
|
if ev2, ok := status.FromError(e2); ok && ev2.Code() != e3.(EtcdError).Code() {
|
||||||
if ev2.Code() != e3.(EtcdError).Code() {
|
|
||||||
t.Fatalf("expected them to be equal, got %v / %v", ev2.Code(), e3.(EtcdError).Code())
|
t.Fatalf("expected them to be equal, got %v / %v", ev2.Code(), e3.(EtcdError).Code())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,8 +68,7 @@ func runLeaseRenewerFunc(cmd *cobra.Command, args []string) {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
lk, err = c.Lease.KeepAliveOnce(ctx, l.ID)
|
lk, err = c.Lease.KeepAliveOnce(ctx, l.ID)
|
||||||
ev, _ := status.FromError(err)
|
if ev, ok := status.FromError(err); ok && ev.Code() == codes.NotFound {
|
||||||
if ev.Code() == codes.NotFound {
|
|
||||||
if time.Since(expire) < 0 {
|
if time.Since(expire) < 0 {
|
||||||
log.Fatalf("bad renew! exceeded: %v", time.Since(expire))
|
log.Fatalf("bad renew! exceeded: %v", time.Since(expire))
|
||||||
for {
|
for {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user