in server.go [141:171]
func (s *server) stop() {
select {
case <-s.done:
return
default:
s.Once.Do(func() {
close(s.done)
s.lock.Lock()
if s.server != nil {
ctx, cancel := context.WithTimeout(context.Background(), serverFastFailTimeout)
if err := s.server.Shutdown(ctx); err != nil {
// if the log output is "shutdown ctx: context deadline exceeded", it means that
// there are still some active connections.
log.Errorf("server shutdown ctx:%s error:%v", ctx, err)
}
cancel()
}
s.server = nil
s.lock.Unlock()
if s.streamListener != nil {
// let the server exit asap when got error from RunEventLoop.
s.streamListener.Close()
s.streamListener = nil
}
if s.pktListener != nil {
s.pktListener.Close()
s.pktListener = nil
}
})
}
}