Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit bbf0ce5

Browse files
committedAug 5, 2019
backports form etcd-io#9860
Signed-off-by: Sam Batschelet <[email protected]>
1 parent 0840ffa commit bbf0ce5

File tree

3 files changed

+56
-12
lines changed

3 files changed

+56
-12
lines changed
 

‎clientv3/integration/kv_test.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ func TestKVGetRetry(t *testing.T) {
708708

709709
time.Sleep(100 * time.Millisecond)
710710
clus.Members[fIdx].Restart(t)
711+
clus.Members[fIdx].WaitOK(t)
711712

712713
select {
713714
case <-time.After(5 * time.Second):
@@ -792,7 +793,7 @@ func TestKVGetStoppedServerAndClose(t *testing.T) {
792793
// this Get fails and triggers an asynchronous connection retry
793794
_, err := cli.Get(ctx, "abc")
794795
cancel()
795-
if err != nil && err != context.DeadlineExceeded {
796+
if err != nil && !isServerUnavailable(err) {
796797
t.Fatal(err)
797798
}
798799
}
@@ -814,14 +815,14 @@ func TestKVPutStoppedServerAndClose(t *testing.T) {
814815
// grpc finds out the original connection is down due to the member shutdown.
815816
_, err := cli.Get(ctx, "abc")
816817
cancel()
817-
if err != nil && err != context.DeadlineExceeded {
818+
if err != nil && err !isServerUnavailable(err) {
818819
t.Fatal(err)
819820
}
820821

821822
// this Put fails and triggers an asynchronous connection retry
822823
_, err = cli.Put(ctx, "abc", "123")
823824
cancel()
824-
if err != nil && err != context.DeadlineExceeded {
825+
if err != nil && !isServerUnavailable(err) {
825826
t.Fatal(err)
826827
}
827828
}
@@ -906,7 +907,7 @@ func TestKVLargeRequests(t *testing.T) {
906907
maxCallSendBytesClient: 10 * 1024 * 1024,
907908
maxCallRecvBytesClient: 0,
908909
valueSize: 10 * 1024 * 1024,
909-
expectError: grpc.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max "),
910+
expectError: grpc.Errorf(codes.ResourceExhausted, "trying to send message larger than max "),
910911
},
911912
{
912913
maxRequestBytesServer: 10 * 1024 * 1024,
@@ -920,7 +921,7 @@ func TestKVLargeRequests(t *testing.T) {
920921
maxCallSendBytesClient: 10 * 1024 * 1024,
921922
maxCallRecvBytesClient: 0,
922923
valueSize: 10*1024*1024 + 5,
923-
expectError: grpc.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max "),
924+
expectError: grpc.Errorf(codes.ResourceExhausted, "trying to send message larger than max "),
924925
},
925926
}
926927
for i, test := range tests {
@@ -940,7 +941,7 @@ func TestKVLargeRequests(t *testing.T) {
940941
t.Errorf("#%d: expected %v, got %v", i, test.expectError, err)
941942
}
942943
} else if err != nil && !strings.HasPrefix(err.Error(), test.expectError.Error()) {
943-
t.Errorf("#%d: expected %v, got %v", i, test.expectError, err)
944+
t.Errorf("#%d: expected error starting with '%s', got '%s'", i, test.expectError.Error(), err.Error())
944945
}
945946

946947
// put request went through, now expects large response back

‎clientv3/integration/server_shutdown_test.go

+45-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func TestBalancerUnderServerShutdownWatch(t *testing.T) {
104104
if err == nil {
105105
break
106106
}
107-
if err == context.DeadlineExceeded || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout || err == rpctypes.ErrTimeoutDueToLeaderFail {
107+
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout || err == rpctypes.ErrTimeoutDueToLeaderFail {
108108
continue
109109
}
110110
t.Fatal(err)
@@ -365,3 +365,47 @@ func isServerCtxTimeout(err error) bool {
365365
code := ev.Code()
366366
return code == codes.DeadlineExceeded && strings.Contains(err.Error(), "context deadline exceeded")
367367
}
368+
369+
// In grpc v1.11.3+ dial timeouts can error out with transport.ErrConnClosing. Previously dial timeouts
370+
// would always error out with context.DeadlineExceeded.
371+
func isClientTimeout(err error) bool {
372+
if err == nil {
373+
return false
374+
}
375+
if err == context.DeadlineExceeded {
376+
return true
377+
}
378+
ev, ok := status.FromError(err)
379+
if !ok {
380+
return false
381+
}
382+
code := ev.Code()
383+
return code == codes.DeadlineExceeded
384+
}
385+
386+
func isServerUnavailable(err error) bool {
387+
if err == nil {
388+
return false
389+
}
390+
ev, ok := status.FromError(err)
391+
if !ok {
392+
return false
393+
}
394+
code := ev.Code()
395+
return code == codes.Unavailable
396+
}
397+
398+
func isCanceled(err error) bool {
399+
if err == nil {
400+
return false
401+
}
402+
if err == context.Canceled {
403+
return true
404+
}
405+
ev, ok := status.FromError(err)
406+
if !ok {
407+
return false
408+
}
409+
code := ev.Code()
410+
return code == codes.Canceled
411+
}

‎clientv3/integration/watch_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
mvccpb "github.com/coreos/etcd/mvcc/mvccpb"
3131
"github.com/coreos/etcd/pkg/testutil"
3232

33-
"google.golang.org/grpc"
3433
"google.golang.org/grpc/metadata"
3534
)
3635

@@ -667,8 +666,8 @@ func TestWatchErrConnClosed(t *testing.T) {
667666
go func() {
668667
defer close(donec)
669668
ch := cli.Watch(context.TODO(), "foo")
670-
if wr := <-ch; grpc.ErrorDesc(wr.Err()) != grpc.ErrClientConnClosing.Error() {
671-
t.Fatalf("expected %v, got %v", grpc.ErrClientConnClosing, grpc.ErrorDesc(wr.Err()))
669+
if wr := <-ch; !isCanceled(wr.Err()) {
670+
t.Fatalf("expected context canceled, got %v", wr.Err())
672671
}
673672
}()
674673

@@ -699,8 +698,8 @@ func TestWatchAfterClose(t *testing.T) {
699698
donec := make(chan struct{})
700699
go func() {
701700
cli.Watch(context.TODO(), "foo")
702-
if err := cli.Close(); err != nil && err != grpc.ErrClientConnClosing {
703-
t.Fatalf("expected %v, got %v", grpc.ErrClientConnClosing, err)
701+
if err := cli.Close(); err != nil && err != context.Canceled {
702+
t.Fatalf("expected %v, got %v", context.Canceled, err)
704703
}
705704
close(donec)
706705
}()

0 commit comments

Comments
 (0)
Please sign in to comment.