@@ -26,8 +26,52 @@ import (
26
26
"go.etcd.io/etcd/integration"
27
27
"go.etcd.io/etcd/pkg/testutil"
28
28
"google.golang.org/grpc"
29
+ "google.golang.org/grpc/codes"
30
+ "google.golang.org/grpc/status"
29
31
)
30
32
33
+ func TestServerGRPCKeepAliveTimeout (t * testing.T ) {
34
+ defer testutil .AfterTest (t )
35
+
36
+ clus := integration .NewClusterV3 (t , & integration.ClusterConfig {
37
+ Size : 2 ,
38
+ GRPCKeepAliveInterval : time .Second ,
39
+ GRPCKeepAliveTimeout : time .Second ,
40
+ })
41
+ defer clus .Terminate (t )
42
+
43
+ eps := []string {clus .Members [0 ].GRPCAddr ()}
44
+
45
+ ccfg := clientv3.Config {
46
+ Endpoints : []string {eps [0 ]},
47
+ }
48
+
49
+ cli , err := clientv3 .New (ccfg )
50
+ if err != nil {
51
+ t .Fatal (err )
52
+ }
53
+ defer cli .Close ()
54
+
55
+ if _ , err = clus .Client (1 ).Put (context .TODO (), "foo" , "bar" ); err != nil {
56
+ t .Fatal (err )
57
+ }
58
+ clus .Members [1 ].Blackhole ()
59
+ time .Sleep (10 * time .Second )
60
+ // remove blackhole but connection should be unavailable now
61
+ clus .Members [1 ].Unblackhole ()
62
+ if _ , err = clus .Client (1 ).Put (context .TODO (), "foo1" , "bar1" ); err != nil {
63
+ ev , ok := status .FromError (err )
64
+ if ! ok {
65
+ t .Fatal (err )
66
+ }
67
+ if ev .Code () != codes .Unavailable {
68
+ t .Fatal (err )
69
+ }
70
+ } else {
71
+ t .Error ("rpc error expected" )
72
+ }
73
+ }
74
+
31
75
// TestBalancerUnderBlackholeKeepAliveWatch tests when watch discovers it cannot talk to
32
76
// blackholed endpoint, client balancer switches to healthy one.
33
77
// TODO: test server-to-client keepalive ping
0 commit comments