test: fix flake in GoAwayThenClose (#3052)

In the event of a race, the first server may not be fully serving before the
client attempt to connect, then the second server may attempt to field the
FullDuplexCall, which it does not implement.

Fix the race by giving the client only the first server's address until after
the FullDuplexCall is started.
This commit is contained in:
Doug Fawley
2019-09-27 13:42:15 -07:00
committed by GitHub
parent e351044388
commit e75b8f4830

View File

@ -7113,7 +7113,7 @@ func (s) TestGoAwayThenClose(t *testing.T) {
} }
s1 := grpc.NewServer() s1 := grpc.NewServer()
defer s1.Stop() defer s1.Stop()
ts1 := &funcServer{ ts := &funcServer{
unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
return &testpb.SimpleResponse{}, nil return &testpb.SimpleResponse{}, nil
}, },
@ -7126,7 +7126,7 @@ func (s) TestGoAwayThenClose(t *testing.T) {
return err return err
}, },
} }
testpb.RegisterTestServiceServer(s1, ts1) testpb.RegisterTestServiceServer(s1, ts)
go s1.Serve(lis1) go s1.Serve(lis1)
conn2Established := grpcsync.NewEvent() conn2Established := grpcsync.NewEvent()
@ -7136,17 +7136,13 @@ func (s) TestGoAwayThenClose(t *testing.T) {
} }
s2 := grpc.NewServer() s2 := grpc.NewServer()
defer s2.Stop() defer s2.Stop()
ts2 := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { testpb.RegisterTestServiceServer(s2, ts)
return &testpb.SimpleResponse{}, nil
}}
testpb.RegisterTestServiceServer(s2, ts2)
go s2.Serve(lis2) go s2.Serve(lis2)
r, rcleanup := manual.GenerateAndRegisterManualResolver() r, rcleanup := manual.GenerateAndRegisterManualResolver()
defer rcleanup() defer rcleanup()
r.InitialState(resolver.State{Addresses: []resolver.Address{ r.InitialState(resolver.State{Addresses: []resolver.Address{
{Addr: lis1.Addr().String()}, {Addr: lis1.Addr().String()},
{Addr: lis2.Addr().String()},
}}) }})
cc, err := grpc.DialContext(ctx, r.Scheme()+":///", grpc.WithInsecure()) cc, err := grpc.DialContext(ctx, r.Scheme()+":///", grpc.WithInsecure())
if err != nil { if err != nil {
@ -7163,6 +7159,11 @@ func (s) TestGoAwayThenClose(t *testing.T) {
t.Fatalf("FullDuplexCall(_) = _, %v; want _, nil", err) t.Fatalf("FullDuplexCall(_) = _, %v; want _, nil", err)
} }
r.UpdateState(resolver.State{Addresses: []resolver.Address{
{Addr: lis1.Addr().String()},
{Addr: lis2.Addr().String()},
}})
// Send GO_AWAY to connection 1. // Send GO_AWAY to connection 1.
go s1.GracefulStop() go s1.GracefulStop()