forked from quic-go/quic-go
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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user