Merge pull request #2039 from lucas-clemente/fix-racy-accept-queue

fix race condition when determining the length of the accept queue
This commit is contained in:
Marten Seemann
2019-08-04 20:45:04 -04:00
committed by GitHub

View File

@@ -178,11 +178,11 @@ func (s *server) setup() error {
onHandshakeCompleteImpl: func(sess Session) {
go func() {
atomic.AddInt32(&s.sessionQueueLen, 1)
defer atomic.AddInt32(&s.sessionQueueLen, -1)
select {
case s.sessionQueue <- sess:
// blocks until the session is accepted
case <-sess.Context().Done():
atomic.AddInt32(&s.sessionQueueLen, -1)
// don't pass sessions that were already closed to Accept()
}
}()
@@ -289,6 +289,7 @@ func (s *server) Accept(ctx context.Context) (Session, error) {
case <-ctx.Done():
return nil, ctx.Err()
case sess = <-s.sessionQueue:
atomic.AddInt32(&s.sessionQueueLen, -1)
return sess, nil
case <-s.errorChan:
return nil, s.serverError