mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-20 02:57:05 +00:00
Graceful shutdown on error for httpd, smtpd, pop3d
This commit is contained in:
@@ -47,16 +47,20 @@ func (s *Server) Start() {
|
||||
cfg.IP4address, cfg.IP4port))
|
||||
if err != nil {
|
||||
log.Errorf("POP3 Failed to build tcp4 address: %v", err)
|
||||
// TODO More graceful early-shutdown procedure
|
||||
panic(err)
|
||||
// serve() never called, so we do local shutdown here
|
||||
close(s.localShutdown)
|
||||
s.emergencyShutdown()
|
||||
return
|
||||
}
|
||||
|
||||
log.Infof("POP3 listening on TCP4 %v", addr)
|
||||
s.listener, err = net.ListenTCP("tcp4", addr)
|
||||
if err != nil {
|
||||
log.Errorf("POP3 failed to start tcp4 listener: %v", err)
|
||||
// TODO More graceful early-shutdown procedure
|
||||
panic(err)
|
||||
// serve() never called, so we do local shutdown here
|
||||
close(s.localShutdown)
|
||||
s.emergencyShutdown()
|
||||
return
|
||||
}
|
||||
|
||||
// Listener go routine
|
||||
@@ -100,9 +104,9 @@ func (s *Server) serve() {
|
||||
close(s.localShutdown)
|
||||
return
|
||||
default:
|
||||
// TODO Implement a max error counter before shutdown?
|
||||
// or maybe attempt to restart smtpd
|
||||
panic(err)
|
||||
close(s.localShutdown)
|
||||
s.emergencyShutdown()
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -113,6 +117,15 @@ func (s *Server) serve() {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) emergencyShutdown() {
|
||||
// Shutdown Inbucket
|
||||
select {
|
||||
case _ = <-s.globalShutdown:
|
||||
default:
|
||||
close(s.globalShutdown)
|
||||
}
|
||||
}
|
||||
|
||||
// Drain causes the caller to block until all active POP3 sessions have finished
|
||||
func (s *Server) Drain() {
|
||||
// Wait for listener to exit
|
||||
|
||||
Reference in New Issue
Block a user