Skip to content

Commit 428fa1c

Browse files
author
Michal Witkowski
committed
Fix a channel closing bug
1 parent af55d61 commit 428fa1c

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

proxy/handler.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ func (s *handler) handler(srv interface{}, serverStream grpc.ServerStream) error
7676
return err
7777
}
7878
s2cErrChan := s.forwardServerToClient(serverStream, clientStream)
79-
defer close(s2cErrChan)
8079
c2sErrChan := s.forwardClientToServer(clientStream, serverStream)
81-
defer close(c2sErrChan)
80+
// Explicitly *do not close* s2cErrChan and c2sErrChan, otherwise the select below will not terminate.
81+
// See https://groups.google.com/forum/#!msg/golang-nuts/pZwdYRGxCIk/qpbHxRRPJdUJ
82+
8283
// We don't know which side is going to stop sending first, so we need a select between the two.
8384
for i := 0; i < 2; i++ {
8485
select {

proxy/handler_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ func (s *ProxyHappySuite) TestPingEmptyCarriesClientMetadata() {
121121
require.Equal(s.T(), &pb.PingResponse{Value: pingDefaultValue, Counter: 42}, out)
122122
}
123123

124+
func (s *ProxyHappySuite) TestPingEmpty_StressTest() {
125+
for i := 0; i < 50; i++ {
126+
s.TestPingEmptyCarriesClientMetadata()
127+
}
128+
}
129+
124130
func (s *ProxyHappySuite) TestPingCarriesServerHeadersAndTrailers() {
125131
headerMd := make(metadata.MD)
126132
trailerMd := make(metadata.MD)
@@ -175,6 +181,12 @@ func (s *ProxyHappySuite) TestPingStream_FullDuplexWorks() {
175181
assert.Len(s.T(), trailerMd, 1, "PingList trailer headers user contain metadata")
176182
}
177183

184+
func (s *ProxyHappySuite) TestPingStream_StressTest() {
185+
for i := 0; i < 50; i++ {
186+
s.TestPingStream_FullDuplexWorks()
187+
}
188+
}
189+
178190
func (s *ProxyHappySuite) SetupSuite() {
179191
var err error
180192

@@ -224,7 +236,7 @@ func (s *ProxyHappySuite) SetupSuite() {
224236
s.testClient = pb.NewTestServiceClient(clientConn)
225237
}
226238

227-
func (s *ProxyHappySuite) TearDownSuite() {
239+
func (s *ProxyHappySuite) xTearDownSuite() {
228240
if s.proxy != nil {
229241
s.proxy.Stop()
230242
s.proxyListener.Close()

0 commit comments

Comments
 (0)