add reload of main listener on SIGHUP

This commit is contained in:
dre 2021-07-08 19:31:05 +08:00
parent 6b1d0ff5c2
commit 88697cf2ae
2 changed files with 37 additions and 31 deletions

View file

@ -11,8 +11,11 @@ import (
"log" "log"
"net" "net"
"net/url" "net/url"
"os"
"os/signal"
"path" "path"
"strings" "strings"
"syscall"
"time" "time"
"unicode/utf8" "unicode/utf8"
) )
@ -113,39 +116,51 @@ func (s *Server) logf(format string, v ...interface{}) {
} }
func (s *Server) ListenAndServe() error { func (s *Server) ListenAndServe() error {
s.closed = make(chan struct{}) hup := make(chan os.Signal, 1)
signal.Notify(hup, syscall.SIGHUP)
go func() {
for {
<-hup
if s.listener != nil {
// TODO: reload TLSConfig
s.listener.Close()
}
}
}()
// outer for loop, if listener closes we will restart it. This may be useful if we switch out // outer for loop, if listener closes we will restart it. This may be useful if we switch out
// TLSConfig. // TLSConfig.
//for {
var err error
s.listener, err = tls.Listen("tcp", s.Addr, s.TLSConfig)
if err != nil {
return fmt.Errorf("gemini server listen: %w", err)
}
queue := make(chan net.Conn, s.MaxOpenConns)
go s.handleConnectionQueue(queue)
for { for {
conn, err := s.listener.Accept() s.closed = make(chan struct{})
var err error
s.listener, err = tls.Listen("tcp", s.Addr, s.TLSConfig)
if err != nil { if err != nil {
s.logf("server accept error: %v", err) return fmt.Errorf("gemini server listen: %w", err)
break
} }
queue <- conn
// un-stuck call after shutdown will trigger a drop here queue := make(chan net.Conn, s.MaxOpenConns)
go s.handleConnectionQueue(queue)
s.logf("Accepting new connections on %v", s.listener.Addr())
for {
conn, err := s.listener.Accept()
if err != nil {
s.logf("server accept error: %v", err)
break
}
queue <- conn
// un-stuck call after shutdown will trigger a drop here
if s.shutdown {
break
}
}
// closed confirms the accept call stopped
close(s.closed)
if s.shutdown { if s.shutdown {
break break
} }
} }
// closed confirms the accept call stopped
close(s.closed)
//if s.shutdown {
// return nil
//}
//}
s.log("closing listener gracefully") s.log("closing listener gracefully")
return s.listener.Close() return s.listener.Close()
} }

View file

@ -134,15 +134,6 @@ func main() {
<-confirm <-confirm
cancel() cancel()
/*
hup := make(chan os.Signal, 1)
signal.Notify(hup, syscall.SIGHUP)
go func() {
for {
<-hup
}
}()
*/
} }
func logger(log *log.Logger) func(next gemini.Handler) gemini.Handler { func logger(log *log.Logger) func(next gemini.Handler) gemini.Handler {