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) { onHandshakeCompleteImpl: func(sess Session) {
go func() { go func() {
atomic.AddInt32(&s.sessionQueueLen, 1) atomic.AddInt32(&s.sessionQueueLen, 1)
defer atomic.AddInt32(&s.sessionQueueLen, -1)
select { select {
case s.sessionQueue <- sess: case s.sessionQueue <- sess:
// blocks until the session is accepted // blocks until the session is accepted
case <-sess.Context().Done(): case <-sess.Context().Done():
atomic.AddInt32(&s.sessionQueueLen, -1)
// don't pass sessions that were already closed to Accept() // 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(): case <-ctx.Done():
return nil, ctx.Err() return nil, ctx.Err()
case sess = <-s.sessionQueue: case sess = <-s.sessionQueue:
atomic.AddInt32(&s.sessionQueueLen, -1)
return sess, nil return sess, nil
case <-s.errorChan: case <-s.errorChan:
return nil, s.serverError return nil, s.serverError