diff --git a/server.go b/server.go index 3fb1ca7a..54f0c487 100644 --- a/server.go +++ b/server.go @@ -149,7 +149,7 @@ func listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (*server, tlsConf: tlsConf, config: config, sessionHandler: sessionHandler, - sessionQueue: make(chan Session, 5), + sessionQueue: make(chan Session), errorChan: make(chan struct{}), newSession: newSession, logger: utils.DefaultLogger.WithPrefix("server"), @@ -164,7 +164,7 @@ func listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (*server, func (s *server) setup() error { s.sessionRunner = &runner{ - onHandshakeCompleteImpl: func(sess Session) { s.sessionQueue <- sess }, + onHandshakeCompleteImpl: func(sess Session) { go func() { s.sessionQueue <- sess }() }, retireConnectionIDImpl: s.sessionHandler.Retire, removeConnectionIDImpl: s.sessionHandler.Remove, } diff --git a/server_test.go b/server_test.go index ddbac18f..3dfef815 100644 --- a/server_test.go +++ b/server_test.go @@ -390,6 +390,38 @@ var _ = Describe("Server", func() { close(completeHandshake) Eventually(done).Should(BeClosed()) }) + + It("never blocks when calling the onHandshakeComplete callback", func() { + const num = 50 + + done := make(chan struct{}, num) + serv.newSession = func( + _ connection, + runner sessionRunner, + _ protocol.ConnectionID, + _ protocol.ConnectionID, + _ protocol.ConnectionID, + _ *Config, + _ *tls.Config, + _ *handshake.TransportParameters, + _ utils.Logger, + _ protocol.VersionNumber, + ) (quicSession, error) { + sess := NewMockQuicSession(mockCtrl) + runner.onHandshakeComplete(sess) + sess.EXPECT().run().Do(func() {}) + done <- struct{}{} + return sess, nil + } + + go func() { + for i := 0; i < num; i++ { + _, err := serv.createNewSession(&net.UDPAddr{}, nil, nil, nil, nil, protocol.VersionWhatever) + Expect(err).ToNot(HaveOccurred()) + } + }() + Eventually(done).Should(HaveLen(num)) + }) }) })