1
0
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:
James Hillyerd
2016-02-29 20:21:49 -08:00
parent 4b4121bb3a
commit 28adcf0437
4 changed files with 59 additions and 23 deletions

View File

@@ -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